vol.71は楽しい記事が多いなぁ~。
WEB+DB PRESSでSymfonyではじめるDIを読んだので実際に写経する。
■まずphpのバージョン確認(Composerの兼ね合いで。。)
$ php -v PHP 5.3.3 (cli) (built: Jul 3 2012 16:40:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
■Composerのインストール
$ curl -s http://getcomposer.org/installer | php #!/usr/bin/env php Some settings on your machine may cause stability issues with Composer. If you encounter issues, try to change the following: Your PHP (5.3.3) is quite old, upgrading to PHP 5.3.4 or higher is recommended. Composer works with 5.3.2+ for most people, but there might be edge case issues. Downloading... Composer successfully installed to: /path/symfony_DI/composer.phar Use it: php composer.phar
バージョンで文句言われたけど無視。
■Composer用の設定ファイル作成
$ vim composer.json
{ "require":{ "symfony/dependency-injection": "2.1.*", "symfony/config": "2.1.*", "symfony/yaml": "2.1.*" } }
$ ll total 632 drwxrwxr-x 2 takeuchi takeuchi 4096 Oct 31 15:21 ./ drwxrwxrwx 8 takeuchi takeuchi 4096 Oct 31 15:18 ../ -rw-rw-r-- 1 takeuchi takeuchi 118 Oct 31 15:21 composer.json -rwxr-xr-x 1 takeuchi takeuchi 631264 Oct 31 15:18 composer.phar*
■依存パッケージの取得
$ php composer.phar install Loading composer repositories with package information Installing dependencies - Installing symfony/dependency-injection (v2.1.3) Downloading: 100% - Installing symfony/config (v2.1.3) Downloading: 100% - Installing symfony/yaml (v2.1.3) Downloading: 100% Writing lock file Generating autoload files $ ll total 644 drwxrwxr-x 3 takeuchi takeuchi 4096 Oct 31 15:23 ./ drwxrwxrwx 8 takeuchi takeuchi 4096 Oct 31 15:18 ../ -rw-rw-r-- 1 takeuchi takeuchi 118 Oct 31 15:21 composer.json -rw-rw-r-- 1 takeuchi takeuchi 4939 Oct 31 15:23 composer.lock -rwxr-xr-x 1 takeuchi takeuchi 631264 Oct 31 15:18 composer.phar* drwxrwxr-x 4 takeuchi takeuchi 4096 Oct 31 15:23 vendor/
■依存のないクラスの実装とかそれ以降のコード
$ vim initial.php
namespace App{ class Controller{ private $memberRegistration; private $router; private $templating; public function __construct(){ echo __METHOD__.PHP_EOL; } public function registerAction(){ echo __METHOD__.PHP_EOL; $memberData=$this->getRequestData(); $this->memberRegistration->register($memberData); $html=$this->templating->render('register'); return $html; } public function setMemberRegistration(\Domain\MemberRegistration $memberRegistration){ echo __METHOD__.PHP_EOL; $this->memberRegistration=$memberRegistration; } public function setRouter(\App\Router $router){ echo __METHOD__.PHP_EOL; $this->router=$router; } public function setTemplating(\App\Templating $templating){ echo __METHOD__.PHP_EOL; $this->templating=$templating; } private function getRequestData(){ return array(); } } class Templating{ private $router; public function __construct(){ echo __METHOD__.PHP_EOL; } public function render($templateName){ echo __METHOD__.PHP_EOL; $url=$this->router->generateUrl('test'); } //セッターインジェクション public function setRouter(\App\Router $router){ $this->router=$router; } } class Router{ public function __construct(){ echo __METHOD__.PHP_EOL; } public function generateUrl(){ echo __METHOD__.PHP_EOL; } } } namespace Domain{ class MemberRegistration{ public function __construct(){ echo __METHOD__.PHP_EOL; } public function register($memberData){ echo __METHOD__.PHP_EOL; } } } namespace{ require_once 'vendor/autoload.php'; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; $container=new ContainerBuilder(); $container->register('app.controller', '\App\Controller') ->addMethodCall('setTemplating', array(new Reference('app.templating'),)) ->addMethodCall('setRouter', array(new Reference('app.router'),)) ->addMethodCall('setMemberRegistration', array(new Reference('domain.member_registration'),)); $container->register('app.templating', '\App\Templating') ->addMethodCall('setRouter', array(new Reference('app.router'),)); $container->register('app.router', '\App\Router'); $container->register('domain.member_registration', '\Domain\MemberRegistration'); $controller=$container->get('app.controller'); $controller->registerAction(); }
■実行結果
$ php initial.php App\Controller::__construct App\Templating::__construct App\Router::__construct App\Controller::setTemplating App\Controller::setRouter Domain\MemberRegistration::__construct App\Controller::setMemberRegistration App\Controller::registerAction Domain\MemberRegistration::register App\Templating::render App\Router::generateUrl
このあとはYAMLにしたりダンプで再利用とか。
■参考URL
PHPの外部ライブラリの管理にComposerを使う