new takyam();

Qiitaぽい話はQiitaに書いていくことにする気がする http://qiita.com/takyam

FuelPHPでphpQueryを使う

phpQueryというjQueryライクな、PHPのDOMパーサライブラリがあります。
これをFuelPHPから使いたかったのですが、
FuelPHPは1.6からデフォルトでComposerに対応しているので、
どうせならComposerから入れてみようと思ったのですが若干ハマりました。

phpQuery
http://code.google.com/p/phpquery/

というのも、phpQueryはcomposer.jsonは持っておらず、
composer.jsonのrequireに php-query/phpQuery って書けばいいってもんじゃないから。

というわけで、composer.json と格闘してみました。

その前に

この後いろいろサンプル書きますが、require には、常に以下のように指定しています。

"require": {
    "phpquery/phpQuery": "*"
}

PEARでいれてみる

composer.json の repositories 項目にもにょもにょする事で、
packagist以外にも対応するらしいです。

repositories (root-only)
http://getcomposer.org/doc/04-schema.md#repositories

Custom package repositories to use.

By default composer just uses the packagist repository. By specifying repositories you can get packages from elsewhere.

で、このrepositories ですが、PEARに対応しています。

PEAR
http://getcomposer.org/doc/05-repositories.md#pear

phpQueryはpearも用意されてるので、なんだ楽勝じゃんと思い、普通に指定してみました。

"repositories": [
    {
        "type": "pear",
        "url": "http://phpquery-pear.appspot.com/",
        "vendor-alias": "phpquery"
    }
]

phpQueryのドキュメントに書いてあるのをそのまま書いたような感じです。

PEAR installation

pear channel-discover phpquery-pear.appspot.com
pear install phpquery/phpQuery

vendor-aliasを指定しないと、requireのところで、
pear-phpquery-pear.appspot.comのように指定しなきゃいけないらしいです。
詳しくはComposerのドキュメントを参考にしてください。

Without a vendor alias, Composer will use the PEAR channel name as the vendor portion of the package name: pear-pear.foobar.repo/BasePackage

で、これでやってみたところ、

  • Installing pear-phpquery-pear.appspot.com/phpquery (0.9.5.386)
    Downloading: connection...

[Composer\Downloader\TransportException]
The "http://phpquery-pear.appspot.com/get/phpQuery-0.9.5.386.tgz" file could not be downloaded (HTTP/1.0 404 Not Found)

ってエラーが出てだめだった。phpQueryのPEARのチャンネルには接続できてるみたいなので、何か認証に条件でもあるのかもしれないね。

だめなので次。

SVNからやってみる

repositories は VCS (version-control-system) にも対応しています。
なので、レポジトリから入れちゃいましょう。

VCS
http://getcomposer.org/doc/05-repositories.md#vcs

を参考にしてやってみます。

{
    "type": "vcs",
    "url": "http://phpquery.googlecode.com/svn/trunk/"
}

はい。エラーになりました。

[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of http://phpquery.googlecode.com/svn/trunk/, could not load a package from it.

VCSの場合は、composer.json をライブラリ側で持つ必要があるみたいですね。
packagistに登録してなくてcomposer.jsonを持ってるパターンってあんまりなさそうなので使い道は少なそうですね。

ゴリッと package でやってみる

repositories のところで使える、 composer, vcs, pear は、
composerが標準で対応していて「スマート」に使える感じなのですが、
それら以外のやつを無理やり使うための package というものがあります。

package
http://getcomposer.org/doc/05-repositories.md#package-2

{
    "type": "package",
    "package": {
        "name": "phpquery/phpQuery",
        "version": "0.9.5",
        "dist": {
            "url": "http://phpquery.googlecode.com/files/phpQuery-0.9.5.386.zip",
            "type": "zip"
        },
        "source": {
            "url": "http://phpquery.googlecode.com/svn/trunk/",
            "type": "svn",
            "reference": "tags/0.9.5/phpQuery"
        },
        "autoload": {
            "files": ["phpQuery/phpQuery.php"]
        }
    }
}

pearやvcsと違い、いろいろ事細かに設定しています。

これでようやくインストールでき、アプリ側からrequire等せずに phpQuery クラスにアクセスできるようになりました。

なかなか面倒くさいねー。

最後に

試してないですが、

duvanmonsa/phpQuery
https://github.com/duvanmonsa/phpQuery

という、composer.json をつけたphpQueryを(たぶん)第三者の方が公開されてます。
面倒だったらこっち使ったほうが楽かもしれないですね。

ハマったことで、composer.json のスキーマの理解が深まったので、これからドシドシComposerを使って行きたいなと思いましたとさ。