proklung/symfony-middleware-bundle

Symfony的MiddlewareBundle

1.0.11 2021-04-30 10:44 UTC

This package is auto-updated.

Last update: 2024-09-09 02:39:44 UTC


README

该包的分支。根据个人需求进行了修改,添加了一些标准的中间件。

安装

composer require proklung/symfony-middleware-bundle

自定义中间件

  1. OnlyAjaxMiddleware - 检查Ajax调用。
  2. CsrfMiddleware - 检查Csrf令牌。

原始文档

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

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

有4种可能的途径将您的中间件注入到请求中。

注册中间件

全局中间件

全局中间件在每个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。其他两种类型也是如此。

中间件示例

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

如我们所见,如果任何中间件返回Response,则意味着下一个中间件将不会执行。

返回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;
    }
}