使用 RouteServiceProvider.php 时注入模型中没有数据
No data in injected model when using RouteServiceProvider.php
- Laravel 版本:7 或 8.*
- PHP版本:7.4.*
- 数据库:
Postgresql 和 MariaDB
描述:
我在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
中间件组,它应该可以解决您的问题。
- Laravel 版本:7 或 8.*
- PHP版本:7.4.*
- 数据库: Postgresql 和 MariaDB
描述:
我在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
中间件组,它应该可以解决您的问题。