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

Roe*_*and 3 php doctrine symfony doctrine-orm

有人告诉我应该对 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);
}
Run Code Online (Sandbox Code Playgroud)

Twi*_*fty 5

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

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

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

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

  3. 当未来事情可能发生变化时。
    硬编码对象本质上将它们与代码联系在一起。你提到了主义,但如果将来你想迁移到推进器怎么办?与上面的第 2 点一样,界面使转换变得更容易。

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

  5. 团队发展
    就像上面的第 4 点一样。类在创建过程中可能会发生变化,这通常会导致更新整个代码中的方法调用。当有多个开发人员时,这会导致问题。拥有一个公共接口迫使每个开发人员遵循该接口所管辖的规则。