动机
我想通过di容器将service注入到mand和controller中。
另外,service 使用 repository 注入。
文档中并没有提到嵌套注入这种情况。
文档
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 cakemandmand;use cakeconsolerguments;use cakeconsoleconsoleio;use cakeconsoleconsoleoptionparser;class somemand extends mand{ 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 cakecorecontainerinterface;use cakecoreserviceprovider;class mandserviceprovider extends serviceprovider{ protected $provides = [ somemand::class, ]; public function services(containerinterface $container): void { $container->add(somemand::class)->addargument(someservice::class); }}
控制器
use cakecontrollercontroller;class somecontroller extends controller{ public function index(someservice $service) { $service->dosomething(); print(‘index()’); }}
注册到di容器
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); }}
// Application.phpclass Application extends BaseApplication{ // … public function services(ContainerInterface $container): void { $container->addServiceProvider(new SomeServiceProvider()); $container->addServiceProvider(new ControllerServiceProvider()); } // …
以上就是CakePHP 上层的 DI 容器的详细内容,更多请关注范的资源库其它相关文章!
转载请注明:范的资源库 » CakePHP上层的DI容器