我有一个Laravel模型PurhaseOrder
和一个控制器PurchaseOrdersController
,其方法为show
如果我用一个整数来对方法进行类型转换:
public function show(int $purchaseOrder)
{
dd(PurchaseOrder::find($purchaseOrder));
}
然后dd()
转储我期望的内容(数据库中id与$ purchaseOrder匹配的记录)
但是,如果我这样做:
public function show(PurchaseOrder $purchaseOrder)
{
dd($purchaseOrder);
}
然后$purchaseOrder
是一个空模型,没有填充数据库中的任何数据。我的路线看起来像这样:
Route::get('purchase-orders/{purchase_orders}/show', ['as' => 'admin.purchase-orders.show', 'uses' => 'PurchaseOrdersController@show']);
这是我继承的代码,我试图从Laravel 5.3更新到Laravel 5.6。我应该在哪里解决这个模型没有正确填充的问题?
答案 0 :(得分:8)
隐式model binding要求您将变量名称与路径参数名称匹配,例如,对于以下方法:
public function show(PurchaseOrder $purchaseOrder)
{
dd($purchaseOrder);
}
路由应包含匹配的参数名称,例如:
Route::get('purchase-orders/{purchaseOrder}/show', [
'as' => 'admin.purchase-orders.show',
'uses' => 'PurchaseOrdersController@show'
]);
请注意,show
方法中的方法参数名称$purchaseOrder
和路由参数名称{purchaseOrder}
都是相同的,这是隐式模型绑定的要求,否则你有要做一个显式的模型绑定,你要明确告诉框架你的参数名称,例如(在RouteServiceProvider
中):
public function boot()
{
parent::boot();
Route::model('purchase_orders', App\PurchaseOrder::class);
}
这将告诉框架,如果路由中有{purchase_orders}
参数名称,则将PurchaseOrder
模型的实例解析/绑定到该路由的给定方法中。