Laravel: Load method in another controller without changing the url
You can use (L3 only)
Controller::call('ApplesController@getSomething');
In L4
you can use
$request = Request::create('/apples', 'GET', array());return Route::dispatch($request)->getContent();
In this case, you have to define a route for ApplesController
, something like this
Route::get('/apples', 'ApplesController@getSomething'); // in routes.php
In the array()
you can pass arguments if required.
( by neto in Call a controller in Laravel 4 )
Use IoC...
App::make($controller)->{$action}();
Eg:
App::make('HomeController')->getIndex();
and you may also give params
App::make('HomeController')->getIndex($params);
You should not. In MVC, controllers should not 'talk' to each other, if they have to share 'data' they should do it using a model, wich is the type of class responsible for data sharing in your app. Look:
// route:Route::controller('/', 'PearsController');// controllersclass PearsController extends BaseController { public function getAbc() { $something = new MySomethingModel; $this->commonFunction(); echo $something->getSomething(); }}class ApplesController extends BaseController { public function showSomething() { $something = new MySomethingModel; $this->commonFunction(); echo $something->getSomething(); }}class MySomethingModel { public function getSomething() { return 'It works!'; }}
EDIT
What you can do instead is to use BaseController to create common functions to be shared by all your controllers. Take a look at commonFunction
in BaseController
and how it's used in the two controllers.
abstract class BaseController extends Controller { public function commonFunction() { // will do common things }}class PearsController extends BaseController { public function getAbc() { return $this->commonFunction(); }}class ApplesController extends BaseController { public function showSomething() { return $this->commonFunction(); }}