使用 Yaml 的 Symfony 回调验证

Symfony Callback Validation with Yaml

使用 validation.yml 定义时未调用我的验证。 使用 php 或注释一切正常。

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');
    }
}

以上代码总是 returns 'ok',无论我输入哪个登录名或密码。 有什么线索吗?

根据我们在评论和提供的示例中的反复,与当前的食谱示例相比,一切看起来都不错。我们坚定地处于头脑风暴/"see what sticks" 领域。以下是一些剩余的想法:

  1. 您的 validation.yml 文件不会得到 parsed/loaded 吗?您可以尝试向文件添加一些其他 属性 级别的约束,只是为了将回调排除为异常值。

  2. 您可以尝试使用 lint:yaml CLI 工具,但根据之前的经验,我预计任何格式错误的 YAML 都会引发更明确的解析错误。

  3. 极度不太可能(尤其是在最近的文档闪电战之后),但也许食谱示例不是最新的,并且配置行为已经以某种方式发生了变化。

  4. 启动 XDebug 并开始逐步执​​行验证过程。确保您确实点击了验证回调。如果没有,请尝试使用外部或静态回调方法,看看是否可以缓解问题。

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

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

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

引用official docs

As of Symfony 2.7, XML and Yaml constraint files located in the Resources/config/validation sub-directory of a bundle are loaded. Prior to 2.7, only Resources/config/validation.yml (or .xml) were loaded.

一些有效路径示例:

  • src/AppBundle/Resources/config/validation.yml
  • src/AppBundle/Resources/config/validation/foo.yml