Laravel 10如何允许特定路由/参数的POST参数包含空格?
Laravel 10 允许嵌套POST参数保留空格的解决方案
针对你遇到的嵌套参数numbering.invoice.priceFormat.decimal无法保留空格的问题,以下是几个可行的解决方法:
方法一:修正中间件的排除配置
Laravel默认的TrimStrings和ConvertEmptyStringsToNull中间件会分别修剪字符串首尾空格、把空字符串转为null,这两个都可能导致你的空格参数失效,需要同时配置排除:
- 修改
app/Http/Middleware/TrimStrings.php的$except数组,添加嵌套参数的点分隔键:
protected $except = [ // 其他已排除的参数 'numbering.invoice.priceFormat.decimal', ];
- 同步修改
app/Http/Middleware/ConvertEmptyStringsToNull.php的$except数组:
protected $except = [ // 其他已排除的参数 'numbering.invoice.priceFormat.decimal', ];
方法二:自定义请求类手动保留空格
如果中间件配置不生效,可以在自定义请求类中,在验证前手动保留目标参数的原始值:
创建app/Http/Requests/NumberingUpdateRequest.php:
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class NumberingUpdateRequest extends FormRequest { public function authorize() { return true; // 根据你的实际权限逻辑调整 } public function rules() { return [ 'numbering.invoice.priceFormat.decimal' => 'required|string', ]; } protected function prepareForValidation() { // 手动保留decimal参数的原始空格值 if (isset($this->numbering['invoice']['priceFormat']['decimal'])) { $decimal = $this->numbering['invoice']['priceFormat']['decimal']; $this->merge([ 'numbering' => [ 'invoice' => [ 'priceFormat' => [ 'decimal' => $decimal, ], ], ], ]); } } }
在路由和控制器中使用这个请求类:
// 路由文件 Route::post('/numbering/update', [NumberingController::class, 'update']); // 控制器方法 public function update(NumberingUpdateRequest $request) { $decimalValue = $request->input('numbering.invoice.priceFormat.decimal'); // 后续业务逻辑 }
方法三:针对特定路由禁用相关中间件
如果仅需在单个路由上允许空格,可以直接禁用该路由的TrimStrings和ConvertEmptyStringsToNull中间件:
Route::post('/your-target-route', [YourController::class, 'handle']) ->withoutMiddleware([ \App\Http\Middleware\TrimStrings::class, \App\Http\Middleware\ConvertEmptyStringsToNull::class, ]);
注意:这个方法会禁用该路由所有参数的修剪和空字符串转null,适合单一特殊场景。
内容的提问来源于stack exchange,提问作者Engazan
相关产品推荐
相关产品推荐

