【发布时间】:2023-11-07 14:01:02
【问题描述】:
我试图更具体地了解 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 吗?还是我应该使用服务层?
这是我当前的示例数据问题。
我正在更新模型的状态。该行已存在于数据库中。我使用 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();
}
如果需要任何说明,请告诉我。
【问题讨论】:
-
使用 setter 并调用 save 不是业务逻辑。 save的实现就是业务逻辑。
-
这是一个很好的问题,但也完全不适合 *。关于这个话题有很多不同的意见,这并不是一个只有一个特定正确答案的问题。
-
@JoelHinz 你认为我应该在哪里发布这样的问题?我觉得应该就正确的方法达成共识。
-
@Devon 所以设置模型值并保存在控制器方法中是一种好的做法吗?
-
我想是的。有些人可能决定使用 Repository 模式不让您的应用程序依赖于 Eloquent,但除此之外,使用 save() 或 create() 是您应该从控制器执行的操作,仅此而已。
标签: laravel model-view-controller updating service-layer