Laravel 和一般 PHP 中的计算字段

Calculated fields in Laravel and general PHP

在 Laravel / PHP 中,创建访问器和修改器以从数据库转换或创建动态字段很容易。

虽然在您的应用程序中复制相同的逻辑太容易了,但当您不通过 ORM 模型(例如直接查询)访问相同的数据时。

$order->totalPlusTax; // (total * 10%)

计算该字段的逻辑应一次性编写,可测试且不绑定到 ORM 中。

围绕此逻辑的最佳实践或设计模式是什么?

设计模式已经演变为一种组织代码并为我们的代码提供性能提升的方式。他们经常解决非常具体的问题。您的问题非常广泛,几乎任何设计模式都可以在某种程度上解决它。

例如,如果您有在创建对象之前检查数据库的特定条件的逻辑,那么它将存在于该对象工厂 class 中,而不是其他任何地方。如果您有通过检查数据库中的条件来查找对象的逻辑,那么该逻辑将存在于存储库 class 中,而无处可寻。

您的问题的解决方案不是一种特定的设计模式。许多设计模式、OO classes 和方法以及遵循 SOLID 原则都解决了这个问题。

旁注:

如果这不是您所期待的答案,我们深表歉意。几年前,当我开始研究设计模式和社区最佳实践时,我实际上发现自己处于类似的位置。

我认为我们作为编码人员有时遇到的问题是我们将逻辑思维过于字面地应用到所有事情上。当我研究设计模式和最佳实践时,我经常会花几天的时间来找出实现某些东西的正确方法。对此的答案不是设计模式或社区最佳实践。答案是:

The correct code to write is the code that makes a test pass, where that test validates some value is being delivered to the business.

我并不是说只写任何旧代码,但在开始编写一些代码之前,您通常不知道要使用什么设计模式。因此,最好的起点是编写使您的应用程序正常工作的代码:Kent Beck 对此的建议:

Make it work, make it right, make it fast.

"make it right" 部分是您将代码重构为设计模式等的地方。您需要查看您的代码库,看看哪里有共同的元素。通常它只是将通用逻辑重构为 class 或方法的情况。有时候会用到你提到的设计模式。

显然,有时您对最终解决方案有很好的想法并且可以预先使用设计模式(Active Record、MVC 等),但在您的情况下,您似乎只有在开始看到一些设计模式时才会知道重复的逻辑。恐怕这只是查看一些设计模式并查看它们是否适合您的情况,但我想说的是将通用代码重构为单独的 class 或方法。这就是您正在寻找的社区最佳实践。