在Symfony中为@Route注释创建自定义需求验证器

时间:2016-01-27 15:59:56

标签: symfony

正如您在下面看到的,我的@Route->requirements正则表达式(我在许多其他控制器/方法中使用它)有点长,看起来不是很好而且最重要的是 将来很难在语法更新的情况下进行维护,所以问题是,我们是否可以执行类似下面的操作?

我已经看过许多类似的问题和教程,用于创建自定义注释,但不是像这个问题。

当前

/**
 * @param string $id
 *
 * @Method({"GET"})
 * @Route("/class/{id}", requirements={"id"="([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}"})
 * @Secure(roles="ROLE_ADMIN")
 *
 * @return Response
 */
public function getClassAction($id)

可能有点像这样

/**
 * @param string $id
 *
 * @Method({"GET"})
 * @Route("/class/{id}", requirements={"id"="MyClass::MyValidation"})
 * @Secure(roles="ROLE_ADMIN")
 *
 * @return Response
 */
public function getClassAction($id)

MyClass的

MyClass
{
     // Would be ideal to stick this into parameters.yml though
     const ID = "([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}";

     public function MyValidation($value)
     {
          if (!preg_match(self::ID, $value)) {
               return 'Bad ID';
          }

          return true;
     }
}

2 个答案:

答案 0 :(得分:2)

您应该直接使用该模式,如下所示:

<?php

use X\Y\Z\MyClass;

class XYZ
{

/**
 * @param string $id
 *
 * @Method({"GET"})
 * @Route("/class/{id}", requirements={"id":MyClass::ID})
 * @Secure(roles="ROLE_ADMIN")
 *
 * @return Response
 */
public function getClassAction($id)

答案 1 :(得分:0)

我建议改用@ParamConverter注释。在这种情况下,您不需要验证。有关详细信息ParamConverter

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/blog/{id}")
 * @ParamConverter("post", class="SensioBlogBundle:Post")
 */
public function showAction(Post $post)
{
}