Php Laravel:重构控制器存储()和更新()方法

Php Laravel:重构控制器存储()和更新()方法,php,laravel,eloquent,refactoring,Php,Laravel,Eloquent,Refactoring,我正在开发一个Laravel Web应用程序,我需要对重构控制器有深入了解 我注意到我的Controller store()和update()方法非常相似。非常相似,唯一更改的行如下所示: 在store()方法中,我使用$deck=newdeck()

我正在开发一个Laravel Web应用程序,我需要对重构控制器有深入了解

我注意到我的Controller store()和update()方法非常相似。非常相似,唯一更改的行如下所示: 在store()方法中,我使用
$deck=newdeck()$deck=deck::find($id)。这些是控制器内这140行方法中唯一更改的行


如何进行重构,或者将代码提取到何处?我的第一个想法是创建一个Trait并将该方法放在那里,但这似乎不正确,或者是这样吗?

我不会建议对这两种方法都使用一种方法,但不知道您的用例您可以使用
firstOrNew
helper方法,它将返回
,如果它根据给定的id存在,或者它将为您创建一个新实例。所以用这个:

Deck::firstOrNew(['id' => $id]);

我的建议是保持简单。我将使用复制的代码创建一个私有函数,并从store()和update()函数调用它。

如果您希望将应用程序逻辑保留在控制器中,可以对复制的代码创建一个函数,然后在参数中传递Deck对象

  public function store()
  {
    $deck = new Deck();
    $this->save($deck);
  }

  public function update()
  {
    Deck::find($id);
    $this->save($deck);
  }

  private function save(Deck $deck)
  {
    // Duplicate Code goes here
  }

我希望我帮了忙

哦,我不知道这个方法。从store()和update()中提取的主体应该保存在哪里?@PietroBonfim这两种方法的主体是否不同?我以为你只想用一种方法来匹配这两种方法。。如果不是这样的话,只需提取一个函数并通过两个方法中的
$deck
调用它。不,我会将两个方法都保留在控制器中,只提取其中的逻辑,这两行之间只存在差异。好的,在控制器中创建一个私有函数,并从两个方法调用它。:)如果答案有帮助的话,你可以接受。但是你有没有建议我应该把从store()和update()提取的逻辑放在哪里?在一个特质内部,在控制者本身内部…?在控制者本身内部?嗯,我不知道你打算如何组织它。它可以在另一个类中编写MVC业务逻辑,也可以在控制器本身中编写。软件设计原则(干和吻)