【问题标题】:Using Symfony Validation component to validate objects with dynamic properties使用 Symfony Validation 组件来验证具有动态属性的对象
【发布时间】:2012-08-25 05:49:19
【问题描述】:

我正在尝试使用外部 yml 规则集(不在 Symfony 项目中)使用 Symfony2 的验证组件(从 2.1 分支开始)验证导入的 csv 文件中的数据:

use Symfony\Component\Validator\Validation;

$builder = Validation::createValidatorBuilder();
$builder->addYamlMapping('rules.yml');

$validator = $builder->getValidator();

$row = (object)array('name' => 'foo');

$violations = $validator->validate($row);

这是我的 yml 文件:

stdClass:
  properties:
    name:
      - MinLength: 10

现在的问题是,Validator 组件似乎无法验证具有动态属性的对象(例如 stdClass 或任何其他具有魔术 getter 和 setter 的类)。

当我运行该代码时,我收到一条消息:

[Symfony\Component\Validator\Exception\ValidatorException]
Property forename does not exist in class stdClass

这是由于突出显示的行中的 PropertyMetaclass.php 使用 property_exists() 检查存在性,这显然不起作用,因为它检查的是类而不是对象。

有谁知道如何让验证器处理具有动态属性的对象?

【问题讨论】:

  • 我更新了代码以展示我最新的 symfony2.1 成果。

标签: php validation symfony symfony-2.1


【解决方案1】:

很遗憾目前无法根据这个official statement验证具有动态属性的对象,所以我开了一个feature request。

我现在的解决方法是编写一个非常简单的代码生成器类,它将类定义转储到磁盘上的文件中,然后用作数据的类文件。

【讨论】:

    【解决方案2】:

    object 不是 PHP 类型。

    在你的 yaml 文件中使用 stdClass 而不是对象

    见http://php.net/manual/en/language.types.object.php

    【讨论】:

    • 谢谢,我已经试过了,也没有运气。我更新了代码。
    • 我现在发现了问题,这是一个愚蠢的错误 - yml 文件被保存为带有 BOM 的 UTF-8,但它不起作用。我在没有 BOM 的情况下保存了它,代码继续。但现在我面临另一个问题 - 我更新了帖子。
    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2021-09-13
    相关资源
    最近更新 更多