ifyazilim / slim-bridge-with-controller
PHP-DI在Slim框架中的集成(带有控制器)
Requires
- php: ^7.1 || ^8.0
- php-di/invoker: ^2.0.0
- php-di/php-di: ^6.0|^7.0
- slim/slim: ^4.2.0
Requires (Dev)
- laminas/laminas-diactoros: ^2.1
- phpunit/phpunit: >= 7.0 < 10
This package is auto-updated.
Last update: 2024-09-05 10:41:46 UTC
README
此包是PHP-DI/Slim-Bridge-with-Controller的替代品
PHP-DI与Slim集成
此包配置Slim以与PHP-DI容器一起工作。
完整文档在此: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 */)
的结果。