我想使用 Laravel 创建一个博客。每个帖子都有很多标签。 我有一个标签控制器,带有存储新标签的方法:
class TagController extends Controller
{
public function store($title){
return Tag::firstOrCreate(['title'=>$title]);
}
}
在这种情况下,我需要从 PostController 调用这个方法:
class PostController extends Controller
...
protected function createTagsObjects(string $csvTags){
$tagsArray=explode(',',$csvTags);
$tagsArray=array_unique($tagsArray);
foreach($tagsArray as $tag ){
//call to tag controller->store
}
}
}
我知道从另一个控制器调用控制器方法不是一个好习惯。 我上网冲浪,熟悉了特征和服务。但我不认为它们对我的问题有用。这种情况经常发生。 您能帮我处理这些情况的最佳做法是什么吗? 谢谢。
你永远不应该从另一个控制器调用一个控制器方法。
将逻辑提取到Service类或Tag模型中并调用它。
但在这种情况下,这是没有必要的,因为你正在调用 Eloquent 方法
protected function createTagsObjects(string $csvTags)
{
$tagsArray = explode(',',$csvTags);
$tagsArray = array_unique($tagsArray);
foreach ($tagsArray as $tag) {
$tagCreated = Tag::firstOrCreate(['title' => $tag]);
}
}
public function store($title){
return Tag::firstOrCreate(['title'=>$title]);
}
这个方法什么也没做,只是调用laravel默认方法的方法
Model
。因此,无需从 TagController
调用此 PostController
的方法。相反,您可以从 Tag::firstOrCreate(['title'=>$title]);
调用 PostController
,这绝对没问题。
但是,如果您有一些代码块(例如方法)而不是这一行,并且需要从另一个控制器调用这些代码块,那么您应该将它们移动到服务(存储库)或模型中(不是更好,但有时是这样)好的)。