Я разрабатываю приложение с 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')
Это должно соответствовать вашим потребностям
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()); } }