在 Laravel 中存储来自其他控制器的新模型实例的最佳实践

问题描述 投票:0回答:2

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

我知道从另一个控制器调用控制器方法不是一个好习惯。 我上网冲浪,熟悉了特征和服务。但我不认为它们对我的问题有用。这种情况经常发生。 您能帮我处理这些情况的最佳做法是什么吗? 谢谢。

php laravel laravel-5 model-view-controller
2个回答
0
投票

你永远不应该从另一个控制器调用一个控制器方法。

将逻辑提取到Service类或Tag模型中并调用它。

但在这种情况下,这是没有必要的,因为你正在调用 Eloquent 方法

protected function createTagsObjects(string $csvTags)
{
    $tagsArray = explode(',',$csvTags);
    $tagsArray = array_unique($tagsArray);
    foreach ($tagsArray as $tag) {
        $tagCreated = Tag::firstOrCreate(['title' => $tag]);
    }
}

0
投票
public function store($title){
  return Tag::firstOrCreate(['title'=>$title]);
}

这个方法什么也没做,只是调用laravel默认方法的方法

Model
。因此,无需从
TagController
调用此
PostController
的方法。相反,您可以从
Tag::firstOrCreate(['title'=>$title]);
调用
PostController
,这绝对没问题。

但是,如果您有一些代码块(例如方法)而不是这一行,并且需要从另一个控制器调用这些代码块,那么您应该将它们移动到服务(存储库)或模型中(不是更好,但有时是这样)好的)。

© www.soinside.com 2019 - 2024. All rights reserved.