Laravel IN Validación o Validación por valores ENUM

4 minutos de lectura

avatar de usuario
Maykonn

Me estoy iniciando en Laravel. Busqué y no encontré cómo validar datos con algunos valores ENUM. En el siguiente código necesito eso type debe ser justo DEFAULT o SOCIAL. Uno u otro:

$validator = Validator::make(Input::only(['username', 'password', 'type']), [
    'type' => '', // DEFAULT or SOCIAL values
    'username' => 'required|min:6|max:255',
    'password' => 'required|min:6|max:255'
]);

¿Es posible?

avatar de usuario
Alupotha

en:DEFECTO,SOCIAL

El campo bajo validación debe incluirse en la lista de valores dada.

not_in:DEFAULT,SOCIAL

El campo bajo validación no debe estar incluido en la lista de valores dada.

$validator = Validator::make(Input::only(['username', 'password', 'type']), [
    'type' => 'in:DEFAULT,SOCIAL', // DEFAULT or SOCIAL values
    'username' => 'required|min:6|max:255',
    'password' => 'required|min:6|max:255'
]);

  • ¿Qué hay de usar valores con caracteres utf-8?

    – mirza

    6 de agosto de 2015 a las 6:59

  • qué pasa Default, Social, DeFauLt, social?

    – Justin Moh

    14 de agosto de 2015 a las 9:22

  • @JustinMoh Creo que las validaciones in y not_in deben ser los valores exactos, para su caso, la validación de expresiones regulares funciona bien.

    – Maykonn

    15 de marzo de 2016 a las 14:09

  • @JustinMoh puede convertir la entrada de su solicitud en mayúsculas y validar.

    – Alupota

    31/10/2017 a las 23:03

avatar de usuario
aleksandar

La respuesta aceptada está bien, pero quiero agregar cómo configurar el in regla para usar constantes existentes o una matriz de valores.

Entonces, si tienes:

class MyClass {
  const DEFAULT = 'default';
  const SOCIAL = 'social';
  const WHATEVER = 'whatever';
  ...

Puedes hacer una regla de validación usando Illuminate\Validation\Rule‘s in método:

'type' => Rule::in([MyClass::DEFAULT, MyClass::SOCIAL, MyClass::WHATEVER])

O, si ya tiene esos valores agrupados en una matriz, puede hacer:

class MyClass {
  const DEFAULT = 'default';
  const SOCIAL = 'social';
  const WHATEVER = 'whatever';
  public static $types = [self::DEFAULT, self::SOCIAL, self::WHATEVER];

y luego escribe la regla como:

'type' => Rule::in(MyClass::$types)

  • ¿Dónde crearía y cómo nombraría el ejemplo de MyClass en un proyecto de Laravel?

    –Marcelo Fonseca

    18 de marzo de 2020 a las 19:43

  • @MarceloFonseca podría poner estos campos en una clase de modelo o separarlos en su propia clase. En el ejemplo de OP, supongo que la clase separada podría llamarse Login o LoginType. Aquí (enlace) hay un ejemplo de dónde y cómo puede crear enumeraciones. Eso también podría ayudar 🙂

    – Aleksandar

    19 de marzo de 2020 a las 8:51

avatar de usuario
jose bonnick

Laravel 9+

https://laravel.com/docs/9.x/validation#rule-enum

use App\Enums\ServerStatus;
use Illuminate\Validation\Rules\Enum;
 
$request->validate([
    'status' => [new Enum(ServerStatus::class)],
]);

enumeración:

namespace App\Enums;

enum ServerStatus: string {
    case ACTIVE = 'active';
    case INACTIVE = 'inactive';
}

Requiere PHP 8.1+

  • por favor agregue cómo debe el ServerStatus enum parece, ¿es una enumeración de php o solo una matriz?

    – Yasser CHENIK

    15 de febrero a las 13:21

  • @YasserCHENIK actualizó mi respuesta para incluir un ejemplo de enumeración.

    –Josh Bonnick

    15 de febrero a las 15:06

  • ¿También sabe cómo hacer que los valores de enumeración no distingan entre mayúsculas y minúsculas?

    – NicoHood

    23 de mayo a las 11:37

avatar de usuario
Alejandro Ramos

Puedes usar el Regla clase como te documentación indica. Por ejemplo, tener la siguiente definición en una migración:

$table->enum('letter',['a','b','c']);

Ahora sus reglas para su FormRequest deberían poner:

class CheckInRequest extends FormRequest
{ 
    public function authorize()
    {
        return true;
    }


    public function rules()
    {
        return [
            'letter'=>[
                'required',
                 Rule::in(['a', 'b','c']),
             ],
        ];
    }
}

Dónde Rule::in (['a', 'b', 'c'])debe contener los valores de su campo de tipo “enun

Esto funciona bien para mí en Laravel 8.x

Laravel 9 php8.1

$request->validate([
    'type' => [new Enum(TypeEnum::class)],
]);

Menos o igual php 8

puedes ser dueño de la enumeración

class BaseEnum
{
    /**
     * Returns class constant values
     * @return array
     */
    public static function toArray(): array
    {
        $class = new \ReflectionClass(static::class);

        return array_values($class->getConstants());
    }

    /**
     * @return string
     */
    public function __toString(): string
    {
        return implode(',', static::toArray());
    }
}

enumeración secundaria

class TypeEnum extends BaseEnum
{
    public const DEFAULT = 'default';
    public const SOCIAL = 'social';
}

en la validación puedes usarlo de dos maneras diferentes

primero

$request->validate([
        'type' => 'in:' . new TypeEnum(),
    ]);

segundo

use Illuminate\Validation\Rule;

    $request->validate([
                'type' => Rule::in(TypeEnum::toArray())
            ]);

avatar de usuario
ali hassan

Laravel

//migration
    $table->enum('type',[true, false])->default(true);

//controller
    $request->validate([
       'type' => ['required','in:true,false']
    ]);

¿Ha sido útil esta solución?