CakePHP 上层的 DI 容器(容器.CakePHP.DI...)
我想通过di容器将service注入到command和controller中。
另外,service 使用 repository 注入。
文档中并没有提到嵌套注入这种情况。
https://book.cakephp.org/4/en/development/dependency-injection.html
如何实施 服务和存储库PHP
interface somerepository {
public getall(): array;
}
PHP
class somerepositoryimpl implements somerepository
{
public function getall(): array
{
print('getall()');
return [];
}
}
PHP
class someservice
{
private $somerepository;
public function __construct(somerepository $somerepository)
{
$this->somerepository = $somerepository;
}
public function dosomething(): void
{
$this->somerepository->getall();
}
}
命令
PHP
use cakecommandcommand;
use cakeconsolerguments;
use cakeconsoleconsoleio;
use cakeconsoleconsoleoptionparser;
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();
}
}
PHP
use cakecorecontainerinterface;
use cakecoreserviceprovider;
class commandserviceprovider extends serviceprovider
{
protected $provides = [
somecommand::class,
];
public function services(containerinterface $container): void
{
$container
->add(somecommand::class)
->addargument(someservice::class);
}
}
控制器
PHP
use cakecontrollercontroller;
class somecontroller extends controller
{
public function index(someservice $service)
{
$service->dosomething();
print('index()');
}
}
注册到di容器
PHP
use cakecorecontainerinterface;
use cakecoreserviceprovider;
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);
}
}
PHP
// Application.php
class Application extends BaseApplication
{
// ...
public function services(ContainerInterface $container): void
{
$container->addServiceProvider(new SomeServiceProvider());
$container->addServiceProvider(new ControllerServiceProvider());
}
// ...
以上就是CakePHP 上层的 DI 容器的详细内容,更多请关注知识资源分享宝库其它相关文章!