2013-06-01 2 views
2

Я хотел бы знать, есть ли возможность в Laravel 4 фактически вызвать функцию контроллера на основе заданного параметра. Например, если у меня есть маршрут вроде:Параметр Laravel 4 как действие контроллера

'auth/{action} 

Тогда есть ли способ вызвать действие контроллера на основе параметра «действие»? В Кохан я мог бы написать что-то вроде:

'auth/<action>' -> defaults (controller=>'UserController',action=>'<action>' 

Ну не exacly как это, но вы знаете, что я имею в виду :) Во всяком случае, если нет никаких шансов сделать это, то я должен разделить мой маршрут на отдельные маршруты?

ответ

5

Похоже, вам просто нужно проложить маршрут до контроллера с auth, являющимся базовым URI.

Route::controller('auth', 'AuthController'); 

Этот контроллер (AuthController) теперь ожидает, что ваши методы должны быть с префиксом HTTP глаголом они должны реагировать. Вы также можете использовать метод getIndex для ответа на базовый URI, который в этом случае равен auth.

Пример контроллера может выглядеть примерно так:

class AuthController extends Controller { 

    public function getIndex() 
    { 
     return 'Index page'; // Responds to localhost/auth 
    } 

    public function getLogin() 
    { 
     return 'Login page'; // Responds to localhost/auth/login 
    } 

} 

Существует одна вещь, которую вы должны знать. Если вы делаете Route::controller('/', 'HomeController');, тогда это должно быть ПОСЛЕДНЕЕ. Любые маршруты после него не будут вызваны из-за того, что Laravel автоматически добавит маршрут «отсутствующего метода», который поймает что-нибудь, которое не соответствует маршрутизируемому методу на контроллере.

Дополнительную информацию о RESTful controllers в официальной документации.

+0

ОК, который работает очень хорошо, за исключением того, что я не могу использовать параметры в URL-адресах. Какова ваша рекомендация? Насколько я знаю, это очень важно в REST API, чтобы иметь возможность называть что-то вроде/api/item/1 или прочее. OK Я предполагаю, что в этом случае я должен использовать Route :: resource. Правильно ли я или должен использовать контроллер Route :: и каким-то образом передавать параметры? –

0

Я не проверял это точный код, но я что-то подобное, и она работала:

Route::any('auth/{action}', function($action){ 
    $controller = new UserController(); 
    $controller->$action(); 
}); 

Вы могли бы найти, вы также должны обрабатывать параметры, например:

Route::any('auth/{action}/{param}', function($action, $param){ 
    $controller = new UserController(); 
    $controller->$action($param); 
}); 

вы может даже настроить его, чтобы охватить все ваши контроллеры:

Route::any('{controller}/{action?}/{param?}', function($controller,$action='index',$param=null) 
{ 
    $controller = str_replace(' ', '', ucwords(str_replace('-', ' ', $controller))).'Controller'; 
    $controller = new $controller; 
    $action = lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $action)))); 
    return $controller->$action($param); 
}); 

Если вы хотите иметь индексное действие wi й параметр, который не сработает, но в противном случае он работает достаточно хорошо. Он также не будет обрабатывать второй параметр, если вы хотите это сделать.

Много способов расширить эту идею.

Ответ Джейсона более правильный (соответствует документам, более чистому коду и т. Д.), Но если вы не хотите думать о методах HTTP или хотите получить мастер-маршрут для обработки почти каждого запроса, это опция.

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