Laravel 4参数作为控制器动作

时间:2013-06-01 12:20:31

标签: laravel laravel-4

我想知道Laravel 4是否有可能根据给定的参数实际调用控制器的功能。例如,如果我有如下路线:

'auth/{action}

那么有没有办法根据'action'参数调用控制器动作?在Kohana,我可以写一些类似的东西:

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

那不是那样的,但你知道我的意思:)无论如何,如果没有机会这样做,那么我必须将我的路线分成单行吗?

2 个答案:

答案 0 :(得分: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 的官方文档。

答案 1 :(得分: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);
});

如果您希望使用参数进行索引操作,那将无效,但除此之外,它似乎运行良好。如果您想要这样做,它也不会处理第二个参数。

你可以通过很多方式扩展这个想法。

Jason的答案更正确,(匹配文档,更清晰的代码等)但是如果你不想考虑HTTP方法,或者你想要一种主路由来处理几乎每个请求,这是一个选项。