我在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中明确命名的路由?
答案 0 :(得分:5)
如果您不介意使用URI路径,方法名称并且仅使用show
,edit
和update
方法,则可以使用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');