Laravel对查询参数的严格类型校验
我正在开发一个Laravel应用,它使用查询参数(GET参数)来实现前后端的通信。为了验证这些参数,我扩展了FormRequest类:
class CommunityRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'radius' => ['sometimes', 'nullable', 'integer:strict', 'min:1'],
];
}
}
如前所述,radius 参数可以省略或为null,但出现时必须是整数。
:strict 标志仅在参数属于指定类型时才通过验证,例如不会通过将整数的字符串值作为参数的情况(即 radius='15' 不通过验证)。
要获取该参数的验证后值,我按如下所示:
class CommunityController extends Controller
{
public function index(CommunityRequest $request): Response{
$radius = $request->validated('radius');
// [...]
}
}
此外,我的查询URL看起来是这样的:
127.0.0.1:8080/community?radius=300
问题在于 validated 调用总是返回null,因为我验证中的 :strict 标志会拒绝通过查询参数传递的任何值,因为它们总是被视为字符串,在验证之前或之后都不会被转换成任何类型。
总之,我在应用中其实并不需要使用 :strict 标志,但我至少希望验证能够把参数自动转换为PHP的原生类型(布尔值、整数、浮点数,甚至可能是日期/时间?)。
是否有解决办法,还是我注定要在FormRequest/Controller中自己逐一检查所有类型?
解决方案
你可以在验证运行之前对其进行修改,在你的请求类中添加(https://laravel.com/docs/13.x/validation#preparing-input-for-validation);
protected function prepareForValidation(): void
{
if (! empty($this->radius)) {
$this->merge([
'radius' => (int) $this->radius,
]);
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。