Php 不能将约束放在属性或getter上

Php 不能将约束放在属性或getter上,php,validation,constraints,symfony,Php,Validation,Constraints,Symfony,我尝试在symfony3中创建 我有错误 约束应用程序\Bundle\MyBundle\Validator\Constraints\Code不能放在属性或getter上 您创建的约束应仅应用于整个实体,例如: /** * @AppAssert\SectionCode */ class MyEntity { // ... } 如果要将约束应用于类的成员,请删除getTargets()函数。尝试将此添加到约束中: /** * @Annotation * @Target({"PROP

我尝试在symfony3中创建

我有错误

约束应用程序\Bundle\MyBundle\Validator\Constraints\Code不能放在属性或getter上


您创建的约束应仅应用于整个实体,例如:

/**
 * @AppAssert\SectionCode
 */
class MyEntity
{
    // ...
}

如果要将约束应用于类的成员,请删除
getTargets()
函数。

尝试将此添加到约束中:

/**
 * @Annotation
 * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
 */
AppBundle\Entity\AcmeEntity:
    constraints:
        - App\Bundle\MyBundle\Validator\Constraints\Code: ~
编辑

今天早上,我花时间在一个新的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
然后,$值将代表您的完整实体,您可以使用getter进行所有验证

我已将我的测试项目添加到存储库中,您可以使用它查看如何使用这两个备选方案:

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

希望这是你需要的

EDIT2

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

/**
 * @Annotation
 * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
 */
AppBundle\Entity\AcmeEntity:
    constraints:
        - App\Bundle\MyBundle\Validator\Constraints\Code: ~
在您的映射之上

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

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

@AppAssert\SectionCode(“propertyName”)?jason roman我更改getTargets公共函数getTargets(){return array(self::PROPERTY_CONSTRAINT,self::CLASS_CONSTRAINT);}但是在validate()方法中,$value变量不是我实体的对象,是string吗?您是否正在验证整个实体,或者仅仅是您实体的一项财产?如果是实体,则只需将其保留为
self::CLASS_CONSTRAINT
,但请将代码张贴在您尝试应用约束的位置,而不仅仅是约束和验证器。问题应该结束,因为此答案解决了Symfony版本3.4中的主要问题(问题是关于这个问题的)(尚未选中4),实际上,您需要重写getTargets()方法。如果您查看Constraint::getTargets()中的内容,您将看到它返回
self::PROPERTY\u Constraint默认情况下。重写getTargets()方法并返回
returnparent::CLASS_约束这就是我解决这个问题的方法。我再次改变了我的@chalasr外观。请根据您的需要进行更改。非常感谢您的帮助。我使用yml文件进行映射和验证。也许这就是问题所在?你认为这重要吗?确保只使用注释?我认为这不会导致问题,请检查我的代码和您的代码,以确定问题出在哪里。我没有足够的代码来定位代码中的错误。但约束顶部的@Annotation是必需的。映射格式非常个人化,我只对实体使用注释,现在我在控制器中使用它,因为FOSRestBundle,这是Symfony的最佳实践。