我需要一些建议,因为我对Laravel和MVC总体上还有点新意。我正在编写一个小型Web应用程序,该应用程序在页面上显示一些数据,从远程API获取。但是,该页面已经有一个控制器。我将使用的另一个控制器我希望我也可以将它重用于其他页面。我非常困在这里。
所以两个控制器
HomeController.php
ApiController.php
HomeController是原始控制器,它获取视图文件(home.blade.php
),以及从控制器加载的其他一些数据。
使用ApiController,我想获取api(json)结果,做一些更改,然后将这些更改加载到HomeController。这些更改就像一系列方法,并且会被加载到视图中。
那么如何在同一视图中加载两个控制器呢?
答案 0 :(得分:2)
首先,所有控制器都不会加载到view
内,您应该从view
加载controller
并发出API
来电的远程请求您不需要使用其他控制器,但如果您有其他使用API
并且需要单独的控制器,则可以使用它。流程是这样的:
class HomeController extends BaseController {
public function index()
{
// make the api call/remote request
// modify the returned data
// load the view
}
}
让我们改写它:
class HomeController extends BaseController {
protected $apiService = null;
public function __construct(ApiService $apiService)
{
$this->apiService = $apiService;
}
public function index()
{
// make the api call/remote request
$apiData = $this->apiService->makeRequest();
// modify the returned data.... then...
// load the view
return View::make(...)->with('apiData', $apiData);
}
}
所以,似乎很清楚,你应该在一个单独的类中使用API
相关进程作为服务,可能是模型或简单的存储库类,并将其注入HomeController
然后使用它来自控制器。
执行ApiService中的所有API内容并从HomeController
调用该类的方法,在这种情况下,您可以通过实现接口将ApiServiceRepository
实现为具体类,即{{1} }。所以,最后它可能是这样的:
ApiService
使用上面给出的interface ApiService {
public function makeRequest();
}
// Implement the interface in concrete class
class ApiServiceRepository implements ApiService {
public function makeRequest()
{
// $data = make remote request
// return $data
}
}
课程HomeController
并添加__construct
绑定,如:
IoC
因此,您不必担心App::bind('ApiService', 'ApiServiceRepository');
的构造函数中的依赖注入。
顺便说一句,要使用其他控制器中的方法,例如来自HomeController
的{{1}},您可以使用以下内容:
ApiController
您还可以查看this article以了解HomeController
中存储库模式的使用情况。