如何解决Laravel - updateOrCreate 方法,是不是打破了编程原则
我在 Laravel 中发现 - Eloquent 的方法如 updateOrCreate()
。
为什么在框架中我们可以找到破坏干净代码和 SOLID 规则的方法?
解决方法
我认为您指的是 SOLID 中所述的单一职责原则。长话短说,是的,Laravel PHP 框架中的某些方法破坏了 SOLID,而不仅仅是在 Eloquent ORM 中。
这称为反模式,如Wikipedia中所述:
反模式是对反复出现的问题的常见反应,通常是无效的,并且有可能适得其反。
我们使用这种“反模式”的原因只是为了简单和生产力。取决于您的应用程序,使用 ORM(例如 Eloquent)处理数据有时会很复杂,这就是反模式来拯救的原因。
使用 eloquent,您可以使用 create()
添加一条新记录,使用 updateOrCreate()
添加一条新记录或更新它(如果它已经存在)。
这里没有违反任何原则,也不是反模式,根据定义,这是一种代码异味。
我不确定我们在这里讨论的具体实现,但一般来说,“更新或创建”操作必须是原子的,如果使用不同的创建、存在和更新操作来实现它会很麻烦。
>例如,假设客户端每次想要进行“更新或创建”时都必须编写以下代码。
if (!exists()) { // this check could be stale without proper locking
create();
} else {
update(); // record could have been deleted already
}
正如我们所看到的,这不仅是很多仪式,而且需要使用适当的锁定/重试来确保在我们执行 exists()
检查或反向删除之后没有立即插入记录在我们update()
之前。
“更新或创建”在概念上是一个单一的“合并”操作,它不能用一堆单独的方法在客户端有效地实现。如果他们叫它 merge
你就不会问这个问题 ;)
并不是因为方法名称中有“or”、“and”、“ifNeeded”或其他任何东西,所以它必然有太多的责任。这是一个强有力的指标,可能是这种情况,但请使用您自己的判断,不要盲目遵循原则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。