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); } }