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

时间:2017-08-30 12:24:05

标签: laravel laravel-5

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

目前所有代码都在控制器中,我很快发现代码非常混乱,所以我想做这样的事情:

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-&gt;输入并将其分配给数组吗?并在控制器中处理它?<​​/ p>

3 个答案:

答案 0 :(得分:0)

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

这背后的想法是在你的控制器中你有

$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']]);

显然,您可以使用请求验证或任何您熟悉的内容。

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

作为旁注,我强烈建议您不要让模型直接与Request对象进行交互。 Illuminate\Http\Request类属于HTTP层,模型属于持久层。这两层永远不应该知道另一层的存在。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我建议您首先查看官方的Laravel文档:https://laravel.com/docs和Controller / Eloquent Model章节。此外,Adam Wathans对当前Laracon的Github讲话是对进一步重构的好读。

首先,除了Eloquent模型之外,还可以使用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', ...]));
    }
}

最后,也许存储库模式也可​​以改进您的代码。