Laravel 存储库和多个相关模型
Laravel Repositories and multiple related models
我目前刚开始将一个大型 Yii2 应用程序移植到 Laravel,我正在考虑使用存储库来解决我当前的混乱控制器和臃肿模型的问题。
我查看了大量的存储库示例,但其中大多数仅涵盖简单的 CRUD。例如,在我当前的应用程序中,用户可以在多个位置创建,并且必须使用其他表中的 5 条相关记录创建,例如,必须将用户添加到组中,并且必须根据其角色创建权限记录。
目前我几乎所有的模型都有一个可以在任何地方重复使用的自定义创建函数。这是我正在谈论的一个非常基本的 Yii2 示例。
用户模型中的用户创建示例:
public static function create(array $attributes, array $group_ids)
{
$user = new User;
$user->attributes = $attributes;
$user->save();
$role = $user->role;
foreach ($role->rolePermissions as $role_permission) {
UserPermission::create($user->id, $role_permission);
}
foreach ($group_ids as $group_id) {
GroupUser::create($user->id, $group_id)
}
if ($role->admin_mode) {
// send welcome email
}
return $user;
}
在这种情况下,将 UserPermission 和 GroupUser Repositories 简单地注入到我的 UserRepository 中是否是一种好的做法?您如何处理在 Repositories 中保存相关记录?
有没有人有更高级的使用 Repositories 和相关模型的例子?
你要明白,在 Repository 模式中,repository 不是存储你的业务逻辑的地方,这就是为什么它们很简单,只做 CRUD。
您在这里需要的是存储库顶部的业务逻辑层。我对我最近的项目所做的是,我在我的 app
根目录中创建了一个 Services
文件夹,并在其中使用我的主要业务逻辑在其中创建了各种服务,例如 $userService->createUser(..)
,并在其中检查不同的角色、组、发出事件、发送电子邮件。
因此,典型的调用可能如下所示:
调用 UsersController->createUser
调用UserService->createUser
- 验证、检查、抛出错误
- 调用 UserRepository->创建
- 调用 GroupUserRepository->创建
- 发出 UserCreated 事件
(脱节:事件侦听器)
- 专用侦听器侦听了 UserCreated 事件
- 调用UserService->sendWelcomeEmail
- 发送欢迎邮件
因此服务与您的胖模型几乎相同,但它们是独立的 php 类 了解您的业务逻辑,使用它知道的任何数据库,并处理请求和 return结果。它不依赖于任何东西来实例化一个,因此任何人都可以包含它来使用它。它们也可以根据您的需要实例化为单例或实例。
旁注
我在创建存储库上浪费了太多时间,而我本可以使用 Eloquent。它们并不相同,但我无法预见我的项目会更改底层 DBMS,因此我通常会直接在我的服务层中使用 eloquent。
我目前刚开始将一个大型 Yii2 应用程序移植到 Laravel,我正在考虑使用存储库来解决我当前的混乱控制器和臃肿模型的问题。
我查看了大量的存储库示例,但其中大多数仅涵盖简单的 CRUD。例如,在我当前的应用程序中,用户可以在多个位置创建,并且必须使用其他表中的 5 条相关记录创建,例如,必须将用户添加到组中,并且必须根据其角色创建权限记录。
目前我几乎所有的模型都有一个可以在任何地方重复使用的自定义创建函数。这是我正在谈论的一个非常基本的 Yii2 示例。
用户模型中的用户创建示例:
public static function create(array $attributes, array $group_ids)
{
$user = new User;
$user->attributes = $attributes;
$user->save();
$role = $user->role;
foreach ($role->rolePermissions as $role_permission) {
UserPermission::create($user->id, $role_permission);
}
foreach ($group_ids as $group_id) {
GroupUser::create($user->id, $group_id)
}
if ($role->admin_mode) {
// send welcome email
}
return $user;
}
在这种情况下,将 UserPermission 和 GroupUser Repositories 简单地注入到我的 UserRepository 中是否是一种好的做法?您如何处理在 Repositories 中保存相关记录?
有没有人有更高级的使用 Repositories 和相关模型的例子?
你要明白,在 Repository 模式中,repository 不是存储你的业务逻辑的地方,这就是为什么它们很简单,只做 CRUD。
您在这里需要的是存储库顶部的业务逻辑层。我对我最近的项目所做的是,我在我的 app
根目录中创建了一个 Services
文件夹,并在其中使用我的主要业务逻辑在其中创建了各种服务,例如 $userService->createUser(..)
,并在其中检查不同的角色、组、发出事件、发送电子邮件。
因此,典型的调用可能如下所示:
调用 UsersController->createUser
调用UserService->createUser
- 验证、检查、抛出错误
- 调用 UserRepository->创建
- 调用 GroupUserRepository->创建
- 发出 UserCreated 事件
(脱节:事件侦听器)
- 专用侦听器侦听了 UserCreated 事件
- 调用UserService->sendWelcomeEmail
- 发送欢迎邮件
- 调用UserService->sendWelcomeEmail
- 专用侦听器侦听了 UserCreated 事件
因此服务与您的胖模型几乎相同,但它们是独立的 php 类 了解您的业务逻辑,使用它知道的任何数据库,并处理请求和 return结果。它不依赖于任何东西来实例化一个,因此任何人都可以包含它来使用它。它们也可以根据您的需要实例化为单例或实例。
旁注
我在创建存储库上浪费了太多时间,而我本可以使用 Eloquent。它们并不相同,但我无法预见我的项目会更改底层 DBMS,因此我通常会直接在我的服务层中使用 eloquent。