SONICMOOV Googleページ

PHP Phalcon で Service Provider を実装する

PHP Phalcon で Service Provider を実装する

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

皆さんいかがお過ごしでしょうか、パッションの伝道師こと鰯です。

PHP Con 2013 まで、あと2週間ぐらいとなったわけですが、

一部で話題沸騰の Phalcon は無しなのか?と疑問に思う今日この頃です。

というわけで、PHP Con で Phalcon のセッションが無くても、我が道を行かせてもらいます。

サービスプロバイダ – Service Provider

コードの共通化や再利用性は、プログラマにとっては重要な課題のひとつです、

Silex や Laravel といった最近のフレームワークでも、Service Providerという名称で、

より柔軟にコードの再利用ができるようになっています。

今回は、そのサービスプロバイダを、Phalconでも実装できるよ!!というお話です。

Phalcon流 サービスプロバイダ

Phalcon では明示的に Service Provider という名称で記載はありませんが、

v1.2 より追加された、Phalcon\Mvc\Application にあるbootイベントを利用して実装できます。

今回は、AWSのgithubレポジトリで公開されている、AWS Service Provider for Silex を例に

Phalcon向けに実装しなおしたものを紹介します。

続きを読む

Silex の Service Provider の実装

まずは、SilexのAWS Service Providerの実装内容を覗いてみましょう、

SilexやLaravelでは、Applicationクラスのregister関数で、サービスコンポーネントの登録を

行います。以下は、SilexのAWS Service Providerの実装内容です。

    /**
     * @inheritdoc
     */
    public function register(Application $app)
    {
        $app['aws'] = $app->share(function (Application $app) {
            // Instantiate the AWS service builder
            $config = isset($app['aws.config']) ? $app['aws.config'] : array();
            $aws = Aws::factory($config);

            // Attach an event listener that will append the Silex version number in the user agent string
            $aws->getEventDispatcher()->addListener('service_builder.create_client', function (Event $event) {
                $clientConfig = $event['client']->getConfig();
                $commandParams = $clientConfig->get(Client::COMMAND_PARAMS) ?: array();
                $clientConfig->set(Client::COMMAND_PARAMS, array_merge_recursive($commandParams, array(
                    UserAgentListener::OPTION => 'Silex/' . Application::VERSION
                )));
            });

            return $aws;
        });
    }

Phalcon の Service Provider の実装例

それでは、さっそくPhalconのbootイベントを利用して実装してみましょう、

Phalconでは、register関数は無いため、bootイベントのみでサービスの登録を行います。

    /**
     * @param Application $app
     */
    public function boot(Application $app)
    {
        $options = $app->getDI()->get('config')->get('aws.config')
            ? $app->getDI()->get('config')->get('aws.config')->toArray()
            : array();

        $app->getDI()->setShared('aws', function ($options) {
            $aws = Aws::factory($options);

            $aws->getEventDispatcher()->addListener('service_builder.create_client', function (Event $event) {
                $clientConfig = $event['client']->getConfig();

                $commandParams = $clientConfig->get(Client::COMMAND_PARAMS) ?: array();

                $clientConfig->set(Client::COMMAND_PARAMS, array_merge_recursive($commandParams, array(
                    UserAgentListener::OPTION => 'Phalcon/' . Application::VERSION
                )));
            });

            return $aws;
        });
    }

実装内容的には、ほぼ変わりなく、非常に簡単に実装できました!

今回移植した、Phalcon向けの AWS Service Provider は、github上にコード置いてますので、

参考にして、他のサービスプロバイダも、ぜひ実装してみてください。

また、Aws\Phalcon\AwsServiceProviderとして、Packagistにも登録してあるので、

実際に利用することもできますので、ぜひ利用してみてください。

github: AWS Service Provider for Phalcon
packagist: aws-sdk-php-phalcon

Phalconでの利用方法は、こんな感じになるかと思います。

ちなみに、今回のbootイベントに関しては、以前、Phalconの使いはじめの時に、

Service Provider欲しいよなぁと思って提案したら、bootイベント実装してくれたって感じです。

そのあたりのやり取りは、こちらのIssueで確認できます。

[NFR] Add service provider register

というわけで、これから、さらにPhalconは熱くなってくるよっ!!

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

記事作成者の紹介

(システムエンジニア)

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

関連するSONICMOOVのサービス

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

×

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

×

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

新着の記事

mautic is open source marketing automation