【问题标题】:Object of class Closure could not be converted to string when adding custom validation in Laravel在 Laravel 中添加自定义验证时,类 Closure 的对象无法转换为字符串
【发布时间】:2018-10-29 11:22:55
【问题描述】:

我正在研究 Laravel 中的一些自定义验证规则,其中正在添加一些自定义验证 2 个日期,其中返回日期必须是出发日期后 6 天,当我添加自定义验证时,我不断收到以下错误:

(1/1) 类 Closure 的 ErrorException 对象无法转换为 ValidationRuleParser.php 第 107 行中的字符串

请帮忙

控制器

public function validatePlanEntries(Request $request)
{
    $validation = $this->validate($request, [
        'departure_date' => 'required|date|after:now',

        //Must be 6 days after departure date
        'return_date' => ['required', 'date', function ($attribute, $value, $fail) {
            if (strtotime($value) < strtotime(request('departure_date')) + 518400) {
                $fail('Departure date invalid');
            }
        }],
    ]);
}

【问题讨论】:

  • 确保您使用的是 Laravel 5.6+,因为该版本似乎已添加回调验证
  • 你的 Laravel 版本是什么?我在 Laravel 5.7 中测试了你的代码,它可以工作。
  • @apokryfos 非常感谢,,,我正在使用在 Laravel 5.4 中构建的现有代码库。我如何在 5.4 版中解决上述问题
  • @ljas 版本 5.4

标签: laravel date customvalidator


【解决方案1】:

正如您在评论中提到的,您使用的 Laravel 版本不支持回调验证规则,不幸的是,您可以做到这一点的唯一方法是使用新规则扩展验证器。

将此添加到您的服务提供商之一(例如AppServiceProvider

public function boot() {
     //Other boot things

    $validator = app()->make(\Illuminate\Validation\Factory::class);
    $validator->extend('return_date_after', function ($attribute, $value, $parameters, $validator) {
          $otherAttribute = array_get($parameters, 0);
          $days = array_get($parameters, 1, 6); //default 6 days
          $otherValue = array_get($validator->getData(), $otherAttribute);
          if (strtotime($value) < strtotime($otherValue) + $days*24*60*60) {
            return false;
          }
          return true;
    });

    $validator->replacer('return_date_after', function ($message, $attribute, $rule, $parameters) {
          return 'Your return date must be '.array_get($parameters,1,6).' days after your '.array_get($parameters, 0);
   });
}

然后您可以将此自定义规则用作:

  $validation = $this->validate($request, [
        'departure_date' => 'required|date|after:now',

        //Must be 6 days after departure date
        'return_date' => ['required', 'date', 'return_date_after:departure_date,6' ]
    ]);

请注意,替换器中的 $message 来自 resources/lang/&lt;locale&gt;/validation.php,因此您可以在其中添加一个条目,例如“return_date_after”并在替换器中对其进行操作,而不是返回静态文本。例如:

"return_date_after" => "Your :attribute must be :days days after your :other_attribute"

然后你的替代者可以是:

 $validator->replacer('return_date_after', function ($message, $attribute, $rule, $parameters) {
      return str_replace([ ":days", ":other_attribute" ], 
          [ array_get($parameters, 1, 6), array_get($parameters,0) ], 
          $message);        
});

【讨论】:

  • ,,,, 你是救命稻草.. 非常感谢.. 如果我想将天数减少到 4 天怎么办
  • 此处定义的规则使用参数,因此如果您将其用作return_date_after:departure_date,4,它应该适合您。规则中: 之后的任何内容都是以逗号分隔的参数列表,这些参数位于$parameters 数组中
猜你喜欢
  • 2013-08-22
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多