我已用其他方法解决 。找了很久,想了很久,貌似不能直接在验证里面做转化,但是我想到了一个更好的解决办法,解决方法如下 :
Laravel 有中间件,我们通常在中间件中做一些过滤 HTTP 请求的操作,但是还能做很多“请求预处理”操作,如 Laravel 内置的 TrimStrings 中间件 和 ConvertEmptyStringsToNull 中间件 ,这两个中间件都会把请求来的参数做些预处理操作,具体的使用请看源码 。
所以 , 我的解决方法就是创建一个 ConvertNumericStringsToInt 中间件 :
class ConvertNumericStringsToInt extends TransformsRequest
{
/**
* The attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
//
];
/**
* Transform the given value.
*
* @param string $key
* @param mixed $value
* @return mixed
*/
protected function transform($key, $value)
{
$transform = false;
if ($key === 'id') {
// 参数为 id
$transform = true;
} else if (1 === preg_match('/^[a-zA-Z][0-9a-zA-Z]*_id$/', $key)) {
// 参数为 *_id
$transform = true;
} else if (1 === preg_match('/^[a-zA-Z][0-9a-zA-Z]*Id$/', $key)) {
// 参数为 *Id
$transform = true;
}
if ($transform) {
if (!is_numeric($value)) {
// 做你自己想做的处理( 如抛出异常 )
}
return is_numeric($value) ? intval($value) : $value;
}
// 返回原值
return $value;
}
}
这样,只要我们的传来的参数是 id , 或者 _id( user_id ),或者 Id( 如userId ),这个中间件都能检测,一旦发现不是数字 , 就会被处理( 如抛出异常 ),如果是数字的话,会被强转为int类型,我们之后的程序中就不用做任何处理了。
根据自己的使用情况决定是否将此中间件应用都全局中 。