使用 RouteServiceProvider.php 时注入模型中没有数据

No data in injected model when using RouteServiceProvider.php

描述:

我在app/Http/Kernel.php中定义了一个组:

    protected $middlewareGroups = [
      'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        //  \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
      ],

      'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
      ],

      'auth.api' => [
        \App\Http\Middleware\AddBearerToken::class,
        'throttle:60,1',
        'auth:api',
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      ],
    ];

\App\Http\Middleware\AddBearerToken::class:

<?php

  namespace App\Http\Middleware;

  use Closure;
  use Illuminate\Http\Request;

  class AddBearerToken
  {
    /**
     * Handle an incoming request.
     *
     * @param $request
     * @param $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
      if (!$request->bearerToken()) {
        if ($request->hasCookie(env('ACCESS_TOKEN_NAME'))) {
          $token = $request->cookie(env('ACCESS_TOKEN_NAME'));
          $request->headers->add(['Authorization' => 'Bearer ' . $token]);
        }
      }

      return $next($request);
    }
  }

我在 app/Providers/RouteServiceProvider.php:

中定义了一个包含路由的新目录
    public function boot()
    {
      $this->configureRateLimiting();

      $this->routes(function () {
        Route::prefix('api')
          ->middleware('api')
          ->namespace($this->namespace)
          ->group(base_path('routes/api.php'));

        // Here
        Route::prefix('api/v1')
          ->middleware(['auth.api'])
          ->namespace($this->namespace)
          ->group(base_path('routes/Api/V1/Users/routes.php'));

        Route::middleware('web')
          ->namespace($this->namespace)
          ->group(base_path('routes/web.php'));
      });
    }

我创建了一条路线:

  Route::post('users/{user}/', function(User $user) {
    dd($user->toArray());
  });

在输出中,我得到一个空数组。

但是如果我定义这条路线,例如,在 api.php 中这样:

  Route::prefix('v1')
    ->group(function () {
      Route::middleware(['auth.api'])->group(function () {
        Route::post('users/{user}/', function(User $user) {
          dd($user->toArray());
        });
      });
    });

模型在那里。如果这不是错误,那为什么会这样?

您的 auth.api 中间件组不包括 \Illuminate\Routing\Middleware\SubstituteBindings::class 中间件。这是负责隐式路由模型绑定的中间件。

将此中间件添加到您的 auth.api 中间件组,它应该可以解决您的问题。