2

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

'auth/{action}

那么有没有办法根据'action'参数调用控制器动作?在 Kohana 中,我可以写如下内容:

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

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

4

2 回答 2

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 控制器的更多信息,请参阅官方文档。

于 2013-06-01T12:28:33.337 回答
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 方法,或者您想要一种主路由来处理几乎每个请求,这是一个选项。

于 2013-06-01T12:50:31.780 回答