动机
我想通过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.phpclass Application extends BaseApplication{ // ... public function services(ContainerInterface $container): void { $container->addServiceProvider(new SomeServiceProvider()); $container->addServiceProvider(new ControllerServiceProvider()); } // ...
登录后复制
以上就是CakePHP 上层的 DI 容器的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1417900.html