Laravel: Load method in another controller without changing the url

前端 未结 4 1444
清歌不尽
清歌不尽 2020-12-07 21:20

I have this route: Route::controller(\'/\', \'PearsController\'); Is it possible in Laravel to get the PearsController to load a method from another controller

相关标签:
4条回答
  • 2020-12-07 21:47

    ( 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);
    
    0 讨论(0)
  • 2020-12-07 21:51

    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');
    
    
    // controllers
    class 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();
        }
    
    }
    
    0 讨论(0)
  • 2020-12-07 21:51

    if you were in AbcdController and trying to access method public function test() which exists in OtherController you could just do:

    $getTests = (new OtherController)->test();
    

    This should work in L5.1

    0 讨论(0)
  • 2020-12-07 22:08

    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.

    0 讨论(0)
提交回复
热议问题