控制器使用另一个控制器

时间:2019-08-01 11:10:13

标签: php laravel

主页显示来自其他控制器的一些信息,例如新闻,文章等。在一个控制器中使用其他控制器方法的最佳方法是什么?
假设有一个名为HomeController的控制器,在家庭控制器中实例化Controller类是否正确?
例如,如果我要使用NewsController,请实例化!
以下代码仅是示例,我想知道在另一个控制器中访问方法或模型的最佳方法是什么?

class HomeController extends Controller
{
    public function index()
    {
        $news_obj = new NewsController();
        $news = $news_obj->getNews();

        $article_obj = new ArticleController();
        $articles = $article_obj->getArticles();

        return view('template',['news'=>$news,'articles'=>$articles]);
    }
}

5 个答案:

答案 0 :(得分:4)

不重复使用其他控制器中的控制器更为干净。更好的方法是将要重用的逻辑从控制器中提取到单独的服务中,然后可以从两个控制器中调用该服务。

示例:

class HomeController extends Controller
{
    /**
     * @var NewsService
     */
    private $newsService;

    /**
     * @var ArticleService
     */
    private $articleService;

    public function __construct(NewsService $newsService, ArticleService $articleService)
    {
        $this->newsService = $newsService;
        $this->articleService = $articleService;
    }

    public function index()
    {
        $news = $this->newsService->getNews();
        $articles = $this->articleService->getArticles();

        return view('template',['news'=>$news,'articles'=>$articles]);
    }
}

class NewsController extends Controller
{
    /**
     * @var NewsService
     */
    private $newsService;

    public function __construct(NewsService $newsService)
    {
        $this->newsService = $newsService;
    }

    public function index()
    {
        $news = $this->newsService->getNews();
        return view('template',['news'=>$news]);
    }
}

class ArticleController extends Controller
{
    /**
     * @var ArticleService
     */
    private $articleService;

    public function __construct(ArticleService $articleService)
    {
        $this->articleService = $articleService;
    }

    public function index()
    {
        $articles = $this->articleService->getArticles();
        return view('template',['articles'=>$articles]);
    }
}

答案 1 :(得分:1)

我认为最好在模型内部定义一个函数以返回值。并在控制器中调用该函数。

根据MVC,这将更相关。

答案 2 :(得分:0)

很明显,我们不能将控制器用于另一个控制器。

答案 3 :(得分:0)

实例化要在对应模型中重用的功能,以便可以在所有控制器中使用它们。

答案 4 :(得分:0)

对此我同意@ptrTon,我建议采用存储库模式。根据您的应用程序大小,这可能会有些麻烦,但与在另一个控制器中实例化一个控制器相比,它绝对干净。

基本上,这种方法不会直接处理模型,而是使用实际上是一个额外层的对象。这样做的主要优点是,您可以提取通用操作,并从控制器内部而不是对象内部的任何位置执行通用操作,该对象的唯一职责是管理模型上的操作,从而进一步分离应用程序组件的职责。使用Laravel,您还可以添加自定义路由解析逻辑,该逻辑将使用IoC容器将这些存储库注入控制器中。

如果您想进一步扩展它,可以按照某种方式创建存储库,使其像包装和扩展其功能的模型(PHP's magic methods are your friends)一样。在一个答案中提供完整的示例可能很复杂,但是我将在下面链接一些引人入胜的资源。

Repository pattern in Laravel - example

Decorator pattern - concepts

Laravel's explicit model binding(请参阅“自定义解析逻辑”部分)

相关问题