我想使用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
}
}
}
我知道从另一个控制器调用控制器方法并不好。 我上网了,我熟悉了特质和服务。但我不认为它们对我的问题有用。这种情况经常发生。 你能帮我解决一下处理这些情况的最佳做法吗? 谢谢。
答案 0 :(得分:0)
您永远不应该从另一个Controller调用Controller方法。
将逻辑解压缩到Service类或Tag模型并调用它。
但在这种情况下,由于你正在调用一个Eloquent方法
,因此没有必要protected function createTagsObjects(string $csvTags)
{
$tagsArray = explode(',',$csvTags);
$tagsArray = array_unique($tagsArray);
foreach ($tagsArray as $tag) {
$tagCreated = Tag::firstOrCreate(['title' => $tag]);
}
}
答案 1 :(得分:0)
public function store($title){
return Tag::firstOrCreate(['title'=>$title]);
}
此方法除了调用laravel Model
的默认方法之外什么都不做。因此,无需从TagController
调用此PostController
方法。相反,你可以从Tag::firstOrCreate(['title'=>$title]);
调用PostController
,这绝对没问题。
但是如果你有一些代码块(例如方法)而不是这一行,并且那些代码块需要从另一个控制器调用,那么你应该将它们移动到Service(Repository)或模型中(不是优选但是有时它没关系)。