2013-06-10 3 views
17

У меня есть этот маршрут: Route::controller('/', 'PearsController'); Возможно ли, чтобы Laravel мог заставить PearsController загрузить метод с другого контроллера, чтобы URL-адрес не изменился?Laravel: Загрузить метод в другом контроллере без изменения URL-адреса

Например:

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


// controllers 
class PearsController extends BaseController { 

    public function getAbc() { 
     // How do I load [email protected] 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!' 
    } 

} 
+0

http://stackoverflow.com/questions/15205239/ call-a-controller-in-laravel-4 – Joeri

ответ

35

Вы можете использовать (только L3)

Controller::call('[email protected]'); 

В L4 вы можете использовать

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

В этом случае, вы должны определить маршрут для ApplesController, что-то вроде этого

Route::get('/apples', '[email protected]'); // in routes.php 

В поле array() вы можете передать аргументы, если требуется.

+0

Как передать параметры как получить запрос? Параметры недоступны в методе, если они переданы в массиве? –

+0

Кажется, что параметры POST в Laravel не переопределены, а Input :: all() все еще считывает параметры из исходного запроса, а не того, с которым мы перенаправлялись. –

+1

'Input :: all()' считывает все входные источники, включая массив 'FILES'. –

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

} 

EDIT

Что вы можете сделать вместо этого использовать BaseController для создания общих функций для совместного использования всех контроллеров. Взгляните на commonFunction в BaseController и как он используется в двух контроллерах.

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

«Вы не должны» ... Хорошо, но я не хочу переписывать крутые/рабочие функции. Как я могу писать функции, которые я могу повторно использовать в обоих контроллерах? – Joeri

+0

Функции повторного использования в обоих контроллерах (справа) полностью отличаются от того, чтобы два контроллера разговаривали друг с другом (неправильно). Отредактировал ответ, чтобы добавить 'commonFunction()', используемый в обоих контроллерах. –

+0

Thx для «Не стоит»! Удивительно, как MVC пропущено иногда ... –

27

(по neto в Call a controller in Laravel 4)

использования IoC ...

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

Например:

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

и вы можете также дать Params

App::make('HomeController')->getIndex($params); 
+0

Используется этот метод для построения базового контроллера для использования некоторых общих переменных. –

+0

Но я получаю «Метод [myMethod] не существует» –

+0

@AlexBuznik: используйте правильное пространство имен. – Joeri

8

, если вы были в AbcdController и пытается получить доступ к методу public function test(), который существует в OtherController вы можете просто сделать:

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

Это должно работать в L5.1

+0

, и если я нахожусь в/name/abaController, то как я могу его использовать? – user2671011

+0

как передать параметры :-) – m0z4rt

Смежные вопросы