juliangut/slim-php-di

Slim 框架 PHP-DI 容器集成

4.2 2024-06-12 21:08 UTC

This package is auto-updated.

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


README

PHP version Latest Version License

Total Downloads Monthly Downloads

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 文件以获取许可证条款副本。