【问题标题】:Using multiple controllers inside of one view在一个视图中使用多个控制器
【发布时间】:2014-05-25 21:38:12
【问题描述】:

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

所以两个控制器

HomeController.php 
ApiController.php

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

使用 ApiController,我想获取 api (json) 结果,进行一些更改,然后将这些更改也加载到 HomeController。这些更改就像一组方法,并且正在加载到视图中。

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    首先,控制器不会在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 的构造函数中的依赖注入。

    顺便说一句,要使用来自另一个控制器的方法,例如来自HomeControllerApiController,您可以使用这样的方法:

    $apiController = App::make('ApiController');
    
    // Call any method of "ApiController" class/object
    $apidata = $apiController->makeCallToMethod();
    

    您也可以查看this article 以了解Laravel 中存储库模式的使用。

    【讨论】:

    • 说实话,我真的很困惑,但我会试着理解这一点。谢谢。
    • 问题,接口文件去哪了?
    • ApiServiceRepository 类可以访问的任何地方。
    • 查看“命名空间”,例如 appapp/modelsapp/controllers。在一个小项目中,您可以将它们留在 app/controllers 中,但对于任何“真实”的东西,我都会研究一个组织良好的自定义命名空间。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多