Cakephp 3:从实体调用表函数是一个坏主意还是好主意?

时间:2016-04-13 08:52:22

标签: cakephp model entity cakephp-3.0

当我有一些实体时,我想保存,验证或删除。为什么我必须调用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);
    }

}

它正在运作,但我想知道这是一种不好的做法还是一个好主意。

提前致谢:)

1 个答案:

答案 0 :(得分:4)

TL; DR:从技术上讲,你可以以高价紧密耦合(这被认为是不良做法)来做到这一点。

说明:我不会考虑这种最佳做法,因为该实体应该是一个愚蠢的数据对象。它不应包含任何业务逻辑。通常,它不仅仅是一个简单的保存调用,而且还有一些后续逻辑可以实现:处理保存的成功和失败,并通过更新UI或发送响应来相应地执行操作。此外,您有效地将实体与特定表耦合。您将一个哑数据对象转换为实现业务逻辑的对象。

从技术上讲,你可以这样做,我认为有这样做的框架或ORM,但我不喜欢耦合事物。我更喜欢尽可能地尝试编写代码。 See also SoC

此外,我认为您不会使用自己的方法保存任何代码行,只需将其移至其他位置即可。我认为没有任何好处可以证明引入将实体耦合到业务逻辑的合理性。

如果你走你的路径,我会将该方法实现为特征或使用基本实体类继承以避免重复代码。