juliangut / slim-php-di
Slim 框架 PHP-DI 容器集成
4.2
2024-06-12 21:08 UTC
Requires
- php: ^8.0
- ext-json: *
- ext-mbstring: *
- php-di/php-di: ^7.0.1
- psr/container: ^1.0|^2.0
- slim/slim: ^4.8
Requires (Dev)
- bnf/phpstan-psr-container: ^1.0
- infection/infection: ~0.25|~0.27
- juliangut/easy-coding-standard-config: ^1.18
- juliangut/phpstan-config: ^1.2
- laminas/laminas-diactoros: ^3.2
- overtrue/phplint: ^9.0
- phpcompatibility/php-compatibility: ^9.3
- phpmd/phpmd: ^2.14
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^9.6.13|^10.4
- povils/phpmnd: ^3.2
- roave/security-advisories: dev-master
- symfony/console: ^6.0|^7.0
Suggests
- symfony/console: In order to use console commands (>=6.0)
README
Slim 框架 PHP-DI 容器集成
PHP-DI 依赖注入容器集成于 Slim 框架。
安装
最佳安装方式是使用 Composer
composer require juliangut/slim-php-di
然后包含自动加载文件
require_once './vendor/autoload.php';
使用方法
使用 Jgut\Slim\PHPDI\ContainerBuilder
创建 PHP-DI 容器并从中提取 Slim 的 App
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; use Psr\Container\ContainerInterface; use Slim\App; $container = ContainerBuilder::build(new Configuration()); $app = $container->get(App::class); // same as $app = \Slim\Factory\AppFactory::createFromContainer($container); // Register your services if not provided as definitions $container->set('service_one', function (ContainerInterface $container): ServiceOne { return new ServiceOne($container->get('service_two')); }); // Set your routes $app->run();
为了在容器中注册服务,最好在定义文件中完成
配置
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; $settings = [ 'useAttributes' => true, 'compilationPath' => '/path/to/compiled/container', ]; $configuration = new Configuration($settings); // Settings can be set after creation $configuration->setProxiesPath(sys_get_temp_dir()); $configuration->setDefinitions('/path/to/definition/files'); $container = ContainerBuilder::build($configuration);
PHP-DI 设置
useAutoWiring
是否使用自动绑定(默认为 true)useAttributes
是否使用属性(默认为 false)useDefinitionCache
是否使用定义缓存(默认为 false)wrapContainer
包装容器(默认为 none)proxiesPath
PHP-DI 创建代理文件的路径(默认为 none)compilationPath
PHP-DI 创建编译容器的路径(默认为 none)
有关容器配置的更多信息,请参阅 PHP-DI 文档
附加设置
definitions
定义文件/目录的路径数组或定义数组。 定义按出现顺序加载containerClass
构建时使用的容器类。必须实现\Psr\Container\ContainerInterface
、\DI\FactoryInterface
和\DI\InvokerInterface
(默认为\Jgut\Slim\PHPDI\Container
)
容器数组访问简写
默认的 \Jgut\Slim\PHPDI\Container
容器允许通过连接数组键和点进行简写数组访问。如果链中的任何键未定义,则抛出正常的 Psr\Container\NotFoundExceptionInterface
异常
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; $container = ContainerBuilder::build(new Configuration([])); $configs = [ 'database' => [ 'dsn' => 'mysql://root:pass@localhost/my_ddbb', ], ]; $container->set('configs', $configs); $container->get('configs')['database']['dsn']; $container->get('configs.database.dsn'); // same as above
注意
请注意,不要通过在键中使用点来隐藏任何数组键
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; $container = ContainerBuilder::build(new Configuration([])); $configs = [ 'foo' => [ 'bar' => [ 'baz' => 'shadowed!', // <== watch out! ], ], 'foo.bar' => 'bingo!', ]; $container->set('configs', $configs); $container->get('configs.foo.bar'); // bingo! $container->get('configs.foo.bar.baz'); // NotFoundExceptionInterface thrown
避免这种情况的最简单方法是不要在数组键中使用点
调用策略
默认情况下,slim-php-di 设置了一个自定义调用策略,它使用 PHP-DI 的 Invoker 来满足可调用参数,它允许你这样做
use Jgut\Slim\PHPDI\Configuration; use Jgut\Slim\PHPDI\ContainerBuilder; use Psr\Http\Message\ResponseInterface; use Slim\App; $container = ContainerBuilder::build(new Configuration([])); $app = $container->get(App::class); $app->get('/hello/{name}', function (ResponseInterface $response, string $name, \PDO $connection): ResponseInterface { // $name will be injected from request arguments // $connection will be injected directly from the container $response->getBody()->write('Hello ' . $name); return $response; }); $app->run();
如果你更喜欢默认的 Slim 的 Slim\Handlers\Strategies\RequestResponse
策略或任何其他你选择的策略,你只需在定义文件中设置它即可
use Slim\Handlers\Strategies\RequestResponse; use Slim\Interfaces\InvocationStrategyInterface; use function DI\create; return [ InvocationStrategyInterface::class => create(RequestResponse::class), ];
控制台命令
use Symfony\Component\Console\Application; use Jgut\Slim\PHPDI\Command\ListCommand; /** @var \Slim\App $app */ $container = $app->getContainer(); $cli = new Application('Slim CLI'); $cli->add(new ListCommand($container)); $app->run();
列出容器定义
列出支持搜索的容器定义
php -f cli.php slim:container:list --help
从 3.x 迁移
- 所需的最小 PHP 版本是 PHP 8.0
- 迁移到 PHP-DI 7。已删除注解,使用属性
贡献
发现了一个错误或有功能请求? 请打开一个新问题。在提出之前查看现有问题。
请参阅 CONTRIBUTING.md 文件
许可证
请参阅源代码中包含的 LICENSE 文件以获取许可证条款副本。