问题描述
我的问题是:如何将我的业务逻辑从控制器中取出并将其转移到服务中??? 我目前在 Laravel 中为 Post 模型使用两个单独的控制器。一种用于用户相关逻辑,一种用于管理员相关逻辑。 AdminPostController 的伪代码:
class AdminPostController
{
public function index(MaybyIndexRequest $request)
{
$something = do lines of calculation
return return PostResource::collection($something);
}
public function storeAdminPost(StorePostRequest $request)
{
$something = do lines of calculation
return return PostStoreResource::collection($something);
}
}
UserPostController 的伪代码:
class UserPostController
{
public function maybyUserindex(AnotherIndexRequest $request)
{
$something = do lines of calculation
return return UserPostResource::collection($something);
}
public function storeUserPost(OtherStorePostRequest $request)
{
$something = do lines of calculation
return return UserPostStoreResource::collection($something);
}
}
我想将这两个控制器的业务逻辑转移到另一个类,并在例如 Facade 的帮助下调用它们: 类 AdminPostController { 公共函数索引(MaybyIndexRequest $request) { $something = PostService::($request); 返回返回 PostResource::collection($something); }
public function storeUserPost(StorePostRequest $request)
{
$something = PostService::Store($request);
return return PostStoreResource::collection($something);
}
}
但我不知道我应该用什么设计模式来做这件事。或者我正在寻找的不是从控制器中获取代码的好方法!!! 我想到了解决这个问题的方法: 工厂模式:一个具有两个方法的类,称为 user() 和 admin()。
class PostFactory
{
public function AdminCommands()
{
return new AdminPostCommands(); // a class that contains admin
}
public function UserCommands()
{
return new UserPostCommands(); // a class that contains user related logics
}
}
那个用户方法返回一个 UserPostCommands 类的实例(包含用户的逻辑)和 AdminCommands 类的方法(包含 post 的逻辑).... 或 :
class PostFactory
{
public function Factory(User $user)
{
if ($user->isAdmin){
return new AdminPostCommands(); // a class that contains admin
}else{
return new UserPostCommands(); // a class that contains user related logics
}
}
一个类,它需要一个授权用户的实例来决定是否应该返回 AdminPostCommands 或 UserPostCommands 类。这两个类(AdminPostCommands 或 UserPostCommands)中的每一个都有不同的方法。例如,用户可能无法删除帖子。当然,与用户相关的方法只会在用户控制器中使用,反之亦然。
解决方法
看起来你偏离了 Laravel 的标准约定。
也许,花一些时间了解它们可能是值得的。例如,https://laravel.com/docs/8.x/controllers#resource-controllers 关于如何构建控制器。
//dimens.xml
<dimen name="section_height" tools:ignore="ResourceCycle">@dimen/section_height</dimen>
//dimens.xml(port)
<dimen name="section_height">280dp</dimen>
//dimens.xml(land)
<dimen name="section_height">60dp</dimen>
应该简单地为 storeUserPost
,您在 UserPost 控制器中,因此这意味着您存储的内容将是 UserPost。任何所需的逻辑都可以移至事件或服务/实用程序类。
https://laravel.com/docs/8.x/events#introduction
通常来说,控制器不应做的不仅仅是使用新数据查询/存储/更新模型或调用其他执行逻辑并返回视图或重定向的类。