php - 不能对属性或 getter 施加约束

标签 php validation constraints symfony

我尝试创建 custom constraint在 symfony 3 中

我有错误

约束 App\Bundle\MyBundle\Validator\Constraints\Code 不能放在属性或 getter 上

<?php
// vendor/app/mybundle/Validator/Constraints/Code.php

namespace App\Bundle\MyBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;


class Code extends Constraint
{
    public $message = 'Error validate message!!!';
    public function validatedBy()
    {
        return 'alias_name';
    }

    public function getTargets()
    {
      //return self::CLASS_CONSTRAINT; // error "The constraint cannot be put on properties or getters"
      return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT); // working, but $value is a STRING!!!
    }
 }

我的 vendor/app/mybundle/Validator/Constraints/CodeValidator.php

<?php
// vendor/app/mybundle/Validator/Constraints/CodeValidator.php

namespace App\Bundle\MyBundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class CodeValidator extends ConstraintValidator
{
     public function validate($value, Constraint $constraint)
     {
         $value->getId(); // this code not working, because $value is STRING!!
         $this->context->buildViolation($constraint->message)
             ->atPath('code')
             ->addViolation();
     }

我哪里做错了?

最佳答案

尝试将此添加到您的约束中:

/**
 * @Annotation
 * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
 */

编辑

今天早上,我花时间在全新安装的 symfony 3 上尝试了您的实现。

此外,如果您在属性上添加 @AcmeAssert\Code,如下所示:

use AppBundle\Validator\Constraints as AcmeAssert;

// ...

/**
 * @var string
 * @AcmeAssert\Code
 * @ORM\Column(name="code", type="string")
 */
private $code;

只有字段会被验证,所以$value代表属性的字段值。
例如,如果您在实体的 $code 属性上分配 @AcmeAssert\Code,则在提交表单时,$value您的验证器将代表您的 $code 属性的字段值)。

如果您在实体顶部添加 @AcmeAssert\Code,如下所示:

use AppBundle\Validator\Constraints as AcmeAssert;

/**
 * Foo
 *
 * @ORM\Table(name="foo")
 * @AcmeAssert\Code
 * @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository")
 */
class Foo

然后,$value 将代表您的完整实体,您可以使用 getter 进行所需的所有验证。

我已经在存储库中添加了我的测试项目,您可以使用它来查看如何使用两个替代方案:sf3-constraint-test

在我的示例中,实体 AppBundle::Bar 对属性有约束,而 AppBundle::Foo 对整个实体有约束。

希望这是您所需要的!

EDIT2

如果您在 yaml 映射中,请使用以下内容将约束应用于您的整个实体并通过约束中的 $value 访问完整对象:

AppBundle\Entity\AcmeEntity:
    constraints:
        - App\Bundle\MyBundle\Validator\Constraints\Code: ~

在您的映射之上。

如果你只想在一个属性上应用约束,并使用 $value 访问字段的值,请保持原样并在 $value 上执行你的逻辑> 这是一个字符串(对应于映射中约束的实体属性的字段的值),它类似于:

AppBundle\Entity\AcmeEntity:
    properties:
            # ...
            code:
                - App\Bundle\MyBundle\Validator\Constraints\Code: ~

关于php - 不能对属性或 getter 施加约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163720/

相关文章:

c# - 使用受约束泛型类型 C# 的静态方法

ios - 与 Swift Autolayout 和 ScrollView 控件作斗争

php - 我们可以在 insert into 语句中传递 where 条件吗?如果不是,Codeigniter 中的解决方案是什么?

php - 从 foreach 循环中将数组与自身合并

java - JSR 303 Bean 验证 + Javascript 客户端验证

ruby-on-rails - has_many 关联的 Rails 验证

ruby-on-rails - 仅在生产中执行了验证,但 Rails 3.2.0 上的字段未被 field_with_errors div 包围

javascript - 如何使用 PHP/JavaScript 解析/处理我的服务器上的 KMZ 文件?

php - mysql插入查询不工作

constraints - 检查数组中是否存在元素#minizinc