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

Chr*_*ish 3 php laravel laravel-5

我有一个Laravel模型PurhaseOrder和一个PurchaseOrdersController带方法的控制器show

如果我用一个整数来对方法进行类型转换:

public function show(int $purchaseOrder)
{
        dd(PurchaseOrder::find($purchaseOrder));
}
Run Code Online (Sandbox Code Playgroud)

然后转dd()出我所期望的(数据库中id匹配$ purchaseOrder的记录)

但是,如果相反,我这样做:

public function show(PurchaseOrder $purchaseOrder)
{
        dd($purchaseOrder);
}
Run Code Online (Sandbox Code Playgroud)

然后$purchaseOrder是一个空模型,并没有填充数据库中的任何数据.我的路线看起来像这样:

Route::get('purchase-orders/{purchase_orders}/show', ['as' => 'admin.purchase-orders.show', 'uses' => 'PurchaseOrdersController@show']);
Run Code Online (Sandbox Code Playgroud)

这是我继承的代码,我正在尝试从Laravel 5.3更新到Laravel 5.6.我应该在哪里寻找解决此模型未正确填充的问题?

The*_*pha 11

隐式模型绑定要求您将变量名称与路径参数名称匹配,例如,对于以下方法:

public function show(PurchaseOrder $purchaseOrder)
{
    dd($purchaseOrder);
}
Run Code Online (Sandbox Code Playgroud)

路由应包含匹配的参数名称,例如:

Route::get('purchase-orders/{purchaseOrder}/show', [
    'as' => 'admin.purchase-orders.show',
    'uses' => 'PurchaseOrdersController@show'
]);
Run Code Online (Sandbox Code Playgroud)

请注意,在方法参数名show的方法是$purchaseOrder和路由参数名称{purchaseOrder}都是相同的,这就是在隐式模型结合的要求,否则,你必须做一个明确的模型绑定,在那里你已经明确地告诉框架你参数名称,例如(in RouteServiceProvider):

public function boot()
{
    parent::boot();

    Route::model('purchase_orders', App\PurchaseOrder::class);
}
Run Code Online (Sandbox Code Playgroud)

这将告诉框架,如果{purchase_orders}路由中有可用的参数名称,则将PurchaseOrder模型实例解析/绑定到该路由的给定方法中.