Laravel依赖注入不起作用

时间:2017-03-20 16:33:52

标签: laravel laravel-5 laravel-5.4

我在我的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返回一个空的。谁能告诉我为什么?

4 个答案:

答案 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