在控制器方法之前,是否有方法检查控制器参数



我的控制器代码比实际的函数代码有更多的行来验证接收到的参数,我想知道是否有一种方法可以在控制器方法之外进行验证。

我检查了Symfony的文件,但什么也找不到。我在思考一些类似听众的东西,但只是为了那个方法。

谢谢大家。

编辑:我知道路线要求。我正在寻找一个地方来注入我自己的代码。

编辑:添加了一个小片段。

public function searchAddressAction($radius, $page){
    if ($radius < 5 || $radius > 50) {
        throw $this->createNotFoundException('Radius not valid');
    }
    if ($page <= 0) {
        throw $this->createNotFoundException('Page not found');
    }

第三版:这似乎是一种方式,但我无法让它发挥作用(感谢@dlondero):

search_address:
    path: /{address}/{radius}/{page}
    defaults:
        _controller: AppBundle:Default:searchAddress
        radius: 20
        page: 1
    options:
        expose: true
    requirements:
        radius: d+
        page: d+
    condition: 'request.get("radius") == 50 '

除了默认的路由要求外,如果请求应该传递给控制器,还有两个选项可以进行一些额外的检查。

  1. 创建自定义路由加载器

http://symfony.com/doc/current/routing/custom_route_loader.html

例如,如果您想从数据库中获取路线需求,这将非常有用。

  1. 条件(可能是你想要的)

https://symfony.com/doc/current/routing/conditions.html

这是在使用表达式语言https://symfony.com/doc/current/components/expression_language/syntax.html

我认为您不能在这里使用参数名称,但您可以访问请求中的查询,这肯定会满足路径的要求。

如果两者都不起作用,则必须在控制器中进行验证。当然,您可以创建一个类来进行验证,并且在控制器中使用该类,因此只需调用1个方法即可进行验证。

我不建议使用侦听器,因为它会为所有请求调用,然后必须检查是否应该进行验证。此外,从性能角度来看,这是不可取的,在侦听器中进行这种验证是没有意义的,所以如果其他人会处理你的代码,他必须在奇怪的地方挖掘,找出为什么控制器返回404,但仍然匹配路由。

您可能正在查找kernel.request事件。然后你可以让你的听众/订阅者检查你需要检查的内容。

相关内容

最新更新