lefuturiste / slim-bridge
Slim 中的 PHP-DI 集成
1.0.6
2021-04-05 09:19 UTC
Requires
- php: >=5.5
- php-di/invoker: ^1.2.0
- php-di/php-di: ^5.2.0
- slim/slim: ^3.4.0
Requires (Dev)
- phpunit/phpunit: ~4.8
README
此包配置 Slim 3 以与 PHP-DI 容器 一起工作。
完整文档在此:http://php-di.org/doc/frameworks/slim.html
为什么?
PHP-DI 作为容器
与默认的 Slim 安装相比,最明显的区别是您将使用 PHP-DI 作为容器,它具有以下优点
如果您想了解更多关于 PHP-DI 可以提供的内容,请查看其介绍 http://php-di.org/
控制器作为服务
虽然您的控制器可以是简单的闭包,但您也可以 将它们编写为类,并且只有当它们被调用时才由 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->get('/', function (ResponseInterface $response, Twig $twig) { return $twig->render($response, 'home.twig'); });
注意:您只能注入您可以类型提示且 PHP-DI 可以提供的服务。类型提示注入很简单,它简单地注入了
$container->get(/* the type-hinted class */)的结果。