我想知道Laravel 4是否有可能根据给定的参数实际调用控制器的功能。例如,如果我有如下路线:
'auth/{action}
那么有没有办法根据'action'参数调用控制器动作?在Kohana,我可以写一些类似的东西:
'auth/<action>' -> defaults (controller=>'UserController',action=>'<action>'
那不是那样的,但你知道我的意思:)无论如何,如果没有机会这样做,那么我必须将我的路线分成单行吗?
答案 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方法,或者你想要一种主路由来处理几乎每个请求,这是一个选项。