您的位置 首页 编程知识

CakePHP 上层的 DI 容器

动机 我想通过di容器将service注入到command和controller中。 另外,service 使…

CakePHP 上层的 DI 容器

动机

我想通过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 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();     } } 
登录后复制
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);     } }  
登录后复制

控制器

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.php class Application extends BaseApplication {     // ...     public function services(ContainerInterface $container): void     {         $container->addServiceProvider(new SomeServiceProvider());         $container->addServiceProvider(new ControllerServiceProvider());     }     // ... 
登录后复制

以上就是CakePHP 上层的 DI 容器的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/4851.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部