5
votes

Validation du tableau dans Laravel à l'aide d'une règle personnalisée avec un paramètre supplémentaire

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


0 commentaires

3 Réponses :


3
votes

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.


0 commentaires

0
votes

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


0 commentaires