Intereting Posts

Ошибка маршрутизации, вызывающий контроллер на основе переменных в URL-адресе Laravel 4

Я разрабатываю приложение с Laravel 4, что мне нужно сделать, это: допустим, у меня есть следующий маршрут:

Route::get('/myroute/{entity}/methodname', ); 

Внутри этого я должен решить, основываясь на переменной сущности, которую должен вызывать контроллер и метод:

  'MyNameSpace\MyPackage\StudentController@methodname' 

если

 entity == Student 

и позвоните

  'MyNameSpace\MyPackage\StaffController@methodname' 

если

  entity == Staff 

как это можно сделать в маршрутизации Laravel 4, возможно ли вообще, или мне нужно в любом случае придумать 2 разных маршрута?

  Route::get('/myroute/Student/methodname') and Route::get('/myroute/Staff/methodname') 

Related of "Ошибка маршрутизации, вызывающий контроллер на основе переменных в URL-адресе Laravel 4"

Это должно соответствовать вашим потребностям

 Route::get('/myroute/{entity}/methodname', function($entity){ $controller = App::make('MyNameSpace\\MyPackage\\'.$entity.'Controller'); return $controller->callAction('methodname', array()); } 

Теперь, чтобы избежать ошибок, также можно проверить, существует ли контроллер и действие:

 Route::get('/myroute/{entity}/methodname', function($entity){ $controllerClass = 'MyNameSpace\\MyPackage\\'.$entity.'Controller'; $actionName = 'methodname'; if(method_exists($controllerClass, $actionName.'Action')){ $controller = App::make($controllerClass); return $controller->callAction($actionName, array()); } } 

Обновить

Чтобы автоматизировать процесс немного больше, вы даже можете сделать динамическое имя действия

 Route::get('/myroute/{entity}/{action?}', function($entity, $action = 'index'){ $controllerClass = 'MyNameSpace\\MyPackage\\'.$entity.'Controller'; $action = studly_case($action) // optional, converts foo-bar into FooBar for example $methodName = 'get'.$action; // this step depends on how your actions are called (get... / ...Action) if(method_exists($controllerClass, $methodName)){ $controller = App::make($controllerClass); return $controller->callAction($methodName, array()); } }