Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在一个控制器中使用两个模型是否不好_Php_Laravel - Fatal编程技术网

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左右)。