【问题标题】:Laravel Validating Arrays - pass 2 parameters?Laravel 验证数组 - 传递 2 个参数?
【发布时间】:2017-03-31 08:49:45
【问题描述】:

我需要扩展 laravel 验证器来创建一个新的验证器,但问题是我需要传递 2 个参数,一个用于days,一个用于slots。如何解决?

例如dd($request->all)转储:

array:2 [
  "days" => array:2 [
    0 => "1" // Mon
    1 => "2" // Tue
  ]
  "slots" => array:2 [
    1 => array:2 [
      "open" => "09:00"
      "close" => "11:30"
    ]
    2 => array:2 [
      "open" => "16:00"
      "close" => "21:00"
    ]
  ]
]

它需要遍历days并检查slots

伪代码,示例:

foreach($days as $day) {
  foreach($slots as $slot) 
   {
      // Validation Logic for $day and $slot (open and close)
   }
}

【问题讨论】:

    标签: php laravel laravel-5.3


    【解决方案1】:

    这是进行自定义 Laravel 验证的正确方法

    使用

    创建您自己的验证服务提供者
    php artisan make:provider ValidationServiceProvider
    

    然后转到config\app.php 并将其添加到providers

    App\Providers\ValidationServiceProvider::class
    

    现在转到ValidationServiceProvider.php 并添加

    use Validator;
    

    到顶部...

    这在boot() 函数中

    Validator::extend('days_with_slots', function($attribute, $value, $parameters, $validator) {
      $slots = request()->get('slots');
    
      if(!is_array($slots)) return false;
    
      foreach($days as $day) {
        foreach($slots as $slot) {
          if(empty($slot[$day]) || empty($slot[$day]['open'] || empty($slot[$day]['close']))) {
            return false;
          }
        }
      }
    });
    

    最后,在你的规则中使用它

    $rules['slots'] = 'days_with_slots'
    

    您还可以为其添加自定义消息,例如

    $message['days_with_slots'] = 'Open and Close Timings are required for the days selected'
    

    希望这会有所帮助:)

    【讨论】:

    • 如何在Validator::extend 中定义自定义错误消息?每个错误消息都应该有槽键
    • 我想把open和close的值放在错误信息里。
    • @I'll-Be-Back 抱歉,回复晚了...请下次标记我,以便我知道...由于某种原因我没有收到通知。您可以将所有扩展验证消息添加到全局列表...resources/lang/validations.php 或制作您自己的验证器(通过扩展 Illuminate\Validation\Validator)并用您自己的覆盖消息函数...并使用您自己的验证器.. .
    【解决方案2】:

    嗯,这是另一种方法。

    1. 在您的 AppServiceProvider 中,在 boot() 方法中添加您的自定义处理程序:

      \Validator::resolver(function($translator, $data, $rules, $messages) {
          return new MyCustomValidator($translator, $data, $rules, $messages);
      });
      
    2. 创建解析器类:

      class MyCustomValidator extends Illuminate\Validation\Validator;
      {
          public function validateSlotsInDays($attribute, $value, $parameters){
              $valid = false;
              $days = \Request::input($parametros[0]);
              $slots = $value;
      
              foreach($days as $day) {
                  foreach($slots as $slot) {
                      // Validation Logic for $day and $slot (open and close)
                  }
               }
      
              return $valid;
          }
      
          public function validateSlot($attribute, $value, $parameters){
              $valid = false;
              $days = \Request::input($parametros[0]);
              $slot = $value;
              foreach($days as $day) {
                  // do whatever here
              }
      
      
              return $valid;
          }
      
      }
      
    3. 最后,应用规则。如果您需要在至少一个插槽关闭时显示错误,那么您可以使用此规则:

      $rules = [
          'slots' => ['slots_in_days:days'],
      ];
      

      看看我是如何将days 作为参数传递的。此外,如果您需要单独验证每个插槽并为每个插槽显示一条消息,则应用如下规则:

      $rules = [
          'slots.*' => ['slot:days'],
      ];
      

    其他文档:

    【讨论】:

    • Validator::resolverValidator::extend 有什么区别?
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 2018-08-21
    • 1970-01-01
    • 2018-11-13
    • 2018-06-03
    • 2019-10-29
    • 2012-01-16
    • 2017-09-23
    相关资源
    最近更新 更多