
我想通过di容器将service注入到command和controller中。
另外,service 使用 repository 注入。
文档中并没有提到嵌套注入这种情况。
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()');
}
}
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中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号