主页显示来自其他控制器的一些信息,例如新闻,文章等。在一个控制器中使用其他控制器方法的最佳方法是什么?
假设有一个名为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]);
}
}
答案 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
Laravel's explicit model binding(请参阅“自定义解析逻辑”部分)