如何在Laravel控制器中使用“where”

时间:2014-09-20 00:08:26

标签: php laravel laravel-routing

如果我有下一条路线:

Route::get('/user/{id}', function($id) {
    return View::make(users.profile, array('id' => $id));
})->where(array('id' => '[0-9]+'));`

我怎样才能在Restful控制器中做同样的事情?

Route::controller('/user', 'UserController');

我的UserController:

class UserController extends BaseController {

    public function getProfile($id) {
        return View::make('users.profile', array('id' => $id));
    }
}

感谢您的关注。

3 个答案:

答案 0 :(得分:0)

要确保methodsURL从您的终端运行php artisan routes,这样您就可以获得您有{{1}访问过的所有路线的列表}}。在这种情况下,对于以下URLroute,您可能会发现controller URL

user/profile/10

因此,使用// Route Route::controller('/user', 'UserController'); // Controller class UserController extends BaseController { public function getProfile($id) { return View::make('users.profile', array('id' => $id)); } } ,此处http://domain.com/user/profile/10将传递到10方法中的$id变量。还要记住,在profile控制器中,每个方法都应该以他们响应的RESTfull动词作为前缀,因此在这种情况下,此方法将响应HTTP请求。

答案 1 :(得分:0)

链接到where调用时,

Route::controller似乎无法正常工作,但您可以使用Route::pattern声明实现相同的功能。因此,例如,Route :: controller的这段代码(称为"隐式路由")可以工作,将id限制为数字:

Route::pattern('id', '\d+');
Route::controller('/user/{id}', 'UserController');

然后,在UserController中,将从GET请求调用getIndex方法:

class UserController extends BaseController {
    public function getIndex($id) {
        return View::make('users.profile', array('id' => $id));
    }
}

但请注意,这仅适用于索引方法,即调用http:://example.com/user/99。如果要使用其他控制器方法,使用"隐式路由",例如http:://example.com/user/profile/99和控制器方法getProfile($id),则需要声明路由而不使用 {id}参数,如下所示:

Route::controller('/user', 'UserController');

...在这种情况下,您无法使用->whereRoute::pattern约束{id},因为没有{id}参数约束

最后,您最好选择"显式路由,"正如您在答案开始时所做的那样,或使用RESTful资源控制器(see the docs)并将您的路线指定为:

Route::resource('user', 'UserController');

如果你订阅Laracasts,Jeffrey Way有一个很好的,明确的教程,关于"隐式路由的一些危险" here

答案 2 :(得分:0)

为了做到这一点,您希望将Route::controller语句包装在一个组中,并为该组应用where模式,因为全局设置它可能对其他路由不准确:

Route::group('where' => ['id' => '\d+'], function () {

   Route::controller('users', 'UsersController');
   // other restful controller definitions with this pattern go here

}