gpt4 book ai didi

php - 什么时候在 Laravel 中使用 Repository vs Service vs Trait?

转载 作者:行者123 更新时间:2023-12-04 21:46:54 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

12 个月前关闭。




Improve this question




为了避免 Laravel 中的代码重复,我想要一个由多个 Controller 使用的方法,它在数据库中插入一些行并更新另一个表中的一些数据。

我想过使用 Repository,但我在某处读到 Repository 更适合用于检索数据,不应该用于插入。

所以我现在要使用 Traits。但我有点困惑...

有人可以简单地解释一下这些(存储库/服务/特征)中每一个的最佳用法是什么,它们有什么不同?

最佳答案

性状
是一种替代的继承方法,解决了单类继承的一些局限性,PHP使用。这通常用于跨模型共享相似的逻辑。假设有几个模型具有 Company 关系。

trait HasCompany {
public function company() {
return $this->belongsTo(Company::class);
}
}
现在,用户可以通过关键字 using 轻松共享来自 trait 的代码。 .这是一个示例,需要更复杂的用例才能使其有意义。
class User {
use HasCompany;
}
存储库
存储库是一种从应用程序中抽象数据层的设计模式。你的逻辑不应该关心你如何存储数据,所以如果你想从 Mysql 改变至 Mongodb ,您只需换出存储库,而不必更改业务逻辑。
这里非常自以为是,但这不是 Laravel 的合适设计模式. Laravel有 Eloquent,因此数据库层已经被抽象出来。存储库有时用于 Laravel应用程序,而是一个异常值,而不是一个常见的景象。存储库的主要原因之一是与数据实现无关,它已经存在并且您可以在 SQL 服务器之间完美地交换。还有 Eloquents功能如 ::find() , scopes etc. 感觉就像是 Repositories 的替代品,同时使用起来很古怪。
如果您使用 Doctrine 作为 ORM ,您可以在 Laravel ,它是他们架构的核心,应该使用。
服务
通常用于在应用程序中存储业务逻辑或操作的构建块的地方。在传统 MVC设计, Controller 应该只处理输入。通常你会把你的逻辑放在模型中,但它们很快就会“变胖”,当这种情况发生时,服务是放置业务逻辑的常见地方。有时也命名 Action 或命令,它们是类似但有点不同的方法。
它解决的核心问题之一是使您的业务逻辑可重用。当您在其 Controller 中检索它时,通过事件标志对所有用户进行成像过滤。
public function all() {
return User::where('active', true)->get();
}
现在你有了你的业务逻辑,它强制你只对活跃用户工作,稍后你想通过使用命令的通知通过电子邮件通知所有活跃用户。
class NotifyUsers extends Command {
public function handle() {
foreach (User::where('active', true)->get() as $user) {
$user->notify();
}
}
}
现在您必须手动保持业务逻辑最新,下次您添加第二个条件或类似条件时,因此必须在两个地方更改代码。在大型应用程序中,很难在多个地方维护条件。如果你用这个逻辑做一个服务。您可以在整个应用程序中使用相同的业务逻辑,并且只需将其维护在一处。
class UserService {
public function all() {
return User::where('active', true)->get();
}
}
无论您想在何处使用此业务逻辑来获取活跃用户,都可以使用该服务。因此只有一个地方来维护逻辑。一个电话可以像 resolve(UserService::class)->all() 一样简单.带有服务的更新逻辑的示例是。
// controller
public function all(UserService $userService) {
return $userService->all();
}

// command
class NotifyUsers extends Command {
public function handle(UserService $userService) {
$userService->all()->each->notify();
}
}
结论
世界不是非黑即白的,你必须弄清楚你自己的方法。我的建议是,不要花时间在存储库上, Laravel有很多功能可以处理数据相关的操作 scopes , getters setters等与存储库设计模式冲突的。看看像设计方法这样的服务是否适合您,您可以使用它们。 Traits与服务和存储库无关,它只是一个类似于类继承的工具,用于在对象之间共享逻辑。

关于php - 什么时候在 Laravel 中使用 Repository vs Service vs Trait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com