PHP Phalcon autoloader in Composer
しゃーーーーーーーーーっ!!!パッションの伝道師こと鰯です。
今日は、Composer で Phalcon の Autoload 使っちゃう話しだよっ!!
Composer 使ってますかーーーー??
Composer イイよね!!
Phalcon イイよね!!
背景
まず、ことの背景として、Phalcon を使い始めた当初、Phalcon に Autoload 実装があって、
ちょっと、Composer と雰囲気違ったので、Phalcon の Autoload でやる事にしたのですが、
利用ライブラリが増えるに従って、何かと面倒になり、途中から、Composer の Autoload に
切り替えました。
しかし、Composer による恩恵は多大であると認識しつつも、Phalcon の Autoload も
少しはパフォーマンス的に有利なのでは?という気持ちもあり、Composer を使いつつ、
Autoload は Phalcon にしたい、という欲望があり、調べ始めたところ。
ステキエントリーを発見!!
『Composer の オートローダーだけ Phalcon に差し替える – Qiita』
と、ここまでは良いのですが、自前クラスローダを事前に読み込まなければならないので、
普段使いには、ちょっと… という感じでした、
調べたところ、Composer に Plugin の仕組みがあることを発見したので、Pluginとして
使えるようにしてしまおう!と思った次第です。
概要
Composer の autoload 系のファイルが自動生成されるときに、
さきほどの自前クラスローダを、生成するように実装しようという感じです。
プラグイン作成
プラグインの作成方法には2種類あるようで、既存のComposer内のクラスを自前のクラスに
差し替える方法と、イベントディスパッチャによるフックポイントに対して
イベントを追加してあげる方法。
今後の Composer の更新も考えると、今回は、後者を選択した方が良さそうです。
以下、プラグインのコードですが、ポイントとしては、ScriptEvents::POST_AUTOLOAD_DUMP
に
イベントを追加するところでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
[sourcecode lang="php"] <?php /** * AutoloadPlugin.php * * @copyright Copyright (c) 2013 sonicmoov Co.,Ltd. * @package * @subpackage * @version $Id$ */ namespace Phalcon\Composer; use Composer\Composer; use Composer\EventDispatcher\EventSubscriberInterface; use Composer\IO\IOInterface; use Composer\Plugin\PluginInterface; use Composer\Script\ScriptEvents; use Composer\Script\Event as ScriptEvent; use Composer\Util\Filesystem; class AutoloadPlugin implements PluginInterface, EventSubscriberInterface { protected $composer; protected $io; public function activate(Composer $composer, IOInterface $io) { $this->composer = $composer; $this->io = $io; } public static function getSubscribedEvents() { return array( ScriptEvents::POST_AUTOLOAD_DUMP => array( array('onPostAutoloadDump', 0) ), ); } public function onPostAutoloadDump(ScriptEvent $event) { $config = $event->getComposer()->getConfig(); $filesystem = new Filesystem(); $vendorPath = $filesystem->normalizePath(realpath($config->get('vendor-dir'))); $targetDir = $vendorPath.'/composer'; $sourceLoader = fopen(__DIR__.'/ClassLoader.php', 'r'); $targetLoader = fopen($targetDir.'/ClassLoader.php', 'w+'); stream_copy_to_stream($sourceLoader, $targetLoader); fclose($sourceLoader); fclose($targetLoader); unset($sourceLoader, $targetLoader); } } [/sourcecode] |
そして、composer.jsonはこんな感じで作成します、ポイントは、"type": "composer-plugin"
でしょうか
あと、プラグインの場合は、"extra"
指定が必須のようですので、こちらも重要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[sourcecode lang="javascript"] { "name": "iwai/phalcon-composer-autoloadplugin", "type": "composer-plugin", "description": "Phalcon Autoload Plugin for Composer", "license": "MIT", "require": { "composer-plugin-api": "*" }, "autoload": { "psr-0": { "Phalcon\\Composer\\": "." } }, "target-dir": "Phalcon/Composer", "extra": { "class": "\\Phalcon\\Composer\\AutoloadPlugin" }, "minimum-stability": "dev" } [/sourcecode] |
まとめ
こんな感じで、Composerプラグインが簡単に作れちゃいます、
これで、Composerの素晴らしい恩恵を受けつつ、PhalconによるAutoloadが使えるので、
わだかまりも、すっきりして、素敵なPhalconライフが送れますね!
今回参考にさせて頂いた、以下のページも合わせて読むとプラグインが簡単に作れるので、ぜひ、作ってみてください!