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 继承以避免重复代码。
当我有一些实体并且我想保存、验证或删除时。为什么我必须调用 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 继承以避免重复代码。