对于 Laravel post 请求的参数获取,使用
$request->all();
如果前面有空格,该函数本身会对请求参数进行修剪。 我尝试使用
$_POST
而不是 $this->request->all()
;它不会修剪任何请求参数并按预期工作。
$_POST
使用不安全。
请分享建议/想法,我怎样才能做到这一点而不减少任何价值?
您有 HTTP 中间件,其中之一会修剪数据。检查这个:https://github.com/laravel/laravel/blob/9ae75b58a1ffc00ad36bf1e877fe2bf9ec601b82/app/Http/Kernel.php#L22
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array<int, class-string|string>
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
你可以看到有一个
\App\Http\Middleware\TrimStrings::class
,你必须删除那个。
输入值的修剪恰好是由于活跃的全局中间件所致。准确地说是
\App\Http\Middleware\TrimStrings
中间件。
既然您说您不想为整个应用程序禁用中间件,那么您应该考虑仅针对特定路由禁用它。您可以通过两种方式做到这一点:
Route::post('my-route', 'MyRouteController@myRoute')->withoutMiddleware(['trimStrings']);
Route::withoutMiddleware([\App\Http\Middleware\TrimStrings::class])->group(function () {
Route::post('my-route', 'MyRouteController@myRoute');
// Add additional routes within this group.
});
但是请注意,
withoutMiddleware
方法只能移除路由中间件,不适用于全局中间件。由于 TrimStrings
默认是全局中间件,因此您仍然需要从 $middleware
文件中的 app/Http/Kernel.php
数组中删除它,并为您不想删除的所有路由再次手动添加 TrimStrings
中间件它。为此,请使用与选项 2 中所示类似的路由组语法,如下所示:
Route::middleware([\App\Http\Middleware\TrimStrings::class])->group(function () {
// Place all the routes you already had here.
});
您还可以查看文档:https://laravel.com/docs/10.x/middleware#exclusion-middleware
从 laravel 5+ 开始,您应该能够在中间件排除列表 (app/Http/Middleware/TrimStrings.php) 中添加不应被修剪的字段,这可能是完全排除中间件的明智方法。
如果中间件类中要排除的字段列表(如 siux 中提到的)太大,则在 AppServiceProvider 类中,您可以根据 $request 排除 TrimStrings 中间件,如下所示:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
TrimStrings::skipWhen(function ($request) {
return $request->is(['customer/customer-list', 'job/job-list', 'product/product-list']);
});
}
这也适用于全局中间件