当前位置: 首页 > 知识库问答 >
问题:

为了使用Doctrine2注释,我可以在消费者类中覆盖PHP trait属性吗?

秦珂
2023-03-14

我正在使用特征在Symfony应用程序中实现一些可标记的行为,使用Doctrine2进行持久性,并使用注释来配置它。

我的主要烦恼是,在这个特性中,我的IDE不知道$this的类型-

trait TaggableMethods {
    /** @var \Doctrine\Common\Collections\Collection */
    protected $tags; // <-- Can't seem to define here…
    public function addTag(Tag $tag) {
        $this->tags->add($tag);
    }
    public function removeTag(Tag $tag) {
        $this->tags->removeElement($tag);
    }
    public function getTags() {
        return $this->tags;
    }
}

class TaggableThingA {
    use TaggableMethods;
    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\ManyToMany(targetEntity="Tag")
     * @ORM\JoinTable(name="ThingA__Tag")
     */
    protected $tags; // <--… because PHP complains about this
}

class TaggableThingB {
    use TaggableMethods;
    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\ManyToMany(targetEntity="Tag")
     * @ORM\JoinTable(name="ThingB__Tag")
     */
    protected $tags;
}

据我所知,我的问题是我不能在trait中定义$tags属性,因为我需要重写注释。

我可以完全避免在TagableMethods中定义$tags,但对我来说,这打破了封装,或者至少使代码更难阅读。

我可以使用Yaml或XML配置持久性,但我的所有其他实体都使用注释。

因此,我正在寻找一种方法来避免生成的运行时通知,Symfony将其转换为ContextErrorException,从而在开发过程中杀死我的脚本

这可能与“我们可以使用特征来映射与教义2的多对一关系吗?”和“特征-与父类的属性冲突”有关

此外,在“PHP 5.4:为什么类可以用不同的签名覆盖特征方法?”中提到的继承方法的行为听起来非常接近我想要的属性——有人能解释为什么属性和方法之间存在差异吗?

共有2个答案

马俊
2023-03-14

晚了,但它可能会帮助某人。您可以使用关联或属性覆盖(注释@AssociationOverrides@AttributeOverrides),如第 6.4 节中所述。重写。

凌景辉
2023-03-14

您无法覆盖特征,但可以重命名它。

这里有一个例子!

https://github . com/Slim PHP/Slim/blob/3 . x/Slim/app . PHP # L47-L50

 类似资料:
  • 问题内容: 我有如下测试: 具有以下输出: 但是,我希望注释可以被覆盖,并且不会出现警告。 有没有办法做到这一点? 编辑:我发现一个错误似乎与此有关,但我最终运行4.2.0,仍然得到上述行为。 问题答案: 实际上,JSR-303不支持覆盖验证注释。相反,子类中重写方法的注释将 累积 应用:从规范的3.3节开始:

  • 我想用C#听Kafka主题的消息。 与Java中一样,还有一个注释@KafkaListener,当添加到函数上方时,它会侦听来自主题的消息,然后执行函数的逻辑。 示例-@KafkaListener(topics=“topicname”,groupId=“groupId”)//这里的函数代码 同样,C#中是否有使用Confluent的注释。Kafka

  • 我当前有一个来自属性文件的变量,声明为: 在本例中,我希望在注释中使用,而不是硬编码常量“3”: 这有可能吗? 我试过: 但是我得到以下编译错误:

  • 问题内容: 在Swift中,有人可以解释如何用原始属性的子类覆盖另一个超类的属性吗? 举一个简单的例子: 这给出了错误: 如果我将机箱设为“ var”,则会收到错误消息: 在指南中“覆盖属性”下唯一可以找到的内容表明,我们必须覆盖getter和setter,这可能会更改属性的值(如果它是’var’),但是如何更改属性类呢? ? 问题答案: Swift不允许您更改任何变量或属性的类类型。相反,您可以

  • 大多数或所有核心hibernate配置属性都可以在启动属性文件中指定,以替代在hibernate.cfg.xml中指定映射。

  • 我想覆盖我在Quarkus应用程序的配置文件中配置的属性。 我怎样才能做到这一点?