web-dev-qa-db-ja.com

Laravel:URLを変更せずに別のコントローラーにメソッドを読み込む

私はこのルートを持っています: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!'
    }

}
19
enchance

使用できます(L3のみ)

_Controller::call('ApplesController@getSomething');
_

_L4_で使用できます

_$request = Request::create('/apples', 'GET', array());
return Route::dispatch($request)->getContent();
_

この場合、次のようなApplesControllerのルートを定義する必要があります

_Route::get('/apples', 'ApplesController@getSomething'); // in routes.php
_

array()では、必要に応じて引数を渡すことができます。

37
The Alpha

neto in コントローラーをLaravel 4 で呼び出し)

IoCを使用...

App::make($controller)->{$action}();

例えば:

App::make('HomeController')->getIndex();

また、パラメータを与えることもできます

App::make('HomeController')->getIndex($params);
27
Joeri

貴方はするべきではない。 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!';
    }

}

[〜#〜] edit [〜#〜]

代わりにできることは、BaseControllerを使用して、すべてのコントローラーで共有される共通の関数を作成することです。 commonFunctionBaseControllerと、2つのコントローラーでの使用方法を見てください。

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

}

AbcdControllerにいて、OtherControllerに存在するpublic function test()メソッドにアクセスしようとすると、次のようにできます。

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

これはL5.1で動作するはずです

8
Kal