reindeer / symfony-middleware
symfony 的中间件支持
v1.0.2
2022-06-20 18:54 UTC
Requires
- php: ^8.0
- symfony/config: >=5.3
- symfony/dependency-injection: >=5.3
- symfony/http-kernel: >=5.3
- symfony/routing: >=5.3
Requires (Dev)
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-20 23:39:03 UTC
README
简介
这个包提供了类似于 PSR-15 的中间件,用于 Symfony。与 PSR-15 不同,它使用常见的 Symfony 请求和响应。
安装
composer require reindeer/symfony-middleware
用法
每个中间件必须实现 Reindeer\SymfonyMiddleware\Contracts\MiddlewareInterface 接口。这个接口与 Psr\Http\Server\MiddlewareInterface 非常相似,但它使用 Symfony\Component\HttpFoundation\Request 和 Symfony\Component\HttpFoundation\Response,而不是分别使用 Psr\Http\Message\RequestInterface 和 Psr\Http\Message\ResponseInterface。
可以通过路由描述中的选项数组应用某些路由的中间件。
使用中间件保护路由
让我们创建一个进行身份验证检查的中间件
src/Middleware/AuthMiddleware.php
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Reindeer\SymfonyMiddleware\Contracts\MiddlewareInterface; use Reindeer\SymfonyMiddleware\Contracts\RequestHandlerInterface; class CheckDeposit implements MiddlewareInterface { public function process(Request $request, RequestHandlerInterface $handler): Response { // Check credentials return $handler->handle($request); } }
现在我们需要使用我们的中间件来保护路由
config/routes.yaml
custom.route: path: /some/path options: middleware: - \App\Middleware\AuthMiddleware
这就完成了。
您可以为每个路由添加所需的任何数量的中间件。
请注意:如果您使用导入的路由并在路由和集合中设置中间件,则仅使用集合中的中间件。
config/imported-routes.yaml
custom.route: path: /some/path options: middleware: - \App\Middleware\YetAnotherMiddleware # this middleware will be ignored
config/routes.yaml
collection: resource: 'imported-routes.yaml' options: middleware: - \App\Middleware\CustomMiddleware
示例
中间件之前的身份验证检查
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; use Reindeer\SymfonyMiddleware\Contracts\MiddlewareInterface; use Reindeer\SymfonyMiddleware\Contracts\RequestHandlerInterface; class CheckDeposit implements MiddlewareInterface { public function process(Request $request, RequestHandlerInterface $handler): Response { if (!isAuthenticated($request->headers->get('Authorization')) { throw new UnauthorizedHttpException(); } return $handler->handle($request); } protected function isAuthenticated($token): bool { return true; // Do some stuff } }
中间件之后的日志发送到外部服务
<?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Reindeer\SymfonyMiddleware\Contracts\MiddlewareInterface; use Reindeer\SymfonyMiddleware\Contracts\RequestHandlerInterface; class CheckDeposit implements MiddlewareInterface { public function process(Request $request, RequestHandlerInterface $handler): Response { $response = $handler->handle($request); // Send logs to kibana return $response } }