
动机
我想通过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 cakeconsolearguments;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 容器的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1251973.html
微信扫一扫
支付宝扫一扫