Php 在一个控制器中使用两个模型是否不好
我们使用的是Php 在一个控制器中使用两个模型是否不好,php,laravel,Php,Laravel,我们使用的是Laravel,我们有多个模型控制器 例: Model1和Model2以及它们对应的控制器Controller1和Controller2。每次为Model1创建新条目时,我们都需要为Model2创建一个新条目 问题是,在Model1和Controller1 public function store(Request $request) { //Create new Model1 $model1 = new Model1; $model1->bla = "
Laravel
,我们有多个模型控制器
例:
Model1
和Model2
以及它们对应的控制器Controller1
和Controller2
。每次为Model1
创建新条目时,我们都需要为Model2
创建一个新条目
问题是,在Model1
和Controller1
public function store(Request $request)
{
//Create new Model1
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
//Create new Model2
$model2 = new Model2;
$model2->bla = "Model2";
$model2->save();
}
这不是好的做法。通常在OOP中有一个重要的原则叫做“单一责任原则”。根据这一点,一个函数或模块应该只有一个职责。(虽然最初它是一个“类”,但应该有一个责任。) 在我看来,更好的方法是
public function store(Request $request)
{
Model1::StoreNewData();
Model2::StoreNewData();
}
//And then in model1 and model2 implement the store function.
public static function StoreNewData()
{
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
return;
}
拉威尔:具体来说,你应该争取“胖模特,瘦控制器”。从长远来看,这将对你有所帮助。例如,客户机突然告诉您需要验证model1和/或更改数据,或者将新数据插入到另外十个字段中,这样就很难更改了。在现实世界中,一个表可能有20个字段,在同一个url中,它将更新5个表。调试它会很困难。但现在您知道在哪里进行更改,并且可以很容易地转到特定的功能
但最初您使用相同的函数来存储model1和model2。不应该这样做。虽然,无数的导师都是这样工作的,但在专业环境中,单一责任原则是很重要的
我通常只使用控制器函数重定向到另一个页面。如果有验证和/或其他东西,那么我会使用不同的功能或特征
您应该在OOP中查找SOLID原则并尝试掌握它。也请查看此信息。我有多个项目正在执行您刚才所说的操作,一次将条目保存在多个表中。我相信这真的发生在现实世界场景中的应用程序上 下面是我正在做的事情:
public function store(Request $request)
{
$main = $this->saveModel1($request);
$this->saveModel2($request, $main->id);
return redirect()->route('my.route.name.for.edit', $main->id);
}
private function saveModel1($request)
{
$model1 = new Model1;
$model1->bla = "Model1";
$model1->save();
return $model1->id;
}
private function saveModel2($request, $model1_id)
{
$model2 = new Model2;
$model2->bla1 = $model1_id;
$model2->bla2 = "Model2";
$model2->save();
}
更新:
此答案已被选择为正确答案,但我只想补充一点,在这样的条件下,将保存查询包含到事务中是安全的
DB::beginTransaction();
try
{
}
catch (\PDOException $e)
{
}
在模型本身中放置logik,可能会访问模型中的请求,这不是一个好的设计。为此使用服务或存储库。但是,将已预填充的DTO传递到此层。您是对的。你的方法确实更好。然而,我只是想强调“单一责任原则”和“胖模特瘦控制器”。在给出答案之前,我应该多考虑一下。您的模型创建是否遵循全有或全无的方法,即要么创建所有模型,要么不创建任何模型?然后,您可能需要使用事务,在我看来,这意味着要为作业使用自定义服务(以及更好的可恢复性,以防您需要一个API左右)。