我的Doctrine实体应该实现接口吗?

时间:2015-04-07 23:13:46

标签: php symfony doctrine-orm doctrine

我被告知我应该编写我的Doctrine POPO实体来实现一个接口。我的理解是,最佳做法是对接口进行编码。

有人能为我提供实现接口的Doctrine实体的一些好处。在我花时间编写实现接口的所有实体之前,我想确保理解执行此抽象的好处。下面是一个示例(请注意,为简单起见,包含了Doctrine注释):

<?php
class User implements UserInterface()
{
    function getName() {
        return $this->name;
    }

    function setName($name) {
        $this->name = $name;
    }

    function addPermission(Permission $permission) {
        $this->permissions[] = $permission;
    }
}

interface UserInterface()
{
    function getName();

    function setName($name);

    function addPermission(Permission $permission);
}

1 个答案:

答案 0 :(得分:3)

我将在数据库实体框架内回答这个问题。

一般来说,实体不需要实现接口。但是,也有例外。

  1. 将实体传递给第三方代码时 与UserInterface一样,某些第三方代码希望能够收集有关某个对象的数据。用户登录名和电子邮件就像Symfony一样。

  2. 将代码分发为第三方时 一个例子是RoleInterface。您的捆绑包可能会管理实体,例如FOSUserBundle,但最终用户可能不喜欢您的实施,甚至不希望它们存储在数据库中。使用接口允许我们重新实现现有代码而不会破坏事物。 (你的包应该检查接口而不是类。)

  3. 将来可能会发生变化 硬编码对象实质上将它们与代码联系起来。你提到了学说,但如果将来你想要迁移到推进怎么办?与上面的第2点一样,界面使转换更容易。

  4. 测试
    当只需要接口的实现时,创建模拟对象要容易得多。

  5. 团队发展
    像上面的第4点。类可能在创建过程中发生更改,这通常会导致在整个代码中更新方法调用。当有多个开发人员时,这会导致问题。拥有一个通用接口会强制每个开发人员遵循由接口管理的规则。