CakePHP 上の DI コンテナ

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-24 06:57:23660ブラウズ

DI Container on CakePHP upper

モチベーション

DIコンテナでコマンドやコントローラーにServiceを注入したい
さらに、サービスは注入されたリポジトリを使用します。
このドキュメントでは、ネストされたインジェクションのようなこのケースについては言及されていません。

書類

https://book.cakephp.org/4/en/development/dependency-injection.html

実装方法

サービスとリポジトリ

interface SomeRepository {
  public getAll(): array;
}
class SomeRepositoryImpl implements SomeRepository
{
    public function getAll(): array
    {
        print('getAll()');
        return [];
    }
}
class SomeService
{
    private $someRepository;

    public function __construct(SomeRepository $someRepository)
    {
        $this->someRepository = $someRepository;
    }

    public function doSomething(): void
    {
        $this->someRepository->getAll();
    }
}

コマンド

use Cake\Command\Command;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;

class SomeCommand extends Command
{
    private SomeService $service;

    public function __construct(SomeService $service)
    {
        parent::__construct();
        $this->service = $service;
    }

    public static function getDescription(): string
    {
        return 'Inject service through provider';
    }

    public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
    {
        $parser = parent::buildOptionParser($parser);
        return $parser;
    }

    public function execute(Arguments $args, ConsoleIo $io)
    {
        $this->service->doSomething();
    }
}
use Cake\Core\ContainerInterface;
use Cake\Core\ServiceProvider;

class CommandServiceProvider extends ServiceProvider
{
    protected $provides = [
        SomeCommand::class,
    ];

    public function services(ContainerInterface $container): void
    {
        $container
            ->add(SomeCommand::class)
            ->addArgument(SomeService::class);
    }
}

コントローラ

use Cake\Controller\Controller;

class SomeController extends Controller
{
    public function index(SomeService $service)
    {
        $service->doSomething();
        print('index()');
    }
}

DIコンテナへの登録

use Cake\Core\ContainerInterface;
use Cake\Core\ServiceProvider;

class SomeServiceProvider extends ServiceProvider
{
    protected $provides = [
        SomeService::class,
    ];

    public function services(ContainerInterface $container): void
    {
        $container
            ->add(SomeRepository::class, SomeRepositoryImpl::class);
        $container
            ->add(SomeService::class)
            ->addArgument(SomeRepository::class);
    }
}
// Application.php
class Application extends BaseApplication
{
    // ...
    public function services(ContainerInterface $container): void
    {
        $container->addServiceProvider(new SomeServiceProvider());
        $container->addServiceProvider(new ControllerServiceProvider());
    }
    // ...

以上がCakePHP 上の DI コンテナの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。