【问题标题】:What add to controller and what to models什么添加到控制器和什么模型
【发布时间】:2018-06-15 00:20:06
【问题描述】:

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

控制器:

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”方法保存在控制器或模型中的什么位置?

这是我从另一个表中删除产品和引用的另一种情况。

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();
}

我应该在控制器、Items 模型或 Properties 模型中保留“deleteProperties”方法吗?并从此模型调用此方法?

【问题讨论】:

  • 应用程序有多大?你对 Laravel 的熟练程度如何?
  • 你知道,我创建了商店并重构了代码。我的高手?我从 laravel(供应商目录)学习了工作方法/类。

标签: php laravel model-view-controller methods private


【解决方案1】:

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

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

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

$this->model->getSomeData();

您可能还想在 Google 上搜索“胖模型,瘦控制器”。

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

【讨论】:

  • 我是这么认为的,谢谢!如果我有更多的声誉,我会给你点:)
  • @Piffek 没问题,很高兴它有帮助。
  • Laravel 用户搜索“胖模型,瘦控制器”并没有什么意义,因为 Twatwell 将名称应用于 active record 的实例。在其中添加更多逻辑实际上只会让事情变得更糟。
【解决方案2】:

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

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

始终考虑 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
}

应用\部门\项目:

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
    }
}

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

【讨论】:

  • 这个部门有DI模型课吗?它们是如何工作的?我可以举个例子吗?
  • 让我为你举几个例子。模型就是模型,它们携带您的数据和与数据库的连接。部门是包含业务逻辑的服务
  • 好的,但是服务和部门之间有什么区别?
  • 只是我的命名 :) 服务可能更好。关键是将业务逻辑放在控制器之外。但我也建议使用外部模型。 Laravel 不会强迫你进入更多的类层,但是拥有它们并分离业务逻辑是很好的。
  • @Piffek 我使用部门,因为我的项目更大。所以,实际上,我的部门包含服务类,以及其他几个支持类。这真的取决于项目有多大。希望它有一点帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多