proklung / symfony-middleware-bundle
Symfony的MiddlewareBundle
Requires
- php: >=7.3
- proklung/base-exception: ^1.0
- symfony/config: ~4|~5
- symfony/dependency-injection: ^3.4 || ^4.0 || ^5.0
- symfony/event-dispatcher: ^4.0 || ^5.0
- symfony/framework-bundle: ^4.0 || ^5.0
- symfony/http-kernel: ^4.0 || ^5.0
- symfony/security-csrf: ^4.0 || ^5.0
This package is auto-updated.
Last update: 2024-09-09 02:39:44 UTC
README
该包的分支。根据个人需求进行了修改,添加了一些标准的中间件。
安装
composer require proklung/symfony-middleware-bundle
自定义中间件
- OnlyAjaxMiddleware - 检查Ajax调用。
- CsrfMiddleware - 检查Csrf令牌。
原始文档
此包允许您创建简单的中间件,在每个请求中在控制器执行之前执行。
它几乎类似于Laravel框架中的中间件。
有4种可能的途径将您的中间件注入到请求中。
注册中间件
全局中间件
全局中间件在每个HTTP请求的每个控制器之前执行。
要将中间件注册为全局,您需要实现接口 \Zholus\SymfonyMiddleware\GlobalMiddlewareInterface
。
就这么多。
控制器中间件
此中间件将在特定控制器的每个操作中执行,要将中间件附加到控制器,您需要在services.yaml文件中设置一些配置
App\Controller\WelcomeController:
tags:
- { name: 'middleware.controller', middleware: 'App\Middleware\AuthNeededMiddleware' }
就这么多,只需使用带有选项的标签: name
- middleware.controller
和 middleware
- 完全限定的类名。
您可以将多个中间件附加到控制器
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; } }