有没有办法在控制器方法之前检查控制器参数?

时间:2016-07-29 09:35:41

标签: symfony

我的控制器代码有更多行来验证接收到的参数而不是实际功能代码,我想知道是否有办法在控制器方法之外进行此验证。

我检查了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');
    }

编辑3:这似乎是方式,但我不能使它工作(感谢@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 '

2 个答案:

答案 0 :(得分:2)

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

  1. 创建自定义路由加载器。
  2. http://symfony.com/doc/current/routing/custom_route_loader.html

    如果您想从数据库中获取路径要求,这可能非常有用。

    1. 条件(可能是你正在寻找的)
    2. https://symfony.com/doc/current/routing/conditions.html

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

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

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

      我不推荐这样的监听器,因为它将被调用所有请求,然后必须检查它是否应该进行验证。 除了它的性能明智不是优选的,在监听器中进行这种验证是没有意义的,所以如果其他人会处理你的代码,他必须挖掘奇怪的地方,找出控制器返回404的原因,但仍然符合路线。

答案 1 :(得分:0)

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