添加到控制器的内容和添加到模型的内容

What add to controller and what to models

我有个小问题。哪些数据保存在控制器中,哪些保存在模型中?我知道在模型中保留了应用程序等的整个逻辑,但是什么是查询和帮助函数?例如

控制器:

public function add(Request $request)
{
    $item = new Item()
    $item->name = $request->name;
    $item->save();

    $this->makeDirectory();
}

private function makeDirectory()
{
    //make a directory with photo this product
}

我应该将 "makeDirecory" 方法保存在控制器或模型中的什么位置?

这是另一种情况,我会从另一个 table 中删除产品和参考。

public function delete(Items $id)
{
    $id->delete();

    $this->deleteProperties($id->properties); // $id->properties is a method from Items model with references to table Properties
}

private function deleteProperties(Properties $id)
{
    $id->delete();
}

我应该在控制器、项目模型还是属性模型中保留 "deleteProperties" 方法?并从此模型调用此方法?

您应该将 makeDirectory() 之类的方法保留在 service class 中,并使用以下方式调用它:

$this->fileService->makeDirectory($directory);

您应该 keep data related logic in model classes or repository classes 并在控制器中使用它:

$this->model->getSomeData();

您可能还想 google "Fat models, skinny controllers".

关于辅助函数,你应该只在你真正需要的时候使用它们。例如,isAdmin() 是一个非常方便的全局帮助器,但您永远不应该创建像 getAllUsers()Helpers::getAllUsers()

这样的帮助器

我只使用控制器来验证传入数据并将数据传递给视图。

我添加了另一层 classes,我称之为部门。所以,我有一个部门负责个人资料、文章、信息页面等。每个部门都有自己的命名空间和一组与功能相关的 classes。

始终考虑 SoC - 关注点分离。如果将大量逻辑放入控制器中,它最终会变得庞大,难以维护和扩展。

示例:

控制器:

public function addItem (Request $request, Item $item, ItemStorage 
  $itemStorage) {

    if ($item->verifyInput($request->all())) {
        $itemStorage->createItem ($item, $request->all());
    }
    else {
        // ... handle input error
    }

    // ... view
}

App\Departments\Items:

class ItemStorage {

    public function createItem ($newItem, $attributes) {
        $newItem->create($attributes);
        // ...  prepare data for creating a directory
        $this->makeDirectory($directoryName);
    }

    private function makeDirectory ($directoryName) {
        //... create directory
    }
}

您 can/should 进一步分离任务。 ItemStorage 可能不需要处理实际的目录创建。您可以调用另一个 department/service class 名称,例如磁盘管理。该部门将包含 类,如 FileSystem。因此,在 makeDirectory() 方法内部,您可以从专门用于文件系统操作的 class 中调用一个方法。