Php Laravel:重构控制器存储()和更新()方法
我正在开发一个Laravel Web应用程序,我需要对重构控制器有深入了解 我注意到我的Controller store()和update()方法非常相似。非常相似,唯一更改的行如下所示: 在store()方法中,我使用Php Laravel:重构控制器存储()和更新()方法,php,laravel,eloquent,refactoring,Php,Laravel,Eloquent,Refactoring,我正在开发一个Laravel Web应用程序,我需要对重构控制器有深入了解 我注意到我的Controller store()和update()方法非常相似。非常相似,唯一更改的行如下所示: 在store()方法中,我使用$deck=newdeck()
$deck=newdeck()在update()方法中,我使用$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业务逻辑,也可以在控制器本身中编写。软件设计原则(干和吻)