在 Doctrine 2 实体上使用基类?

Posted

技术标签:

【中文标题】在 Doctrine 2 实体上使用基类?【英文标题】:Use Base Class on Doctrine 2 Entities? 【发布时间】:2014-02-10 18:55:23 【问题描述】:

我是 Doctrine 的新手(以及一般的 ORM)。我已经生成了一些以我的数据库为模型的实体,并且效果很好。但是,我想知道是否有一种方法可以使用具有共享功能的基类来扩展实体类。例如,我可以将 getter 和 setter 的魔术方法放在基类中。 Doctrine 2 可以做到这一点吗?

例如:

/**
 * Country
 *
 * @Table(name="country", uniqueConstraints=@UniqueConstraint(name="country_id", columns="country_id"))
 * @Entity
 */
class Country extends MyBaseClass
   
    /**
     * @var integer
     *
     * @Column(name="country_id", type="integer")
     * @Id
     * @GeneratedValue
     */
    protected $id;

    /**
     * @var string
     *
     * @Column(name="code", type="string", length=2, nullable=true)
     */
    protected $code;

    /**
     * @var string
     *
     * @Column(name="name", type="string", length=75, nullable=true)
     */
    protected $name;


class MyBaseClass 
    public function doSomething($var) 
        return $this->$var;
    

【问题讨论】:

当然。 Doctrine 2 实体只是普通的旧 php 对象。向外延伸。虽然我在使用 __get 时会小心一点,因为它可能会破坏延迟加载。 【参考方案1】:

实体是通用类,因此您可以轻松扩展一些基类。 例如,您可以在 FOSUserBundle 中查看如何使用此方法的示例。基类和接口放在model文件夹下。

共享功能的另一种方式是traits。您可以从 KnpLabs here 了解一些一般的 Doctrine 2 行为。

【讨论】:

以上是关于在 Doctrine 2 实体上使用基类?的主要内容,如果未能解决你的问题,请参考以下文章

获取 Doctrine 实体列表(UI 人口、访问权限等)

Doctrine 2 中的代理是啥?

使用 insert() 方法通过 PHP Doctrine\DBAL 2 插入 DateTime 值

Doctrine 2 WHERE IN 子句使用实体集合

Zend 2 Framework - Doctrine从给定的2个实体生成表

在 Doctrine2 上找不到实体异常