如何在laravel中更改验证类的属性值?考虑以下代码:
class Twice implements Rule
{
public function passes($attribute, $value)
{
$value = $value * 2;
return $value > 20;
}
}
,现在我们收到值乘以2在得分属性:
$rules = [
'score' => [new Twice]
]
如果不行,你有什么建议?
您可以在验证器类中使用prepareForValidation
方法:
protected function prepareForValidation()
{
$this->merge([
'score' => $this->score * 2
]);
}
这将改变score
的值为score * 2
,并使用该值进行任何验证,并返回该值与您的请求数据。
这样做,您也不需要在规则的passes
方法中使用它,因为传入的score
将已经乘以2:
public function passes($attribute, $value)
{
return $value > 20;
}
或者你甚至可以跳过自定义规则,直接使用:
$rules = [
'score' => 'min:21'
]
实际上我们正在尝试将我们庞大的应用程序从yii2迁移到laravel。
在yii2框架中,我们制作了一些规则类,在插入到数据库之前调整数据,例如" convertoenglishhnnumber "转换成"波斯语"数字(۱۲۳۴۵)转换成"英文";数字(12345)。
public function rules()
{
return [
['content', ConverToEnglishNumber::class]
]
}
,但在laravel验证规则类中似乎不可能。经过一天的努力,我认为使用强制类型转换是最好的方法:
namespase AppCasts;
use IlluminateContractsDatabaseEloquentCastsAttributes;
class Double implements CastsAttributes
{
public function set($model, $key, $value, $attributes)
{
return $value * 2;
}
}
namespace AppModels;
use AppCastsDouble;
use IlluminateDatabaseEloquentModel;
class Player extends Model
{
protected $casts = [
'score' => Double::class
];
}