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?
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
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
oLoginType
. 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
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
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())
]);
ali hassan
Laravel
//migration
$table->enum('type',[true, false])->default(true);
//controller
$request->validate([
'type' => ['required','in:true,false']
]);