【发布时间】:2018-12-08 07:09:58
【问题描述】:
假设我在 PHP 中有一个非常简单的 CRUD 系统来管理数据库。假设它包含产品列表。使用 Doctrine ORM,我想查询数据库并查看/编辑/添加记录。根据Getting Started手册,
创建实体类时,所有字段都应该受到保护或 私有(非公共),每个都有 getter 和 setter 方法 ($id 除外)。使用 mutators 允许 Doctrine 挂钩调用 它以你无法做到的方式操纵实体 直接用 entity#field = foo 设置值;
这是提供的示例:
// src/Product.php
class Product
{
/**
* @var int
*/
protected $id;
/**
* @var string
*/
protected $name;
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
// Recording a new title
$product->setName("My new name");
$db->persist($product);
$db->flush();
// Echoing the title
echo $product->getName();
但是,这似乎过于复杂。假设我不需要挂钩来操纵实体的调用,如手册中所述。我可以使这段代码更短,然后这样做:
// src/Product.php
class Product
{
/**
* @var int
*/
public $id;
/**
* @var string
*/
public $name;
}
这将允许这样的事情:
$product = $db->getRepository('Product')->find(1);
// Recording a new name
$product->name = "My new title";
$db->persist($product);
$db->flush();
// Echoing the title
echo $product->name;
优点是:
- 始终使用完全相同的名称
- 实体类中没有额外的 setter 和 getter
使用这个有什么缺点?我在这里承担了一定的风险吗?
【问题讨论】:
-
尽管有关于封装的帖子,但使用公共变量并没有错。然而,这样做意味着延迟加载不再起作用,因为 Doctrine 依赖于扩展 getter 来实现延迟加载。只要您总是提前加载数据,那么这不是问题。事实上,延迟加载通常是要避免的。
-
谢谢,但有很多不同的答案。所以我现在很困惑什么是正确的答案......?!
-
其他答案是主流。您可以默认使用它们。一旦你真正理解了这些论点,你就可以选择你自己的方式。在编程中,很少有单一的“最佳”方式。
标签: php doctrine-orm