cakephp3を引き続き触っております。
今回はCakePHPでもDI出来るよっていうcake-pimple-diを使ってみました。
pimple自体は結構触ってたのですが、cakeでも使えるってことなんで、ワクワクしながら触りました。
設定は以下みたいな感じです。
bootstrap.php
<?php ... Plugin::load('RochaMarcelo/CakePimpleDi', ['bootstrap' => true, 'routes' => false]);
Pimple用設定ファイル
<?php use Cake\ORM\TableRegistry; return [ 'CakePimpleDi' => [ 'actionInjections' => [ '\App\Controller\TestController' => [ 'index' => ['test_service'], ] ], 'services' => [ 'test_service' => function() { return new App\Service\TestService( TableRegistry::getTableLocator()->get(App\Model\Table\Tests::class) ); }, ] ] ];
TestController.php
<?php namespace App\Controller; use RochaMarcelo\CakePimpleDi\Di\InvokeActionTrait; use App\Service\TestService; /** * Class TestController * @package App\Controller */ class TestController extends AppController { use InvokeActionTrait; /** * index page * @param TestService $service */ public function index(TestService $service) { $service->hello(); // -> hello!! } }
TestService
<?php namespace App\Service; use App\Model\Table\Tests; class TestService { public function __construct(Tests $model) { $this->model = $model; } public function hello() { echo 'hello!!'; } }
caekphpって考えなしにプログラム作っていくと、コントローラにガリガリビジネスロジックが書き込まれていくので、ビジネスロジックはサービスクラスに逃したかったので、こんな構成にしました。
テストなんで、modelクラスもわたしてるんですが、問題なく使えます。
DIコンテナに登録されている別のserviceを呼びたい場合は以下
<?php ... use RochaMarcelo\CakePimpleDi\Di\Di; $service = Di::instance()->get('test_service');
簡単ですね。
キレイに設計できるし、テストもしやすそうだし、いいですね!