Php 不能将约束放在属性或getter上
我尝试在symfony3中创建 我有错误 约束应用程序\Bundle\MyBundle\Validator\Constraints\Code不能放在属性或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
您创建的约束应仅应用于整个实体,例如:
/**
* @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的最佳实践。