将逻辑从控制器移动到服务的最佳方式是什么



我的问题是:如何将我的业务逻辑从控制器中取出并将其传输到服务??我目前在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){$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
}
}

user方法返回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类应该返回。这两个类(AdminPostCommandsUserPostCommands)都有不同的方法。例如,用户可能无法删除帖子。当然,与用户相关的方法只能在用户控制器中使用,反之亦然。

看起来你偏离了Laravel的标准约定。

也许,花点时间了解它们是值得的。例如,https://laravel.com/docs/8.x/controllers#resource-controllers关于如何构建控制器。

storeUserPost应该是store,你在UserPost控制器中,所以这意味着你存储的将是一个UserPost。所需的任何逻辑都可以移动到事件或服务/实用程序类中。

https://laravel.com/docs/8.x/events介绍一般来说,控制器不应该做比查询/存储/使用新数据更新模型或调用其他执行逻辑并返回视图或重定向的类更多的事情。

相关内容

  • 没有找到相关文章

最新更新