es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando la regla de validación excludes_unless con arreglos en Laravel.

La regla exclude_unless,field,value de Laravel no parece funcionar en el caso en que field es un arreglo de valores y value está contenido en el arreglo field.

Dado lo siguiente:

$validator = Validator::make($request->all(), [
    'some_array' => 'array',
    'some_field' => 'exclude_unless:some_array,foo|alpha_num',
]);

Donde some_array es igual a ['foo'], el validador fallará al excluir some_field. Esto parece ser debido a que la comparación que se realiza con excludes_unless es in_array(['foo'], ['foo']), lo cual devuelve false.

¿Es posible lograr la misma lógica de exclude_unless -excluir un campo de validación si otro campo es igual a cierto valor- pero donde el campo con el que se compara sea un arreglo y se verifique que el valor se encuentra en dicho arreglo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es posible lograr la misma lógica de exclude_unless al comparar un campo de arreglo y verificar si el valor está contenido dentro de ese arreglo. Una forma de hacer esto es utilizando una regla de validación personalizada.

    Primero, crea una nueva regla de validación personalizada extendiendo la clase Illuminate\Validation\Rule de Laravel. Dentro de esta clase, implementa el método passes() y define la lógica de validación personalizada. Aquí tienes un ejemplo de implementación:

    class ExcludeUnlessInArray extends \Illuminate\Validation\Rule
    {
        protected $field;
        protected $value;
    
        public function __construct($field, $value)
        {
            $this->field = $field;
            $this->value = $value;
        }
    
        public function passes($attribute, $value)
        {
            if (is_array($value)) {
                return ! in_array($this->value, $value);
            }
    
            return ! ($this->value == $value);
        }
    
        public function message()
        {
            return 'El campo :attribute está excluido debido a que el campo :field contiene el valor :value.';
        }
    }
    

    Para utilizar esta regla personalizada en tu validador, cambia la regla de validación para some_field a new ExcludeUnlessInArray('some_array', 'foo'). Esto excluirá some_field si some_array es un arreglo y contiene el valor 'foo'.

    Aquí tienes un ejemplo actualizado:

    $validator = Validator::make($request->all(), [
        'some_array' => 'array',
        'some_field' => [new ExcludeUnlessInArray('some_array', 'foo'), 'alpha_num'],
    ]);
    
    if ($validator->fails()) {
        // La validación falló
    }
    

    Esta implementación debería excluir some_field de la validación cuando some_array sea igual a [ 'foo' ].

Comments are closed.