Laravel 获取输入参数而不修剪任何值的方法

问题描述 投票:0回答:4

对于 Laravel post 请求的参数获取,使用

$request->all();

如果前面有空格,该函数本身会对请求参数进行修剪。 我尝试使用

$_POST
而不是
$this->request->all()
;它不会修剪任何请求参数并按预期工作。

$_POST
使用不安全。

请分享建议/想法,我怎样才能做到这一点而不减少任何价值?

laravel post request
4个回答
2
投票

您有 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
,你必须删除那个。


2
投票

输入值的修剪恰好是由于活跃的全局中间件所致。准确地说是

\App\Http\Middleware\TrimStrings
中间件。

既然您说您不想为整个应用程序禁用中间件,那么您应该考虑仅针对特定路由禁用它。您可以通过两种方式做到这一点:

  1. 单一路线:
Route::post('my-route', 'MyRouteController@myRoute')->withoutMiddleware(['trimStrings']);
  1. 路线组:
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


0
投票

从 laravel 5+ 开始,您应该能够在中间件排除列表 (app/Http/Middleware/TrimStrings.php) 中添加不应被修剪的字段,这可能是完全排除中间件的明智方法。


0
投票

如果中间件类中要排除的字段列表(如 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']);
    });
}

这也适用于全局中间件

© www.soinside.com 2019 - 2024. All rights reserved.