Symfony 3.4获取当前路由规则方法及路由判断事件监听实现
在Symfony 3.4事件监听器中获取当前路由规则并执行逻辑
在Symfony 3.4里实现这个需求其实很直观,我来一步步给你讲清楚怎么操作:
1. 配置监听器服务
首先在app/config/services.yml里注册你的事件监听器,注入request_stack和router服务——这两个是我们获取请求和路由信息的核心依赖:
services: app.path_check_listener: class: AppBundle\EventListener\PathCheckListener arguments: ['@request_stack', '@router'] tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
2. 编写监听器类
接下来创建监听器类,我们选择在kernel.request事件触发时执行逻辑(这个事件在请求刚进入框架时触发,非常适合做这类路径/路由判断):
// src/AppBundle/EventListener/PathCheckListener.php namespace AppBundle\EventListener; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Routing\RouterInterface; use Symfony\Component\HttpKernel\Event\GetResponseEvent; class PathCheckListener { private $requestStack; private $router; // 通过构造函数注入所需服务 public function __construct(RequestStack $requestStack, RouterInterface $router) { $this->requestStack = $requestStack; $this->router = $router; } public function onKernelRequest(GetResponseEvent $event) { // 只处理用户发起的主请求,忽略子请求(比如控制器内部的forward请求) if (!$event->isMasterRequest()) { return; } $request = $event->getRequest(); $currentPath = $request->getPathInfo(); // 方式1:严格判断当前请求路径不等于/admin if ($currentPath !== '/admin') { // 在这里编写你要执行的代码 // 示例:记录日志或触发业务逻辑 // error_log("当前路径不是/admin,执行自定义操作"); } // 方式2:判断路径不是以/admin开头(和security.yml里的^/admin匹配逻辑一致) if (strpos($currentPath, '/admin') !== 0) { // 执行你的代码逻辑 } // 方式3:基于路由定义的规则(比如路由配置里的path)来判断 try { // 匹配当前路径对应的路由信息 $routeMatch = $this->router->match($currentPath); // 获取路由名称 $routeName = $routeMatch['_route']; // 从路由集合中拿到路由的完整定义 $route = $this->router->getRouteCollection()->get($routeName); if ($route) { $routePathRule = $route->getPath(); // 判断路由规则是否不等于/admin if ($routePathRule !== '/admin') { // 执行你的代码逻辑 } } } catch (\Symfony\Component\Routing\Exception\ResourceNotFoundException $e) { // 如果请求没有匹配到任何路由(比如静态资源请求),直接返回 return; } } }
关键细节说明
- 主请求判断:
isMasterRequest()能帮我们避免子请求重复执行逻辑,确保只处理用户发起的原始请求。 - 三种判断方式的差异:
- 方式1适合严格匹配单个路径的场景;
- 方式2和security.yml里的路径匹配逻辑一致,适合判断路径是否不属于/admin前缀的范围;
- 方式3是基于路由配置的规则来判断,而非实际请求路径,适合你需要根据路由定义而非请求地址做判断的场景。
- 异常处理:捕获
ResourceNotFoundException是为了处理静态文件这类不匹配任何路由的请求,避免代码报错。
内容的提问来源于stack exchange,提问作者Salim Ben Aissa
相关产品推荐
相关产品推荐

