Laravel:在不更改URL的情况下在另一个控制器中加载方法

enc*_*nce 19 php controller laravel

我有这条路线:Route::controller('/', 'PearsController');在Laravel中是否可以让PearsController从另一个控制器加载一个方法,这样URL就不会改变?

例如:

// route:
Route::controller('/', 'PearsController');


// controllers
class PearsController extends BaseController {

    public function getAbc() {
        // How do I load ApplesController@getSomething so I can split up
        // my methods without changing the url? (retains domain.com/abc)
    }

}

class ApplesController extends BaseController {

    public function getSomething() {
        echo 'It works!'
    }

}
Run Code Online (Sandbox Code Playgroud)

The*_*pha 37

你可以使用(仅限L3)

Controller::call('ApplesController@getSomething');
Run Code Online (Sandbox Code Playgroud)

L4你可以使用

$request = Request::create('/apples', 'GET', array());
return Route::dispatch($request)->getContent();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须为此ApplesController类似的路径定义

Route::get('/apples', 'ApplesController@getSomething'); // in routes.php
Run Code Online (Sandbox Code Playgroud)

array()如果需要,您可以传递参数.


Joe*_*eri 27

(通过neto 在Laravel 4调用一个控制器)

使用IoC ......

App::make($controller)->{$action}();
Run Code Online (Sandbox Code Playgroud)

例如:

App::make('HomeController')->getIndex();
Run Code Online (Sandbox Code Playgroud)

你也可以提供参数

App::make('HomeController')->getIndex($params);
Run Code Online (Sandbox Code Playgroud)


Ant*_*iro 11

你不应该.在MVC中,控制器不应该彼此"交谈",如果他们必须共享"数据",他们应该使用模型来执行它,这是在应用程序中负责数据共享的类的类型.看:

// 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!';
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑

你可以做的是使用BaseController来创建所有控制器共享的通用函数.看看commonFunctionBaseController和它是如何在两个控制器使用.

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

}
Run Code Online (Sandbox Code Playgroud)


Kal*_*Kal 8

如果您在AbcdController并且尝试访问public function test()存在于OtherController您可以执行的方法:

$getTests = (new OtherController)->test();
Run Code Online (Sandbox Code Playgroud)

这应该在L5.1中有效