reindeer/symfony-middleware

symfony 的中间件支持

安装: 7

依赖项: 0

建议者: 0

安全: 0

星星: 0

观察者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

v1.0.2 2022-06-20 18:54 UTC

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\RequestSymfony\Component\HttpFoundation\Response,而不是分别使用 Psr\Http\Message\RequestInterfacePsr\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
    }
}

许可证

MIT 许可证 (MIT).