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の実装内容です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[sourcecode lang="php"] /** * @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; }); } [/sourcecode] |
Phalcon の Service Provider の実装例
それでは、さっそくPhalconのbootイベントを利用して実装してみましょう、
Phalconでは、register関数は無いため、bootイベントのみでサービスの登録を行います。
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 |
[sourcecode lang="php"] /** * @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; }); } [/sourcecode] |
実装内容的には、ほぼ変わりなく、非常に簡単に実装できました!
今回移植した、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は熱くなってくるよっ!!