当我有一些实体时,我想保存,验证或删除。为什么我必须调用Table方法?例如:
$articlesTable = TableRegistry::get('Articles');
$article = $articlesTable->get(12);
$article->title = 'CakePHP is THE best PHP framework!';
$articlesTable->save($article);
为什么不这样:
$article->save();
或$article->delete();
实施起来非常简单:
在我的文章实体上,我可以这样做:
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
public function save()
{
$table = TableRegistry::get($this->source());
$table->save($this);
}
}
它正在运作,但我想知道这是一种不好的做法还是一个好主意。
提前致谢:)
答案 0 :(得分:4)
TL; DR:从技术上讲,你可以以高价紧密耦合(这被认为是不良做法)来做到这一点。
说明:我不会考虑这种最佳做法,因为该实体应该是一个愚蠢的数据对象。它不应包含任何业务逻辑。通常,它不仅仅是一个简单的保存调用,而且还有一些后续逻辑可以实现:处理保存的成功和失败,并通过更新UI或发送响应来相应地执行操作。此外,您有效地将实体与特定表耦合。您将一个哑数据对象转换为实现业务逻辑的对象。
从技术上讲,你可以这样做,我认为有这样做的框架或ORM,但我不喜欢耦合事物。我更喜欢尽可能地尝试编写代码。 See also SoC
此外,我认为您不会使用自己的方法保存任何代码行,只需将其移至其他位置即可。我认为没有任何好处可以证明引入将实体耦合到业务逻辑的合理性。
如果你走你的路径,我会将该方法实现为特征或使用基本实体类继承以避免重复代码。