控制器使用另一个控制器

首页显示来自其他控制器的一些信息,如新闻、文章等。在一个控制器中使用其他控制器的方法的最佳方式是什么?

假设有一个名为HomeController的控制器,在主控制器中实例化一个控制器类是否正确?

例如,如果我想使用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]);

    }

}


长风秋雁
浏览 144回答 3
3回答

DIEA

不在其他控制器中重用控制器更干净。更好的方法是将您要从控制器重用的逻辑提取到一个单独的服务中,然后您可以从两个控制器调用该服务。例子: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]);    }}

慕桂英546537

我认为最好在模型内部定义一个函数来返回值。并在控制器中调用该函数。根据MVC,这将更相关。

肥皂起泡泡

我同意@ptrTon 的观点,我建议采用 Repository 模式。根据您的应用程序大小,这可能需要一些工作,但它绝对比在另一个控制器内实例化控制器更干净。基本上,使用这种方法,您不会直接操作模型,而是使用一个对象,该对象实际上是一个额外的层。这样做的主要优点是您可以提取通用操作并从任何地方执行它们,而不是在控制器内部,而是在对象内部,唯一的职责是管理模型上的操作,进一步分离应用程序组件的职责。使用 Laravel,您还可以添加自定义路由解析逻辑,该逻辑将使用 IoC 容器将这些存储库注入您的控制器。如果您想更进一步,您可以创建存储库,使其表现为包装模型并扩展其功能(PHP 的魔法方法是您的朋友)。在单个答案中提供完整示例可能很复杂,但我将在下面链接一些有趣的资源。Laravel 中的存储库模式 - 示例装饰者模式 - 概念Laravel 的显式模型绑定(参见“自定义解析逻辑”部分)
打开App,查看更多内容
随时随地看视频慕课网APP