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 项目 了解更多信息。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/php-di/6.0/fram...

译文地址:https://learnku.com/docs/php-di/6.0/fram...

上一篇 下一篇
贡献者:4
讨论数量: 0
发起讨论 查看所有版本


暂无话题~