zholus / symfony-middleware
Requires
- php: >=8.0.2
- symfony/event-dispatcher: ^6.0
- symfony/framework-bundle: ^6.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.1
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.0
README
此包允许您创建简单的中间件,它将在每个请求之前执行,在控制器执行之前。
它几乎类似于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.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
。其他两种类型也是如此。
中间件示例
以下示例中,我们的中间件检查给定的凭据是否代表具有管理员访问权限的用户,如果不是,我们将返回带有访问拒绝信息的响应。
正如我们所看到的,如果任何中间件返回响应,则意味着下一个中间件将不会执行。
返回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; } }