zholus / symfony-middleware

v3.0.0 2022-05-01 11:53 UTC

This package is auto-updated.

Last update: 2024-09-29 05:22:11 UTC


README

Build Status Coverage Status StyleCI

此包允许您创建简单的中间件,它将在每个请求之前执行,在控制器执行之前。

它几乎类似于laravel框架中的中间件。

有4种方法可以将中间件注入到请求中。

Symfony版本

  • Symfony版本 6.x - 使用分支 master
  • Symfony版本 5.x - 使用分支 5.x
  • Symfony版本 4.x - 使用分支 4.x

安装

symfony版本6.x的Composer

composer require zholus/symfony-middleware

symfony版本5.x的Composer

composer require zholus/symfony-middleware:^2

symfony版本4.x的Composer

composer require zholus/symfony-middleware:^1

bundles.php中添加包

Zholus\SymfonyMiddleware\MiddlewareBundle::class => ['all' => true]

注册中间件

全局中间件

全局中间件在每次HTTP请求中每个控制器之前执行。

要将中间件注册为全局中间件,您需要实现接口 \Zholus\SymfonyMiddleware\GlobalMiddlewareInterface

这就完成了。

控制器中间件

此中间件将在特定控制器的每个操作中执行,要将中间件附加到控制器,您需要在services.yaml文件中进行一些配置

App\Controller\WelcomeController:
    tags:
        - { name: 'middleware.controller', middleware: 'App\Middleware\AuthNeededMiddleware' }

这就完成了,只需在标签中添加带有以下选项的选项:name - middleware.controllermiddleware - 完整类名。

您可以为控制器附加多个中间件

App\Controller\WelcomeController:
    tags:
        - { name: 'middleware.controller', middleware: 'App\Middleware\AuthNeededMiddleware' }
        - { name: 'middleware.controller', middleware: 'App\Middleware\AdminAccessMiddleware' }

操作中间件

此中间件类似于控制器,我们只需添加一个额外的选项,即action

App\Controller\WelcomeController:
    tags:
        - { name: 'middleware.controller', middleware: 'App\Middleware\AuthNeededMiddleware', action: 'index' }

这意味着当操作index运行时,我们的中间件将执行

路由中间件

在您的路由配置文件中添加一个名为middleware的数组选项

index:
    path: /
    controller: App\Controller\WelcomeController::index
    options:
        middleware: ['App\Middleware\AuthNeededMiddleware', 'App\Middleware\AdminAccessMiddleware']

这些中间件将附加到我们的示例中的路由名称index

中间件执行优先级

不同类型中间件执行的顺序如下:global中间件首先执行,然后是controller,然后是action,最后是route

对于全局中间件,您可以在services.yaml中指定,让我们看看一个示例

App\Middleware\AuthNeededMiddleware:
    tags:
        - { name: 'middleware.global', priority: 2 }
        
App\Middleware\AdminAccessMiddleware:
    tags:
        - { name: 'middleware.global', priority: 1 }

默认优先级未指定配置时为0。数字越高,中间件执行的越早。

对于其他3种类型(控制器、操作、路由),优先级与配置中相同,例如在路由配置中

index:
    path: /
    controller: App\Controller\WelcomeController::index
    options:
        middleware: ['App\Middleware\AuthNeededMiddleware', 'App\Middleware\AdminAccessMiddleware']

首先执行App\Middleware\AuthNeededMiddleware,然后是App\Middleware\AdminAccessMiddleware。其他两种类型也是如此。

中间件示例

以下示例中,我们的中间件检查给定的凭据是否代表具有管理员访问权限的用户,如果不是,我们将返回带有访问拒绝信息的响应。

正如我们所看到的,如果任何中间件返回响应,则意味着下一个中间件将不会执行。

返回null表示下一个中间件将执行。

<?php

namespace App\Middleware;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Zholus\SymfonyMiddleware\MiddlewareInterface;
use App\Repository\UserRepository;

final class AdminAccessMiddleware implements MiddlewareInterface
{
    private $userRepository;
    
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
    
    public function handle(Request $request): ?Response
    {
        $login = $request->get('login');
        $password = $request->get('password');
        
        $user = $this->userRepository->findByCredentials($login, $password);
        
        if ($user === null || !$user->isAdmin()) {
            return new Response('Denied access', 403);
        }
        
        return null;
    }
}