gpt4 book ai didi

laravel - 我应该在哪里保存 Laravel MVC 中的模型?

转载 作者:行者123 更新时间:2023-12-04 11:42:15 26 4
gpt4 key购买 nike

我正在尝试更具体地了解 MVC 并保持 Controller 层尽可能薄。

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

查看 Laravel 文档,他们将数据设置为模型并在 Controller 中调用 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();
}
}

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

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

那么我会在模型本身内部调用 save 吗?还是应该使用服务层?

这是我当前的示例数据问题。

我正在更新模型的状态。该行已存在于数据库中。我使用 PATCH/route/来访问 Controller 方法。从那里我得到了模型。
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();
}
}

我是否采用上述方法?或者我是否创建一个服务层,我将在其中使用模型实例调用模型函数,然后在模型上调用保存?
//in service class
public function makeTestAsPassed($test){
$test->passed();
$test->save();

}

如果需要任何澄清,请告诉我。

最佳答案

您说得对,业务逻辑属于模型。如果您对应用程序采用“资源丰富”的方法(即围绕实体创建 Controller ),那么您会发现您的 Controller 操作很少调用多个模型方法。

而不是拨打 save() ,您可以拨打create()update()模型上的方法。在您的 store() Controller Action ,你可以用这样的一行创建一个新实体:

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

并更新 update() 中的现有模型像这样的 Action :

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

当涉及到业务逻辑时,您也可以在模型上调用其他方法。要使用资源丰富的 Controller ,您不必拥有与数据库表相关的模型。

接受运送订单。大多数人会想把 ship() OrderController 中的方法,但是当您发货时会发生什么?运送订单会导致什么实体?好吧,您将创建一个货件,因此它可能是 store() OrderShipmentController 上的方法.此 store()然后方法可以只调用 ship()您的方法 Order模型:

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

如您所见,使用资源丰富的 Controller 和 route–model binding ,您可以在模型中使用带有应用程序业务逻辑的“瘦 Controller ”。

关于laravel - 我应该在哪里保存 Laravel MVC 中的模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48996760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com