もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

cake-pimple-di使ってみた。なかなか良かった。

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');

簡単ですね。

キレイに設計できるし、テストもしやすそうだし、いいですね!