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

Cakephp 3: Calling Table functions from Entity is a bad or good idea?

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

}

这是有效的,但我想知道这是一个坏习惯还是一个好主意。

提前致谢:)

TL;DR: 从技术上讲,您可以以紧耦合的高代价(这被认为是不好的做法)做到这一点。

解释:我不会考虑这个最佳实践,因为实体应该是一个哑数据对象。它不应包含任何业务逻辑。通常它不仅仅是一个简单的保存调用,还有一些后续逻辑要实现:处理保存的成功和失败,并通过更新 UI 或发送响应来相应地采取行动。您还可以有效地将实体与特定 table 耦合。您将一个哑数据对象变成了一个实现业务逻辑的对象。

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

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

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