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)
我将仅在数据库实体的框架内回答这个问题。
一般来说,实体不需要实现接口。但是,也有例外。
将您的实体传递给第三方代码时。
与 一样UserInterface,某些第 3 方代码期望能够收集有关某个对象的数据。用户的登录名和电子邮件与 Symfony 的情况一样。
作为第三方分发您的代码时。
一个例子是RoleInterface。您的捆绑包可以管理实体,例如 FOSUserBundle,但最终用户可能不喜欢您的实现,甚至不希望它们存储在数据库中。使用接口允许我们在不破坏现有代码的情况下重新实现现有代码。(您的包应该检查接口而不是类)。
当未来事情可能发生变化时。
硬编码对象本质上将它们与代码联系在一起。你提到了主义,但如果将来你想迁移到推进器怎么办?与上面的第 2 点一样,界面使转换变得更容易。
测试
当只需要接口的实现时,创建模拟对象要容易得多。
团队发展
就像上面的第 4 点一样。类在创建过程中可能会发生变化,这通常会导致更新整个代码中的方法调用。当有多个开发人员时,这会导致问题。拥有一个公共接口迫使每个开发人员遵循该接口所管辖的规则。