Laravel 验证数组 - 传递 2 个参数?
Laravel Validating Arrays - pass 2 parameters?
我需要扩展 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)
}
}
好吧,这是另一种方法。
在您的 AppServiceProvider 中,在 boot()
方法中添加您的自定义处理程序:
\Validator::resolver(function($translator, $data, $rules, $messages) {
return new MyCustomValidator($translator, $data, $rules, $messages);
});
创建解析器class:
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;
}
}
最后,应用规则。如果您需要在至少一个插槽关闭时显示错误,那么您可以使用此规则:
$rules = [
'slots' => ['slots_in_days:days'],
];
看看我是如何将 days
作为参数传递的。此外,如果您需要单独验证每个插槽并为每个插槽显示一条消息,请应用如下规则:
$rules = [
'slots.*' => ['slot:days'],
];
其他文档:
这是制作自定义的正确方法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'
希望这对您有所帮助:)
我需要扩展 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)
}
}
好吧,这是另一种方法。
在您的 AppServiceProvider 中,在
boot()
方法中添加您的自定义处理程序:\Validator::resolver(function($translator, $data, $rules, $messages) { return new MyCustomValidator($translator, $data, $rules, $messages); });
创建解析器class:
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; } }
最后,应用规则。如果您需要在至少一个插槽关闭时显示错误,那么您可以使用此规则:
$rules = [ 'slots' => ['slots_in_days:days'], ];
看看我是如何将
days
作为参数传递的。此外,如果您需要单独验证每个插槽并为每个插槽显示一条消息,请应用如下规则:$rules = [ 'slots.*' => ['slot:days'], ];
其他文档:
这是制作自定义的正确方法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'
希望这对您有所帮助:)