【问题标题】:controller use another controller控制器使用另一个控制器
【发布时间】:2019-12-09 23:20:42
【问题描述】:

主页显示来自其他控制器的一些信息,如新闻、文章等。在一个控制器中使用其他控制器的方法的最佳方式是什么?
假设有一个名为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]);
    }
}

【问题讨论】:

标签: php laravel


【解决方案1】:

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

例子:

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]);
    }
}

【讨论】:

  • 你能举个例子吗?
  • 新闻和文章怎么办?
  • 我为你添加了一个简单的例子
  • NewsService 和 ArticleService 是在哪里定义的?
  • 为什么要使用 NewsService 而不是 News Eloquent 模型?
【解决方案2】:

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

【讨论】:

  • 好的,我该怎么办?
  • 您应该在模型内部创建函数以返回值并在控制器上调用它,这是最佳实践
【解决方案3】:

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

根据 MVC,这将更相关。

【讨论】:

    【解决方案4】:

    实例化你想在对应模型中重复使用的函数,以便你可以在所有控制器中使用它们。

    【讨论】:

      【解决方案5】:

      我同意@ptrTon 的观点,我建议采用存储库模式。根据您的应用程序大小,这可能需要一些工作,但它肯定比在另一个控制器中实例化一个控制器更干净。

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

      如果您想更进一步,您可以创建存储库,使其充当包装模型并扩展其功能 (PHP's magic methods are your friends)。在单个答案中提供完整示例可能很复杂,但我将在下面链接一些有趣的资源。

      Repository pattern in Laravel - example

      Decorator pattern - concepts

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多