首先,控制器不会在view 中加载,而是应该从controller 加载view 并发出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 实现为具体类,即 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 的构造函数中的依赖注入。
顺便说一句,要使用来自另一个控制器的方法,例如来自HomeController 的ApiController,您可以使用这样的方法:
$apiController = App::make('ApiController');
// Call any method of "ApiController" class/object
$apidata = $apiController->makeCallToMethod();
您也可以查看this article 以了解Laravel 中存储库模式的使用。