我在我的laravel应用程序中使用资源控制器,我正在尝试使用依赖注入,但它不适用于特定的模型和控制器。
这有效:
/**
* Display the specified resource.
*
* @param \App\Booking $booking
* @return \Illuminate\Http\Response
*/
public function show(Booking $booking)
{
return $booking;
}
但是出于一些令人愤怒的原因,这不是:
/**
* Display the specified resource.
*
* @param \App\SchoolEvent $schoolEvent
* @return \Illuminate\Http\Response
*/
public function show(SchoolEvent $schoolEvent)
{
return $schoolEvent;
}
我的路线看起来像这样:
// Events
Route::resource('events', Resources\SchoolEventController::class);
// Bookings
Route::resource('bookings', Resources\BookingController::class);
由于某种原因/ bookings / 1返回一个填充的对象,但/ events / 1返回一个空的。谁能告诉我为什么?
答案 0 :(得分:8)
将注入的变量名称更改为$ event:
public function show(SchoolEvent $event)
答案 1 :(得分:5)
将型号名称更改为Event
以使model binding正常工作。
由于
$user
变量是类型提示为App\User
Eloquent模型且变量名称与{user}
URI段匹配,因此Laravel将自动注入具有ID匹配的模型实例来自请求URI的相应值
答案 2 :(得分:1)
还有另一种可能的解决方案。
正如已经解释的那样,Laravel尝试注入实例,但URI段名称和变量之间存在不匹配。
Laravel允许在boot()方法中将Model显式绑定到RouteServiceProvider中的slug。
在你的情况下:
public function boot()
{
parent::boot();
// binds the slug event to our SchoolEvent model
Route::model('event', \App\SchoolEvent::class);
}
请参阅:https://laravel.com/docs/5.4/routing#explicit-binding
我觉得这两种解决方案都是可行的,但我个人更喜欢这种方案。所有非默认的slu are都在一个地方而不是在各个控制器中,我一直使用工匠来快速生成基本的控制器代码。
答案 3 :(得分:0)
使用Route :: resource时,它将自动生成所有路由以及每个路由中包含的参数的名称。
要知道名称是什么,请在您的终端上运行php artisan route:list
。之后,您将看到每个路由正在等待的名称。在控制器中使用此名称。
在您的情况下,可能是$ school_event。
如果您不喜欢该名称,则可以使用以下参数函数:
Route::resource(**'events'**, Resources\SchoolEventController::class)
->parameters([
**'events'** => 'here_the_name_you_want'
]);
使用Laravel 5.5!
参考:https://laravel.com/docs/5.5/controllers#restful-naming-resource-route-parameters