Laravel Model在控制器方法中没有绑定

时间:2018-06-14 23:42:56

标签: php laravel laravel-5

我有一个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。我应该在哪里解决这个模型没有正确填充的问题?

1 个答案:

答案 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模型的实例解析/绑定到该路由的给定方法中。