2016-07-29 113 views
1

我的控制器代码有更多的线来验证接收到的参数比真正的功能代码,我想知道是否有一种方法来执行此控制器方法之外的验证。有没有办法在控制器方法之前检查控制器参数?

我检查了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 ' 
+0

你想对参数做什么样的验证?如果它没有验证会发生什么? –

+0

我想检查参数是否在两个值之间,例如。如果没有,代码会抛出一个未找到的异常。 –

+1

使用控制器类中的验证创建私有方法,并在公共方法中调用它们(例如'indexAction'或'editAction')。 – cezar

回答

2

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

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

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

,如果你想从数据库例如路线要求,这是非常有用的。

  • 条件(可能是你在找什么)
  • https://symfony.com/doc/current/routing/conditions.html

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

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

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

    我不建议为此监听器,因为它会针对所有请求进行调用,然后必须检查它是否应该进行验证。 除了性能上不明智之外,在监听器中进行这种验证是没有意义的,所以如果其他人会在你的代码上工作,他必须在奇怪的地方挖掘以找出控制器为什么返回一个404,但仍然匹配路线。

    +0

    谢谢,就在现在我试图让它工作的条件,但即使当语法应该是正确的,它只是不工作。 –

    +0

    好像在条件下,参数包仍然是空的。因此,除非使用侦听器,否则无法访问控制器外部的url参数。 –

    0

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

    +0

    我想过,但每次请求都会触发kernel.request事件,这会影响整个项目的性能。 –

    +0

    那么你可以提前返回你不需要检查的请求。 – dlondero

    +0

    是的。但我对演出有点迷惑。这就是我放弃这个想法并发表这篇文章的原因。这不是一个坏的解决方案,但我希望它不是最好的。 –

    相关问题