从控制器调用Laravel模型?这是正确的方法吗?

从控制器调用Laravel模型?这是正确的方法吗?,laravel,laravel-5,Laravel,Laravel 5,我正在尝试拆分一些代码,让模型处理所有数据库内容,比如创建、检索等 当时所有的代码都在控制器中,我很快意识到代码非常混乱,所以我想做如下事情: public function incompletedEntity(EntityRequestPartial $request) { $partial_entity = EntityTrash::saveEntity(); } 我的模型是: public static function saveEntity(Request $request)

我正在尝试拆分一些代码,让模型处理所有数据库内容,比如创建、检索等

当时所有的代码都在控制器中,我很快意识到代码非常混乱,所以我想做如下事情:

public function incompletedEntity(EntityRequestPartial $request)
{
    $partial_entity = EntityTrash::saveEntity();
}
我的模型是:

public static function saveEntity(Request $request)
    {
        $entity  = new EntityTrash();
        $entity->lat = $request->input('lat');
        $entity->lng = $request->input('lng');
        $entity->slug = $request->input('name');
        $user_id = Auth::id();
        $entity->name = $request->input('name');
        $entity->type = $request->input('type');
        $entity->email = $request->input('email');
        $entity->tags = $request->input('tags');
        $entity->slug = $user_id;
        $entity->building_name = $request->input('building_name');
        $entity->address = $request->input('address');
        $entity->town = $request->input('town');
        $entity->postcode = $request->input('postcode');
        $entity->telephone = $request->input('telephone');
        $entity->save();
    }

但是,我不能调用该函数,因为我没有从控制器传递参数,正确的方法是什么?我应该在控制器中执行$request->input并将其分配给数组吗?并在控制器中处理它?

如果您希望拆分代码,以便控制器不接触模型,我建议您查看存储库模式

这背后的想法是,在您的控制器中

$this->entityRepository->create($data);
可以传入数组,也可以传入每个单独的属性

$this->entityRepository->create($lat, $lng, $name, $type..etc);
这样,控制器就可以检索所有数据并对其进行验证

$data = $request->only(['lat', 'lng', 'name', 'type', 'email', 'tags', ..etc]);
$validator = Validator::make($data, ['name' => ['required']]);
显然,您可以使用请求验证或任何您熟悉的方法

这样,您的控制器负责接收数据并对其进行验证。然后,它可以盲目地将它传递给存储库,知道它是有效的,并且相信存储库会完成它的工作


作为补充说明,我强烈建议您不要让模型直接与请求对象交互。
lighting\Http\Request
类属于Http层,模型属于持久层。这两个层永远不应该知道另一层的存在。

如果您希望拆分代码以便控制器不接触模型,我建议您查看存储库模式

这背后的想法是,在您的控制器中

$this->entityRepository->create($data);
可以传入数组,也可以传入每个单独的属性

$this->entityRepository->create($lat, $lng, $name, $type..etc);
这样,控制器就可以检索所有数据并对其进行验证

$data = $request->only(['lat', 'lng', 'name', 'type', 'email', 'tags', ..etc]);
$validator = Validator::make($data, ['name' => ['required']]);
显然,您可以使用请求验证或任何您熟悉的方法

这样,您的控制器负责接收数据并对其进行验证。然后,它可以盲目地将它传递给存储库,知道它是有效的,并且相信存储库会完成它的工作


作为补充说明,我强烈建议您不要让模型直接与请求对象交互。
lighting\Http\Request
类属于Http层,模型属于持久层。这两层永远不应该知道另一层的存在。

一般来说,您的模型永远不应该依赖于请求对象。模型可用于对数据库或其他存储区域的任何访问。许多访问点可能根本不是HTTP

您的HTTP控制器应始终用于将信息从HTTP请求传递到应用程序的更深层(例如模型)。因此,如果您在任何地方使用请求对象,它应该位于HTTP控制器中


我认为,重要的是,您要了解为什么控制器层存在,以及为什么我们不只是拥有模型和视图。

一般来说,您的模型不应该依赖于请求对象。模型可用于对数据库或其他存储区域的任何访问。许多访问点可能根本不是HTTP

您的HTTP控制器应始终用于将信息从HTTP请求传递到应用程序的更深层(例如模型)。因此,如果您在任何地方使用请求对象,它应该位于HTTP控制器中


我认为,重要的是,您应该回顾一下为什么控制器层存在,为什么我们没有模型和视图。

我建议您先看看正式的Laravel文档:以及控制器/雄辩的模型章节。此外,当前Laracon的Adam Wathans演讲是进一步重构的好读物

首先,利用Laravel控制器的CRUD模式以及雄辩的模型。然后通过创建/保存方法将验证数据传递给模型

<?php

namespace App\Http\Controllers;

use App\EntityTrash;
use App\Http\Controllers\Controller;

class EntityTrashController extends Controller
{
    public function create(EntityRequestPartial $request)
    {
         return EntityTrash::create($request->only(['lat', 'lng', 'name', 'type', 'email', ...]));
    }
}

我建议您先看看正式的Laravel文档:以及控制器/雄辩的模型章节。此外,当前Laracon的Adam Wathans演讲是进一步重构的好读物

首先,利用Laravel控制器的CRUD模式以及雄辩的模型。然后通过创建/保存方法将验证数据传递给模型

<?php

namespace App\Http\Controllers;

use App\EntityTrash;
use App\Http\Controllers\Controller;

class EntityTrashController extends Controller
{
    public function create(EntityRequestPartial $request)
    {
         return EntityTrash::create($request->only(['lat', 'lng', 'name', 'type', 'email', ...]));
    }
}

您应该将所有CRUD方法保留在控制器中。。。该模型只需要定义getter和setter并设置可填充属性。。。该模型仅用于定义getter和setter以及设置可填充属性。