php-di/slim-bridge

PHP-DI在Slim中的应用

3.4.0 2023-06-29 14:08 UTC

README

此包配置Slim以与PHP-DI容器一起使用。

Build Status

完整文档在此: http://php-di.org/doc/frameworks/slim.html

为什么使用它?

PHP-DI作为容器

与默认的Slim安装相比,最明显的区别是您将使用PHP-DI作为容器,它具有以下优点:

如果您想了解更多关于PHP-DI可以提供的内容,请查看其简介

控制器作为服务

虽然您的控制器可以是简单的闭包,但您也可以将它们作为类来编写,并且只有在调用它们时才由PHP-DI实例化。

class UserController
{
    private $userRepository;
    
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function delete($request, $response)
    {
        $this->userRepository->remove($request->getAttribute('id'));
        
        $response->getBody()->write('User deleted');
        return $response;
    }
}

$app->delete('/user/{id}', ['UserController', 'delete']);

然后可以使用自动注入、PHP-DI配置文件或甚至注解将依赖注入到您的控制器中。

控制器参数

默认情况下,Slim控制器具有严格的签名:$request, $response, $args。PHP-DI桥接器提供了一个更灵活且对开发者友好的替代方案。

控制器参数可以是以下任何一种

  • 请求或响应(参数必须命名为$request$response
  • 路由占位符
  • 请求属性
  • 服务(通过类型提示注入)

您还可以混合所有这些类型的参数。它们将按上述列表中的顺序优先级匹配。

请求或响应注入

您可以通过名称在控制器参数中注入请求或响应

$app->get('/', function (ResponseInterface $response, ServerRequestInterface $request) {
    // ...
});

如您所见,参数的顺序无关紧要。这允许跳过注入$request,例如,如果它不需要。

路由占位符注入

$app->get('/hello/{name}', function ($name, ResponseInterface $response) {
    $response->getBody()->write('Hello ' . $name);
    return $response;
});

如您所见,路由的URL包含一个name占位符。只需向控制器添加一个具有相同名称的参数,PHP-DI就会直接注入它。

请求属性注入

$app->add(function (ServerRequestInterface $request, RequestHandlerInterface $handler) {
    $request = $request->withAttribute('name', 'Bob');
    $response = $handler->handle($request);
    return $response;
});

$app->get('/', function ($name, ResponseInterface $response) {
    $response->getBody()->write('Hello ' . $name);
    return $response;
});

如您所见,中间件设置了一个name属性。只需向控制器添加一个具有相同名称的参数,PHP-DI就会直接注入它。

服务注入

要将服务注入到您的控制器中,您可以将其编写为类。但如果您想使用闭包编写微应用程序,您也不必放弃依赖注入。

您可以通过类型提示来注入服务

$app->get('/', function (ResponseInterface $response, Twig $twig) {
    return $twig->render($response, 'home.twig');
});

注意:您只能注入您可以类型提示并且PHP-DI可以提供的服务。类型提示注入很简单,它只是注入$container->get(/* the type-hinted class */)的结果。

文档

文档可以在此处阅读: http://php-di.org/doc/frameworks/slim.html