在一个视图中使用多个控制器

时间:2014-05-25 21:38:12

标签: php laravel

我需要一些建议,因为我对Laravel和MVC总体上还有点新意。我正在编写一个小型Web应用程序,该应用程序在页面上显示一些数据,从远程API获取。但是,该页面已经有一个控制器。我将使用的另一个控制器我希望我也可以将它重用于其他页面。我非常困在这里。

所以两个控制器

HomeController.php 
ApiController.php

HomeController是原始控制器,它获取视图文件(home.blade.php),以及从控制器加载的其他一些数据。

使用ApiController,我想获取api(json)结果,做一些更改,然后将这些更改加载到HomeController。这些更改就像一系列方法,并且会被加载到视图中。

那么如何在同一视图中加载两个控制器呢?

1 个答案:

答案 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中存储库模式的使用情况。