首页 文章

我应该在Laravel MVC中保存模型?

提问于
浏览
0

我试图更加具体地了解MVC并尽可能保持控制器层的薄 .

我一直在问自己的一件事是“我应该在哪里调用modelname-> save()?”

查看Laravel文档,他们将数据设置为模型并在控制器中调用save似乎不对...

<?php

namespace App\Http\Controllers;

use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class FlightController extends Controller
{
    public function store(Request $request)
    {
        // Validate the request...

        $flight = new Flight;

        $flight->name = $request->name;

        $flight->save();
    }
}

这是一个非常简单的示例,可能就是他们在控制器中完成所有操作的原因 .

根据我的理解和我一直在阅读的所有内容,所有业务逻辑都应该位于模型中,控制器负责视图和模型之间的“流量控制” .

那么我会在模型内部调用save吗?或者我应该使用服务层?


这是我目前的示例数据问题 .

我正在更新模型的状态 . 该行已存在于DB中 . 我使用PATCH / route /来获取控制器方法 . 从那里我得到了模型 .

class TimecardController extends Controller {
...
    public function markAsPass(Request $request, $id) {
        $test = Test::findOrFail($id);

        //I don't think this is the corect way  
        //$test->status = "passed";
        //$test->markedBy = "Teacher123";
        //$test->save();


        $test->passed();
        ...
        return redirect($redirect_url);
    }
}

class Test extends Model {
...
    public function passed() {
        $this->status = "passed";

        //would I call save here? 
        //$this->save();
    }
}

我采取上述方法吗?或者我是否创建了一个服务层,我将使用模型实例来调用模型函数,然后在模型上调用save?

//in service class
public function makeTestAsPassed($test){
    $test->passed();
    $test->save();

}

如果需要任何条款,请告诉我 .

2 回答

  • 0

    你是对的,因为业务逻辑属于模型 . 如果您对应用程序采取“足智多谋”的方法(因为您在实体周围创建控制器),那么您将发现控制器操作很少调用多个模型方法 .

    您可以在模型上调用 create()update() 方法,而不是调用 save() . 在 store() 控制器操作中,您可以使用如下一行创建一个新实体:

    public function store(CreateRequest $request)
    {
        $model = Model::create($request->all());
    }
    

    并在 update() 动作中更新现有模型,如下所示:

    public function update(UpdateRequest $request, Model $model)
    {
        $model->update($request->all());
    }
    

    在业务逻辑方面,您也可以在模型上调用其他方法 . 要使用资源丰富的控制器,您不必拥有与数据库表相关的模型 .

    发货订单 . 大多数人都会试图将 ship() 方法放在 OrderController 中,但是当您发出订单时会发生什么?哪个实体可以发送订单结果?好吧,你要创建一个货件,所以这可能是 OrderShipmentController 上的 store() 方法 . 这个 store() 方法可以在 Order 模型上调用 ship() 方法:

    class OrderShipmentController extends Controller
    {
        public function store(ShipOrderRequest $request, Order $order)
        {
            $order->ship();
        }
    }
    

    正如您所看到的,通过资源丰富的控制器和route–model binding,您可以将“瘦调控制器”与应用程序的业务逻辑一起存储在您的模型中 .

  • -1

    MVC旨在简化维护 . 你不认为“好”的方法是正确的方法 . 与业务逻辑相关的所有数据处理都在控制器中 . 否则,不同的编码器会因为他/她在控制器代码中找不到数据操作逻辑而感到困惑 .

    你的瘦控制器目标击败了MVC .

    另请注意,模型代码的目的是为了精简,因为它是将数据库模式定义为数据库表的镜像的位置 .

    MVC不是面向对象的abstration . MVC是代码维护一致性的结构 .

相关问题