动态调用控制器

时间:2013-06-18 02:28:15

标签: laravel laravel-4

我正在尝试在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(),它告诉我我不能静态调用非静态函数。

有关如何使这项工作的任何想法?

2 个答案:

答案 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.