2015-10-27 52 views
1

使用validation.yml进行定义时,我的验证没有被调用。 使用PHP或注释一切正常。Symfony回调Yaml验证

namespace AppBundle\Form; 

use Symfony\Component\Validator\Context\ExecutionContextInterface; 

class LoginForm 
{ 
    private $login; 
    private $password; 

    public function __construct($login, $password) 
    { 
     $this->login = $login; 
     $this->password = $password; 
    } 

    public function validate(ExecutionContextInterface $context) 
    { 
     $context->buildViolation('Error') 
      ->atPath('login') 
      ->addViolation(); 
    } 
} 

这是我validation.yml

AppBundle\Form\LoginForm: 
    constraints: 
     - Callback: [validate] 

这是我的控制器

class LoginController extends Controller 
{ 
    public function loginAction(Request $request) 
    { 
     if ($request->isMethod('POST')) { 
      $login = $request->request->get('loginform_login'); 
      $password = $request->request->get('loginform_password'); 
      $form = new LoginForm($login, $password); 
      $errors = $this->get('validator')->validate($form); 
      if (count($errors) > 0) { 
       return $this->render('login/error.html.twig'); 
      } 
      return $this->render('login/ok.html.twig'); 
     } 
     return $this->render('login/login.html.twig'); 
    } 
} 

上面的代码总是返回 'OK',无论哪个登录信息或密码i型。 任何线索?

+0

你如何用其他两种方法添加约束?你是否将它们添加到表单的'data_class'属性中指定的类中? 我在食谱中看到的大多数例子以及我亲身遇到的大多数情况都倾向于将约束添加到*特定*字段,而不是表单。所以我问。 – ReservedDeveloper

+0

如果我说得对,回调是类范围的。我使用了其他的方法,如下所示:http://symfony.com/doc/current/reference/constraints/Callback.html – vbsessa

+0

这是真的,但范围是实体类,在食谱示例中,不是表单类。您是否提供了完整的登录表单?你有为它设置的data_class(通过'configureOptions/setDefaultOptions'设置)吗? – ReservedDeveloper

回答

3

您需要将validation.yml文件放入您的软件包的Resources/config目录中。

从Symfony 2.7开始,Symfony也会从Resources/config/validation目录加载文件。

引述official docs

由于Symfony的2.7,位于束的资源/配置/验证子目录XML和YAML约束文件被加载。在2.7之前,只加载了Resources/config/validation.yml(或.xml)。

的有效路径的一些例子:

  • SRC /的appbundle /资源/配置/ validation.yml
  • SRC /的appbundle /资源/配置/验证/ foo.yml
+0

对不起,我对'app/Resources'和'src/AppBundle/Resources'感到困惑,默认情况下它不存在。 – vbsessa

+0

它总是简单的答案... – ReservedDeveloper

+1

@vbsessa在我的回复中看到你的评论,但怀疑你是为了这里的目的。正在发生加载的文件是[here](https://github.com/symfony/framework-bundle/blob/fab6822/DependencyInjection/FrameworkExtension.php#L770)。至于为什么采用这种方法时,其他组件可以在应用程序中全局查看/资源是一个更高层次的问题。这是猜想,但我怀疑它是Symfony的人工产物,它正在构建用于处理> 1捆绑的项目。只在一个全球位置寻找会导致交叉捆绑混合太多。 – ReservedDeveloper

1

根据我们在评论中的回顾和所提供的示例,与目前的食谱示例相比,一切都看起来不错。我们坚定地在头脑风暴/“看到什么坚持”的舞台上。以下是一些剩余的想法:

  1. 您的validation.yml文件不能被分析/加载?您可以尝试向该文件添加一些其他属性级别的约束,以便将回调排除在外。

  2. 你可以尝试lint:yaml CLI工具,虽然从以前的遭遇我预计任何格式不正确的YAML会抛出一个更明确的解析错误。 (尤其是在最近的文档闪电战之后),但是也许菜谱示例并不是最新的,并且配置行为已经有所改变。

  3. 启动XDebug并开始逐步验证过程。确保你真的打你的验证回调。如果没有,请尝试使用外部或静态回调方法,以查看是否可以缓解问题。

除了上述任何一项,我会等待比我自己的更明智的答案,非常感兴趣!

+0

我试过'登录:NotBlank',它不工作。我认为我的validation.yml没有被加载。我对这个问题进行了搜索,并且我看到有人说config.yml中的这一行'validation:{enabled:true,enable_annotations:false}'应该这样做,但事实并非如此。 :/ – vbsessa

+0

一个全新的项目应该已经包含一个validation.yml?因为我不得不手动创建一个,它根本没有被加载。 – vbsessa

+0

为什么所有资源(即非PHP文件)都可以存在于除validation.yml之外的应用程序/资源中?这有点奇怪,主要是在开发一个没有捆绑的应用程序时。 – vbsessa