从Laravel

时间:2017-10-22 20:07:58

标签: laravel model-view-controller laravel-5 model controller

我想使用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
            }
    }
}

我知道从另一个控制器调用控制器方法并不好。 我上网了,我熟悉了特质和服务。但我不认为它们对我的问题有用。这种情况经常发生。 你能帮我解决一下处理这些情况的最佳做法吗? 谢谢。

2 个答案:

答案 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)或模型中(不是优选但是有时它没关系)。