user254799
user254799

Reputation: 75

Using multiple controllers inside of one view

I Need some advice, as I'm still a bit new to Laravel and MVC in general. I'm coding a small web application that presents some data on the page, fetched from a remote API. However, the page already has a controller to it. The other controller I will be using I'm hoping I can also reuse it for other pages. I'm pretty stuck here.

So the two controllers

HomeController.php 
ApiController.php

The HomeController is the original controller, which gets the view file (home.blade.php), with some other data that's being loaded from the controller.

With the ApiController, I want to fetch the api (json) results, do some changes and then load those changes to the HomeController as well. The changes would be like an array of methods and such that's being loaded to the view.

So How can I load both controllers inside of the same view?

Upvotes: 1

Views: 924

Answers (1)

The Alpha
The Alpha

Reputation: 146269

First of all controllers doesn't get loaded inside view instead, you should load a view from a controller and to make the remote request for an API call you don't need to use another controller but you may use it if you have other use of API and need a separate controller. The flow is something like this:

class HomeController extends BaseController {

    public function index()
    {
        // make the api call/remote request
        // modify the returned data
        // load the view
    }

}

Let's rewrite it:

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);
    }

}

So, it seems clear that, you should use the API related process in a separate class as a service, maybe a model or a simple repository class and inject it to your HomeController then use it from the controller.

Do all the API stuffs in ApiService and call methods of that class from the HomeController, in this case you may implement the ApiServiceRepository as a concrete class by implementing an interface, i.e. ApiService. So, finally it could be like this:

interface ApiService {
    public function makeRequest();
}

// Implement the interface in concrete class
class ApiServiceRepository implements ApiService {

    public function makeRequest()
    {
        // $data = make remote request
        // return $data
    }
}

Use the class HomeController with __construct as given above and add a IoC binding like:

App::bind('ApiService', 'ApiServiceRepository');

So, you don't have to worry about the dependency injection in the constructor of your HomeController.

BTW, to use a method from another controller, for example ApiController from HomeController you may use something like this:

$apiController = App::make('ApiController');

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

You may also check this article for understanding the use of repository pattern in Laravel.

Upvotes: 2

Related Questions