【问题标题】:changing attribute value on validation class in laravel在laravel中更改验证类的属性值
【发布时间】:2021-10-18 19:15:09
【问题描述】:

我们如何在 laravel 中更改验证类的属性值? 考虑这段代码:

class Twice implements Rule
{ 
  public function passes($attribute, $value)
    {
        $value = $value * 2;
        return $value > 20;
    }
}

现在我们在 score 属性中得到乘以 2 的值:

$rules = [
'score' => [new Twice]
]

如果我们不能,您有什么建议?

【问题讨论】:

  • 如果验证通过,您是否要从验证器返回$value * 2
  • 是的,正是:)
  • 这是一个验证规则而不是数据处理器。你可以在任何你喜欢的地方更改你的数据!

标签: laravel laravel-validation


【解决方案1】:

您可以在验证器类中使用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'
]

【讨论】:

    【解决方案2】:

    实际上我们正在尝试将我们庞大的应用程序从 yii2 迁移到 laravel。

    在 yii2 框架中,我们制作了一些规则类,用于在插入数据库之前调整数据,例如“ConverToEnglishNumber”,它将“波斯”数字 (12345) 转换为“英语”数字 (12345)。

    public function rules()
    {
      return [
        ['content', ConverToEnglishNumber::class]
      ]
    }
    

    但在 laravel 验证规则类中似乎是不可能的。 经过一天的挣扎,我认为使用演员表是最好的方法:

    namespase App\Casts;
    
    use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
    
    class Double implements CastsAttributes
    {
        public function set($model, $key, $value, $attributes)
        {
            return $value * 2;
        }
    }
    
    namespace App\Models;
    
    use App\Casts\Double;
    use Illuminate\Database\Eloquent\Model;
    
    class Player extends Model
    {
      protected $casts = [
        'score' => Double::class
      ];
    }
    
    

    【讨论】:

    • 听起来你已经有了一些适合你的东西,但是对于那种场景,你也可以使用模型上的设置器。 public function setScoreAttribute($value) { $this->attributes['score'] = $value * 2; } 之类的东西——这样做会在保存时将分数设置为 $value * 2。请注意,它会每次保存它,您需要考虑这一点。
    • 是的,非常感谢,使用 setter 是另一种方法,但它不可重用。我们希望在很多地方使用
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2018-03-18
    • 2020-04-26
    • 1970-01-01
    • 2017-02-03
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多