passchn/cakephp-simple-di

为 CakePHP 量身定制的简单依赖注入插件

安装次数: 48

依赖者: 1

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:cakephp-plugin

v3.4.1 2024-08-18 18:12 UTC

This package is auto-updated.

Last update: 2024-09-18 18:23:30 UTC


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);