php 路由模型绑定可以与REST风格的控制器一起使用吗?

liwlm1x9  于 2023-02-28  发布在  PHP
关注(0)|答案(3)|浏览(101)

我一直在Laravel项目中使用RESTful控制器,包括:

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

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

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

这样获取URL“... things/display/1”就会自动定向到控制器函数。这看起来相当方便,到目前为止对我来说效果很好。
我注意到我的许多控制器函数都是从url中按id获取模型开始的,我想如果能够使用路由模型绑定来完成这一任务会很好。

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

并将ThingController函数更改为

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

我以为这会神奇地按照我想要的方式工作(就像我在Laravel中尝试过的其他方法一样),但不幸的是,当我尝试在函数中使用$thing时,我得到了“尝试获取非对象的属性”。这是应该能够工作的东西,而我只是做错了,还是路由模型绑定只能与routes.php中显式命名的路由一起工作?

ymzxtsji

ymzxtsji1#

如果您不介意使用URI路径、方法名,并且只使用showeditupdate方法,则可以使用资源控制器生成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

之后,您可以将threat参数作为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!"}
mccptt67

mccptt672#

您可以使用Route:resource并提供其他方法。将您需要的路由放在特定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文档的官方文档:
图片来源:www.example.comhttp://laravel.com/docs/controllers#resource-controllers
向资源控制器添加附加路由
如果需要在默认资源路由之外向资源控制器添加其他路由,则应在调用Route::resource之前定义这些路由:

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

g6ll5ycj3#

在您的模型中使用以下代码:

public function getRouteKeyName()
{
  return 'slug';
}

相关问题