robotusers/cakephp-di

PSR-11 兼容的 CakePHP 依赖注入容器抽象插件

安装次数: 2,458

依赖关系: 0

建议者: 0

安全: 0

星标: 6

关注者: 4

分支: 3

开放问题: 0

类型:cakephp-plugin

0.3.0-beta 2021-03-04 12:54 UTC

This package is auto-updated.

Last update: 2024-09-23 21:27:12 UTC


README

Software License codecov

PSR-11 兼容的 CakePHP 依赖注入容器抽象插件

开发中

该插件正在开发中,目前不推荐在生产环境中使用。

版本

对于 CakePHP 3.x,使用 CakePHP DI 0.1.x 版本。CakePHP DI 0.2.x 版本适用于 CakePHP 4.0 和 4.1

对于 CakePHP 4.2,尝试 0.3 分支

容器抽象

此插件提供了使用任何 PSR-11 兼容 DIC 与 CakePHP 框架的工具。对 CakePHP 的 DIC 支持是一个经常请求的功能。尽管 CakePHP 是基于依赖注入构建的,但它不提供任何内置的 DIC。有许多优秀的 DI 容器,此插件允许您选择最喜欢的容器并将其与您的 CakePHP 应用程序一起使用。

配置

CakePHP DI 插件提供了一个 Robotusers\DI\Core\ContainerApplicationInterface,您的 Application 类应该实现该接口。该接口定义了一个 getContainer() 方法,该方法应返回您的 PSR-11 兼容容器。

该插件提供了一个可以扩展的基本应用程序类。

class Application extends \Robotusers\DI\Http\BaseApplication
{
    protected function createContainer()
    {
        $container = new SomeContainer();

        //configure your services

        return $container;
    }
}

请注意,基本类要求您实现 createContainer() 方法。这是一个用于您的容器的工厂方法,因为 getContainer() 需要在每次调用时返回相同的实例。

BaseApplication 类还提供了一些针对操作分发器的连接,以便控制器和操作使用您的 DI 容器。

控制器

控制器应作为服务注册到您的 DIC 中。该插件尝试使用控制器的 FQCN 作为 ID 从您的 DIC 中检索控制器。例如:$container->get('App\Controller\ArticlesController');

该插件还提供了将服务注入到控制器操作中的功能。

服务必须作为参数传递给操作方法。优先级取决于传递的参数,例如,您的 view 方法应如下所示

//ArticlesController.php

public function view($id, ArticlesServiceInterface $service)
{
    //code
}

ArticlesServiceInterface 实例将被注入到方法中。

控制台

要从 DIC 中获取控制台命令,您需要使用此插件提供的 CommandFactory

在您的 bin/cake.php

...

use App\Application;
use Cake\Console\CommandRunner;
use Robotusers\Di\Console\CommandFactory;

$application = new Application(dirname(__DIR__) . '/config');
$factory = new CommandFactory($application);
$runner = new CommandRunner($application, 'cake', $factory);
exit($runner->run($argv));

表定位器

扩展 Robotusers\DI\Http\BaseApplication 为您提供了对 TableLocator 的 DIC 兼容实现。在引导过程中,全局表定位器的实例被注入到 TableRegistry

此插件附带的可替换表定位器允许您注入自己的表工厂。

默认情况下使用 ContainerFactory,它使用表的类名作为 $id 从您的 DIC 中检索表。请注意,选项不会传递到 DIC 中,因为 PSR-11 实现不支持将额外参数传递给 get() 方法。

您需要使用 TableLocator::setConfig() 方法配置您的表选项,或者配置您的容器以传递正确的选项。

您还可以通过覆盖 Application::createTableLocator() 方法来使用自定义的表工厂实现。表工厂必须是一个可调用的函数,它接受 $options 数组。

protected function createTableLocator()
{
    $factory = function($options) {
        // retrieve a table from your DIC

        return $table;
    };

    return new \Robotusers\Di\ORM\Locator\TableLocator($factory);
}