SONICMOOV Googleページ

PHP Phalcon autoloader in Composer

PHP Phalcon autoloader in Composer

  • このエントリーをはてなブックマークに追加

しゃーーーーーーーーーっ!!!パッションの伝道師こと鰯です。

今日は、ComposerPhalconAutoload 使っちゃう話しだよっ!!

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

イベントを追加するところでしょうか。

<?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);
    }

}

そして、composer.jsonはこんな感じで作成します、ポイントは、"type": "composer-plugin"でしょうか

あと、プラグインの場合は、"extra" 指定が必須のようですので、こちらも重要です。

{
    "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"
}

まとめ

こんな感じで、Composerプラグインが簡単に作れちゃいます、

これで、Composerの素晴らしい恩恵を受けつつ、PhalconによるAutoloadが使えるので、

わだかまりも、すっきりして、素敵なPhalconライフが送れますね!

今回参考にさせて頂いた、以下のページも合わせて読むとプラグインが簡単に作れるので、ぜひ、作ってみてください!

  • このエントリーをはてなブックマークに追加

記事作成者の紹介

(システムエンジニア)

新規事業推進部のシステムエンジニアこと鰯(イワシ)です。最近ハマっているのは、AWSとPhalconです。好きなフォントは、Monaco13ptです。

システムエンジニア募集中!

×

SNSでも情報配信中!ぜひご登録ください。

×

SNSでも
情報配信中!
SONICMOOV Facebookページ SONICMOOV Twitter SONICMOOV Googleページ
システムエンジニア募集中!

新着の記事

mautic is open source marketing automation