passchn / cakephp-simple-di
为 CakePHP 量身定制的简单依赖注入插件
v3.4.1
2024-08-18 18:12 UTC
Requires
- php: ^8.2
- cakephp/cakephp: ^4.4 || ^5.0
Requires (Dev)
- phpunit/phpunit: ^11.3
README
安装
您可以使用 composer 将此插件安装到您的 CakePHP 应用程序中。
安装 composer 包的推荐方法是
composer require passchn/cakephp-simple-di
加载插件
bin/cake plugin load Passchn/SimpleDI
用法
在您的 Application.php
中
public function services(ContainerInterface $container): void { Configure::load('app_di'); DIManager::create($container) // to add individual services: ->addServices(Configure::readOrFail('DI.services')) /** * to collect multiple services, define a module: * @see \Passchn\SimpleDI\Module\Module\ModuleInterface */ ->addModules(Configure::readOrFail('DI.modules')) /** * a plugin can define multiple modules: * @see \Passchn\SimpleDI\Module\Plugin\PluginInterface */ ->addPlugin(SomePlugin::class); }
然后,在您的 app_di.php
中定义 Factories/Modules
return [ 'DI' => [ 'services' => [ NewsletterService::class => NewsletterServiceFactory::class, CheckoutService::class => CheckoutServiceFactory::class, PaymentService::class => fn () => new PaymentService(), ], 'modules' => [ MyModule::class, ], ], ];
Factories 应该是 Invokables 或 Invokables 的类字符串。
之后,您可以在控制器动作中使用 Service,例如
class ExamplesController { public function someAction(NewsletterService $service): Response { $service->doSomething(); } }
如果无法实现真正的 DI,例如在 ViewCells 中,您可以使用 ServiceLocator
来接收容器或服务。
Passchn\SimpleDI\Module\ServiceLocator\ServiceLocator::get(NewsletterService::class); // the service
这仅适用于您已加载插件或自己注册了容器的情况,例如
// in your Application::services() ServiceLocator::setContainer($container);