【问题标题】:Symfony Callback Validation with Yaml使用 Yaml 进行 Symfony 回调验证
【发布时间】:2015-10-27 16:43:16
【问题描述】:

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

无论我输入哪个登录名或密码,上面的代码总是返回“ok”。 有什么线索吗?

【问题讨论】:

  • 您如何使用其他两种方法添加约束?您是否将它们添加到表单的 data_class 属性中指定的类中?我在说明书中看到的大多数示例以及我个人遇到的大多数示例都倾向于将约束添加到 特定 字段,而不是表单。所以我问。
  • 如果我做对了,回调是类范围的。我使用了其他方法,如下所示symfony.com/doc/current/reference/constraints/Callback.html
  • 确实如此,但在食谱示例中,它的范围是实体类,而不是表单类。您提供的示例是您的完整登录表单吗?您是否为它设置了 data_class(通过 configureOptions/setDefaultOptions 设置)?
  • 实际上我的表单类只是一个常规类,我想执行某种数据验证(我认为人们称之为 Adhoc 验证)。正如你所看到的,我没有从 Symfony 表单类继承,nether 是一个实体类。回答您的问题,“是的”,这是我的完整登录表单。我不相信验证绑定到实体类。

标签: php validation symfony yaml symfony-2.7


【解决方案1】:

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

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

引用official docs

从 Symfony 2.7 开始,位于 bundle 的 Resources/config/validation 子目录中的 XML 和 Yaml 约束文件被加载。在 2.7 之前,仅加载 Resources/config/validation.yml(或 .xml)。

一些有效路径的例子:

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

【讨论】:

  • 抱歉,我对app/Resourcessrc/AppBundle/Resources 感到困惑,默认情况下不存在。
  • @vbsessa 在我的回复中看到了您的评论,但怀疑您打算在这里。正在加载的文件是here。至于为什么当其他组件可以在 app/Resources 中全局查看时采用这种方法是一个更高级别的问题。这是猜想,但我怀疑它是 Symfony 为处理具有 > 1 个捆绑包的项目而构建的工件。只查看一个全球位置会导致过多的交叉捆绑混合。
【解决方案2】:

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

  1. 您的validation.yml 文件可能不会被解析/加载吗?您可以尝试在文件中添加一些其他属性级别的约束,只是为了排除回调作为异常值。

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

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

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

除上述任何一种情况外,我会怀着极大的兴趣等待比我自己更明智的答案!

【讨论】:

  • 我试过login: NotBlank,但它不起作用。我认为我的 validation.yml 没有被加载。我对这个问题进行了搜索,我看到有人说 config.yml 中的这一行 validation: { enabled: true, enable_annotations: false } 应该这样做,但事实并非如此。 ://
  • 一个全新的项目应该已经包含一个validation.yml?因为我必须手动创建一个并且它根本没有被加载。
  • 为什么除了validation.yml之外的所有资源,即非PHP文件都可以存在于app/Resources中?这有点奇怪,主要是在开发没有任何捆绑包的应用程序时。
猜你喜欢
  • 2023-03-19
  • 2018-02-22
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2015-06-29
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多