加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Doctrine – 从实体中解耦模型

发布时间:2020-12-13 16:54:22 所属栏目:PHP教程 来源:网络整理
导读:这是交易. 使用Doctrine ORM for PHP,我需要将模型与实体持久层“解耦”. 假设我们有UserEntity,其中包含db映射的所有漂亮内容, as:注释,属性,setter / getters等. 另一方面,我想要一个单独的User类,它只保存与业务相关的逻辑,例如:User :: getFullName().
这是交易.
使用Doctrine ORM for PHP,我需要将模型与实体持久层“解耦”.
假设我们有UserEntity,其中包含db映射的所有漂亮内容,
as:注释,属性,setter / getters等.
另一方面,我想要一个单独的User类,它只保存与业务相关的逻辑,例如:User :: getFullName().
此外,我希望用户扩展UserEntity,以便用户继承所有访问方法.

我检查过的可能解决方案对我不起作用:

>只是从实体扩展模型然后在DQL中指定模型不起作用
> make UserEntity / ** @MappedSuperclass * /不起作用,因为在这种情况下,UserEntity“本身并不是一个实体”
> InheritanceType / DiscriminatorColumn / DiscriminatorMap不起作用,因为模型不是实体

有任何想法吗 ?

解决方法

得了! (> = PHP 5.4解决方案)

简短:使实体成为特征,在模型类中使用实体特征.
查看此文档页面:http://doctrine-orm.readthedocs.org/en/latest/tutorials/override-field-association-mappings-in-subclasses.html.

例:
假设我们有用户模型.首先创建用户实体:

/**
 * @ORMTable(name="user")
 */
trait UserEntity {

     /**
      * @var integer
      *
      * @ORMColumn(name="id",type="integer",nullable=false)
      * @ORMId
      * @ORMGeneratedValue(strategy="IDENTITY")
      */
      protected $id;

     /**
      * @var string
      *
      * @ORMColumn(name="first_name",type="string",length=100,nullable=true)
      */
      protected $firstName;

     /**
      * @var string
      *
      * @ORMColumn(name="last_name",nullable=true)
      */
      protected $lastName;

      // other mapping here...
}

然后创建一个模型并在其中使用实体特征:

/**
 * @ORMEntity
 */
class User {
    use UserEntity;

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

在用户模型中注意@Entity注释.这是直接使用模型所必需的
在实体经理.

现在假设我们需要一个扩展User one的Admin模型.这有点棘手.
我们必须将@Entity更改为User中的@MappedSuperclass,以便进行扩展.
然后创建Admin模型,将其声明为@Entity,并在其上重新声明表名
使用@Table注释(否则,由于某些原因,Doctrine会因为要获取哪个表而混淆).
看起来像这样:

/**
 * @ORMMappedSuperclass
 */
class User {
    use UserEntity;

    public function getFullName() {
        return $this->firstName . ' ' . $this->lastName;
    }
}

/**
 * @ORMEntity
 * @ORMTable(name="user")
 */
class Admin extends User {
    public function getFullName() {
        return parent::getFullName() . ' (admin)';
    }
}

这样,用户和管理模型(=实体)都可以在Doctrine中使用.

我们不能做任何我们通常对实体做的事情:通过实体管理器查找()它们,直接在查询中使用模型等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读