> 백엔드 개발 > PHP 튜토리얼 > CakePHP 상단의 DI 컨테이너

CakePHP 상단의 DI 컨테이너

Linda Hamilton
풀어 주다: 2024-12-24 06:57:23
원래의
650명이 탐색했습니다.

DI Container on CakePHP upper

동기 부여

DI 컨테이너를 통해 명령 및 컨트롤러에 서비스를 주입하고 싶습니다.
또한 서비스는 주입된 Repository를 사용합니다.
문서에는 중첩 주입과 같은 경우에 대한 언급이 없습니다.

문서

https://book.cakephp.org/4/en/development/dependent-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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿