Laravel 10.x如何在请求到达控制器前转换查询参数类型?
问题描述
我有一个GET端点,接受布尔类型的active和整数类型的ID作为查询参数,示例请求为GET /stuff?active=1&ID=10,两个参数均非必填。当发起GET /stuff?active=1请求并通过$request->get('active')获取值时,得到的是字符串类型的1。在开启declare(strict_types=1)后,调用服务中定义的public function getBy(bool $active = null)方法时,会抛出Argument #0 ($active) must be of type ?bool, string given错误。我想知道:能否在请求到达控制器前转换参数类型?比如通过FormRequest类实现?我知道可以在控制器中写$request->has('active') ? filter_var($request->get('active'), FILTER_VALIDATE_BOOLEAN) : null,但不想在控制器中添加这类冗余代码。
解决方案:用FormRequest自动转换请求参数类型
当然可以通过FormRequest在请求进入控制器前完成参数类型转换,完全不用在控制器里写冗余代码。以下是具体实现步骤:
1. 创建自定义FormRequest类
运行Artisan命令生成FormRequest:
php artisan make:request StuffRequest
2. 在FormRequest中定义参数转换与验证逻辑
打开生成的app/Http/Requests/StuffRequest.php,添加参数预处理方法并完善验证规则:
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StuffRequest extends FormRequest { /** * 校验用户权限(根据实际业务调整) */ public function authorize(): bool { return true; } /** * 验证前预处理参数,完成类型转换 */ protected function prepareForValidation(): void { // 转换active为布尔类型:支持'1'/'true'转true,'0'/'false'转false if ($this->has('active')) { $this->merge([ 'active' => filter_var($this->input('active'), FILTER_VALIDATE_BOOLEAN), ]); } // 转换ID为整数类型 if ($this->has('ID')) { $this->merge([ 'ID' => (int)$this->input('ID'), ]); } } /** * 定义参数验证规则,确保转换后的值符合预期 */ public function rules(): array { return [ 'active' => 'nullable|boolean', 'ID' => 'nullable|integer|min:1', ]; } }
3. 在控制器中使用自定义FormRequest
将控制器方法的请求参数替换为StuffRequest,之后直接使用转换后的参数即可:
<?php namespace App\Http\Controllers; use App\Http\Requests\StuffRequest; use App\Services\YourService; // 替换为你的实际服务类 class StuffController extends Controller { public function index(StuffRequest $request, YourService $service) { // 此处$request->active已为布尔类型(或null),可直接传入服务方法 $data = $service->getBy($request->active); return response()->json($data); } }
关键说明
prepareForValidation方法会在验证逻辑执行前触发,是处理参数转换的最佳时机。- 用
filter_var配合FILTER_VALIDATE_BOOLEAN可以兼容多种布尔格式的输入,比手动判断更健壮。 - 验证规则可以进一步确保参数的合法性,避免无效值流入业务逻辑。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

