路由模型绑定可以与RESTful控制器一起使用吗?

时间:2014-06-24 22:54:28

标签: php laravel-4 laravel-routing

我在Laravel项目中一直使用RESTful controllers。包括:

Route::controller('things', 'ThingController')

在我的routes.php中,我可以在ThingController中定义函数,如:

public function getDisplay($id) {
    $thing = Thing::find($id)
    ...
}

因此,GETting URL“... things / display / 1”将自动定向到控制器功能。这看起来非常方便,到目前为止一直对我很有用。

我注意到我的许多控制器函数都是从url中通过id获取模型开始的,我觉得能够使用route model binding为我做这件事会很好。所以我将routes.php更新为

Route::model('thing', 'Thing');
Route::controller('things', 'ThingController')

并将ThingController函数更改为

public function getDisplay($thing) {
    ...
}

我认为这会像我想要的那样神奇地工作(就像我迄今为止在Laravel中尝试过的所有其他东西)但不幸的是,当我尝试使用{{时,我试图获得非对象的属性“ 1}}在函数中。这是应该能够工作的东西吗?我刚刚做错了,或者路由模型绑定只适用于在routes.php中明确命名的路由?

2 个答案:

答案 0 :(得分:5)

如果您不介意使用URI路径,方法名称并且仅使用showeditupdate方法,则可以使用Resource Controller生成URI字符串它可以定义模型绑定。

routes.php更改为

Route::model('things', 'Thing');
Route::resource('things', 'ThingController');

您可以使用php artisan routes命令查看所有URI

$ artisan routes | grep ThingController
GET|HEAD things                | things.index               | ThingController@index
GET|HEAD things/create         | things.create              | ThingController@create
POST things                    | things.store               | ThingController@store
GET|HEAD things/{things}       | things.show                | ThingController@show
GET|HEAD things/{things}/edit  | things.edit                | ThingController@edit
PUT things/{things}            | things.update              | ThingController@update
PATCH things/{things}          |                            | ThingController@update

之后,您可以将参数威胁为Thing对象而不显式名称路由。

/**
 * Display the specified thing.
 *
 * @param  Thing  $thing
 * @return mixed
 */
public function show(Thing $thing)
{
    return $thing->toJson();
}

如果您想访问ThingController@show,请传递您的型号ID,Laravel会自动检索它。

http://example.com/things/1

{"id":1,"type":"Yo!"}

答案 1 :(得分:1)

您可以使用Route:资源并仍然提供其他方法。在特定的Route::resource行之前放置您需要的路线。 例如:

Route::model('things', 'Thing');
Route::get('things/{things}/owner', 'ThingController@getOwner');
Route::resource('things', 'ThingController');

然后在控制器中创建相应的方法。

public function getOwner($things) {
    return Response::json($things->owner()->get());
}

以下是Laravel 4.2文档中的官方文档:

来源:http://laravel.com/docs/controllers#resource-controllers

向资源控制器添加其他路由

如果您需要在默认资源路径之外向资源控制器添加其他路由,则应在调用Route::resource之前定义这些路由:

Route::get('photos/popular');
Route::resource('photos', 'PhotoController');