我的控制器代码有更多行来验证接收到的参数而不是实际功能代码,我想知道是否有办法在控制器方法之外进行此验证。
我检查了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 :(得分:2)
除了默认的路由要求外,如果请求应该传递给Controller,还有2个选项可以进行额外的检查。
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
我认为你不能在这里使用参数名称,但你可以在请求中访问查询,这肯定符合路径的要求。
如果这两个都不起作用,则必须在Controller中进行验证。 您当然可以创建一个类来进行验证,并在控制器中使用该类,因此您只需调用1方法进行验证。
我不推荐这样的监听器,因为它将被调用所有请求,然后必须检查它是否应该进行验证。 除了它的性能明智不是优选的,在监听器中进行这种验证是没有意义的,所以如果其他人会处理你的代码,他必须挖掘奇怪的地方,找出控制器返回404的原因,但仍然符合路线。
答案 1 :(得分:0)
您可能正在寻找kernel.request事件。然后你可以让你的听众/订阅者检查你需要检查什么。