Je travaille avec Laravel 5.7 et j'ai besoin de valider une longueur de téléphone en utilisant 2 entrées (préfixe + numéro). Le nombre total de chiffres doit toujours être 10.
J'utilise cette règle personnalisée pour d'autres projets qui fonctionne bien:
$validatedData = $request->validate([
'phones.*.prefix' => 'required',
'phones.*.number' => ['required', new PhoneLength('phones.*.prefix')],
]);
Dans mon contrôleur, je fais quelque chose comme p>
$validatedData = $request->validate([ 'prefix' => 'integer|required', 'number' => ['integer','required', new PhoneLength($request->prefix)], ]);
Je dois maintenant utiliser des tableaux, donc ma nouvelle validation ressemble à
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class PhoneLength implements Rule
{
public $prefix;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct($prefix = null)
{
//
$this->prefix = $prefix;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
//
return strlen($this->prefix)+strlen($value) == 10 ? true : false;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'El Teléfono debe contener 10 dÃgitos (prefijo + número)';
}
}
Le code ci-dessus ne fonctionne pas du tout, le paramètre n'est pas envoyé comme prévu.
Comment puis-je envoyer une valeur de tableau? Bien sûr, j'ai besoin d'obtenir les valeurs du même élément de tableau, donc si téléphones [0] .number est en cours de validation, le préfixe téléphones [0] .prefix est nécessaire .
J'ai trouvé cette question, mais je refuse de croire que ce n'est pas possible de le faire de manière "native": Validation du tableau Laravel avec règle personnalisée
Merci d'avance
3 Réponses :
Vous pouvez obtenir $ prefix à partir de la requête elle-même:
class PhoneLength implements Rule
{
public function passes($attribute, $value)
{
$index = explode('.', $attribute)[1];
$prefix = request()->input("phones.{$index}.prefix");
}
}
ou passer la $ request dans le PhoneLength constructeur de règles, puis utilisez-le.
La réponse de Abdeldayem Sherif est bonne, mais il y a un problème lorsque l'attribut a plus de niveau d'imbrication , par exemple: clients. *. phones. *. prefix . Dans ce cas, l'explosion et l'utilisation de l'index 1 entraîneront une erreur inattendue. Une meilleure solution consiste à utiliser str_replace.
class PhoneLength implements Rule
{
public function passes($attribute, $value)
{
$prefixAttr = str_replace('.number', '.prefix', $attribute);
$prefix = request()->input($prefixAttr);
}
}