Php 一个控制器和多个服务的设计模式

Php 一个控制器和多个服务的设计模式,php,design-patterns,model-view-controller,solid-principles,Php,Design Patterns,Model View Controller,Solid Principles,我目前在MVC中遇到以下问题,即正确的设计模式存在问题: 我有以下课程: GroupController GroupService GroupUserController GroupUserService LogService (一个组可能有多个用户) 对于每个控制器,我都有CRUD,可供具有特定角色的用户使用。 其中一个功能是登录用户可以创建组(GroupService)。如果他这样做了,那么他必须被自动分配到用户组(GroupUserService)。我还需要将信息记录到

我目前在MVC中遇到以下问题,即正确的设计模式存在问题:

我有以下课程:

GroupController   
GroupService 
GroupUserController  
GroupUserService   
LogService
(一个组可能有多个用户)

对于每个控制器,我都有
CRUD
,可供具有特定角色的用户使用。
其中一个功能是登录用户可以创建组(
GroupService
)。如果他这样做了,那么他必须被自动分配到用户组(
GroupUserService
)。我还需要将信息记录到
LogService
用户创建组的时间和方式(通过
CRUD
或通过仅适用于特定角色的方法)

目前我有这样的想法:

// GroupController.php
// Create new group
public function setAction()
{
    //code...

    if ($this->getRequest()->isPost()) {
        $data = $this->request->getPost()->toArray();
        $form->setData($data);

        if ($form->isValid()) {
            $data = $form->getData();
            $result = $groupService->save($data, $data['id']);

            // Add user to that group
            if ($result) {
                $groupUserData = [
                    'group' => $result->getId(),
                    'user' => $user->getId()
                ];
                $result2 = $groupUserService->save($groupUserData); // <---- service which shouldn't be here?

                if ($result2) {
                    // Some other action let's say with another service
                }

                $logData = [
                    'msg' => 'New Group created!',
                    'created_at' => new \DateTime()
                ];
                $logService->save($logData); // <---- this service shouldn't be also here?
            }

            $this->redirect()->toRoute($this->route);
        }
    }

    return $this->viewModel;
}
//GroupController.php
//创建新组
公共函数setAction()
{
//代码。。。
如果($this->getRequest()->isPost()){
$data=$this->request->getPost()->toArray();
$form->setData($data);
如果($form->isValid()){
$data=$form->getData();
$result=$groupService->save($data,$data['id']);
//将用户添加到该组
如果($结果){
$groupUserData=[
'group'=>$result->getId(),
'user'=>$user->getId()
];
$result2=$groupUserService->save($groupUserData);//“已创建新组!”,
'created_at'=>new\DateTime()
];

$logService->save($logData);//我认为可以使用facade模式,它旨在封装/隐藏某些过程的复杂性

因此,您可以创建一个包含一个方法的类,该方法保存您的所有操作逻辑,并且只需从操作中调用它


关于您的状态,我认为您可能还需要一个事务来包装您的查询。

分层体系结构可能会有所帮助,尤其是六边形体系结构:

据我所知,沃恩·弗农(Vaughn Vernon)在下一本书中提供了最佳实用指南:

总体思路:表示逻辑(请求/表单处理)需要与应用程序逻辑(用例流逻辑)和域逻辑(创建和保存组用户数据)分离