我正在尝试在Laravel中为我的控制器创建动态路由 - 我知道这可以在Kohana中完成,但是我试图让它与Laravel一起工作是不成功的。
这就是我现在所拥有的:
Route::get('/{controller}/{action?}/{id?}'...
所以我想打电话给controller/method($id)
。
理想情况下,这就是我想要做的事情:
Route::get('/{controller}/{action?}/{id?}', $controller . '@' . $action);
让动态调用$ controller :: $ action。
我试过这样做:
Route::get('/{controller}/{action?}/{id?}', function($controller, $action = null, $id = null)
{
$controller = new $controller();
$controller->$action();
});
但是我收到一条错误消息:类控制器不存在。 因此,当控制器扩展BaseController时,Laravel似乎没有包含所有必需的文件。
如果我使用$controller::$action()
,它告诉我我不能静态调用非静态函数。
有关如何使这项工作的任何想法?
答案 0 :(得分:1)
您可以一举自动注册所有控制器:
Route::controller( Controller::detect() );
如果您正在使用Laravel 4(正如您的标记所示),则无法再使用Controller::detect()
。你必须manually register all the controllers you want to use。
答案 1 :(得分:0)
在读完Laravel不再支持之后,我想出了这个解决方案:
$uri = $_SERVER['REQUEST_URI'];
$results = array();
preg_match('#^\/(\w+)?\/?(\w+)?\/?(\w+)?\/?#', $_SERVER['REQUEST_URI'], $results);
// set the default controller to landing
$controller = (empty($results[1])) ? 'landing' : $results[1];
// set the default method to index
$method = (empty($results[2])) ? 'index' : $results[2];
Route::get('{controller?}/{action?}/{id?}', $controller . '@' . $method);
// now we just need to catch and process the error if no controller@method exists.