robotusers / cakephp-di
PSR-11 兼容的 CakePHP 依赖注入容器抽象插件
Requires
- php: >=7.2
- cakephp/cakephp: ^4.2
Requires (Dev)
- cakephp/cakephp: 4.2.*
- cakephp/cakephp-codesniffer: *
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-23 21:27:12 UTC
README
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); }