Laravel通过ENUM值验证或验证

May*_*onn 31 php validation enums laravel

我在Laravel开始.我搜索并没有找到如何使用一些ENUM值验证数据.在下面的代码我需要的type只是DEFAULTSOCIAL.一个或其他:

$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'
]);
Run Code Online (Sandbox Code Playgroud)

有可能吗?

Jos*_*ick 81

拉拉维尔 9+

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

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

枚举:

namespace App\Enums;

enum ServerStatus: string {
    case ACTIVE = 'active';
    case INACTIVE = 'inactive';
}
Run Code Online (Sandbox Code Playgroud)

需要 PHP 8.1+


Alu*_*tha 77

in:DEFAULT,SOCIAL
验证字段必须包含在给定的值列表中.

not_in:DEFAULT,SOCIAL
验证字段不得包含在给定的值列表中.

$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'
]);
Run Code Online (Sandbox Code Playgroud)

:)

  • 使用带有 utf-8 字符的值怎么样? (2认同)

Ale*_*dar 8

可接受的答案是可以的,但是我想添加如何设置in规则以使用现有的常量或值数组

因此,如果您有:

class MyClass {
  const DEFAULT = 'default';
  const SOCIAL = 'social';
  const WHATEVER = 'whatever';
  ...
Run Code Online (Sandbox Code Playgroud)

您可以使用Illuminate\Validation\Rulein方法制定验证规则:

'type' => Rule::in([MyClass::DEFAULT, MyClass::SOCIAL, MyClass::WHATEVER])
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经将这些值分组在数组中,则可以执行以下操作:

class MyClass {
  const DEFAULT = 'default';
  const SOCIAL = 'social';
  const WHATEVER = 'whatever';
  public static $types = [self::DEFAULT, self::SOCIAL, self::WHATEVER];
Run Code Online (Sandbox Code Playgroud)

然后将规则写为:

'type' => Rule::in(MyClass::$types)
Run Code Online (Sandbox Code Playgroud)

  • @MarceloFonseca,您可以将这些字段放在模型类中,或者将它们分成自己的类。在OP的示例中,我猜想单独的类可以称为“Login”或“LoginType”。[此处(链接)](/sf/answers/1799418771/) 是在何处以及如何创建枚举的示例。这也可能有帮助:) (2认同)

Ale*_*mos 7

您可以按照文档指示使用Rule类。例如,在迁移中具有以下定义:

$table->enum('letter',['a','b','c']);
Run Code Online (Sandbox Code Playgroud)

现在您的 FormRequest 规则应包含:

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


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

其中,必须包含“ enunRule::in (['a', 'b', 'c'])类型字段的值

这对我来说在 Laravel 8.x 上工作得很好