5.6. Slim
Slim中使用PHP-DI
Slim 是个用于网页和APIs的微框架。鉴于该框架与PSR-11兼容, Slim可以开箱即用地处理任何容器。这样,将PHP-DI与Slim结合使用就很容易。
PHP-DI bridge 提供了一些附加功能:
- 控制器作为服务,允许在控制器中注入依赖项
- 在控制器中智能的参数注入
安装
最新版本与 Slim v4.2 及更高版本兼容
composer require php-di/slim-bridge
安装后,不要使用官方的Slim \ Factory \ AppFactory
,而是使用PHP-DI的Bridge
类创建您的应用程序:
<?php
require 'vendor/autoload.php';
$app = \DI\Bridge\Slim\Bridge::create();
如果要配置PHP-DI,请将已配置的容器传递给方法:
$container = /* create your container */;
$app = \DI\Bridge\Slim\Bridge::create($container);
请参阅 configuring PHP-DI 以获取有关如何创建和配置容器的详细信息。
然后,您可以使用该应用程序就像原始的Slim应用程序一样,例如:
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
$app->get('/hello/{name}', function (Request $request, Response $response) {
$response->getBody()->write('Hello!');
return $response;
});
$app->run();
最重要的是,PHP-DI的其他功能会自动提供。阅读页面的其余部分以了解更多信息。
为什么使用 PHP-DI 的 bridge?
控制器即服务
尽管您的控制器可以是简单的闭包,但您也可以将它们编写为类,并仅在调用它们时让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;
}
}
// 注意我们如何使用类名注册控制器?
// PHP-DI仅在确实必要时才为我们实例化该类
$app->delete('/user/{id}', [UserController::class, 'delete']);
然后可以使用autowiring,PHP-DI 配置文件,注释.将依赖项注入到控制器中。
控制器参数
默认情况下,Slim控制器具有严格的参数项: $request, $response, $args
. PHP-DI桥提供了更灵活和对开发人员友好的替代方案。
控制器参数可以是以下任何一种:
- 请求或响应the request or response (参数必须命名为
$ request
或$ response
) - 路由占位符route placeholders
- 请求属性request attributes
- 服务services (按类型提示注入)
您也可以将所有这些类型的参数混合在一起。它们将按照上面列出的顺序按优先级进行匹配。
请求或响应注入
您可以用名称在控制器参数中插入请求或响应:
$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 ($request, $response, $next) {
$request = $request->withAttribute('name', 'Bob');
return $next($request, $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(/* 类型声明类 */)
的结果。
更多
阅读有关 GitHub 上的 Slim-Bridge 项目 了解更多信息。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。