在一个控制器中使用2个模型是不好的做法

问题描述 投票:2回答:2

我们正在使用Laravel,我们有多个模型控制器。

例如:

Model1Model2和他们相应的控制器Controller1Controller2。每次我们为Model2创建新条目时,我们都需要为Model1创建一个新条目。

问题是,在Model1Model2Controller1创建新条目是不好的做法

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();
}
php laravel
2个回答
4
投票

我有多个项目正在做你刚刚说过的事情,一次保存多个表上的条目。我相信这真的发生在真实场景中的应用程序上。

这是我正在做的事情:

public function store(Request $request)
{
    $main = $this->saveModel1($request);
    $this->saveModel2($request);    

    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)
{
    $model2 = new Model2;
    $model2->bla = "Model2";
    $model2->save();
}

更新:此答案已被选为正确,但我只想在这样的条件下添加,将保存查询包含在事务中是安全的。

DB::beginTransaction();
try
{

}
catch (\PDOException $e)
{

}

0
投票

这不是好习惯。一般来说,在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;
}

特别是Laravel,你应该争取'胖子模特,瘦小的控制者'。从长远来看,它会对你有所帮助。例如,突然客户端告诉您需要验证model1和/或更改数据或将新数据插入另外十个字段,然后很难更改。在现实世界中,一个表可能有20个字段,在同一个URL中它将更新5个表。调试它会很难。但现在你知道在哪里改变,你可以很容易地去特定的功能。

但最初您使用相同的功能来存储model1和model2。不应该这样做。虽然,无数教程以这种方式工作但在专业环境中单一责任原则很重要。

我通常只使用控制器功能重定向到另一个页面。如果有验证和/或某些东西,那么我会使用不同的功能或特性。

您应该在OOP中查找SOLID原理并尝试掌握它。还可以看看这个link

© www.soinside.com 2019 - 2024. All rights reserved.