Laravel Контроллер регистрации только для разрешения определенных c писем для регистрации - PullRequest
0 голосов
/ 20 января 2020

У меня есть этот валидатор

    protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

и я хочу, чтобы он принимал письма только из списка, который у меня есть. у меня есть 300 электронных писем, и мне было интересно, как лучше всего это сделать?

Я пытался:

    $allowed_emails = array ('one@two.three')
return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'in_array:allowed_emails', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);

Что говорит о том, что электронная почта не находится в массиве разрешенных писем &

return Validator::make($data,$allowed_emails = array ('one@two.three'), [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);

Который позволяет что-либо пройти.

Как я могу решить проблему?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Вы должны использовать объект Rule (https://laravel.com/docs/6.x/validation#using -rule-objects ) для создания пользовательского правила проверки.

Внутри этого объекта вы сможете писать все логи c, необходимые для вашего конкретного c варианта использования.

[РЕДАКТИРОВАТЬ]

Чтобы завершить мой ответ, вот как вы это делаете с объект пользовательского правила:

$data = [
    'name' => 'HelloWorld',
    'email' => 'hello@world.de',
    'password' => 'secret123',
    'password_confirmation' => 'secret123'
];

$val = \Validator::make($data, [
    'name' => ['required', 'string', 'max:255'],
    'email' => ['required', new AllowedEmailsRule(), 'string', 'email', 'max:255', 'unique:users'],
    'password' => ['required', 'string', 'min:8', 'confirmed']
]);

И класс AllowedEmailsRule:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class AllowedEmailsRule implements Rule
{
    private $emails = [
        'abc@abc.com',
        'hello@world.de',
        'foo@bar.co.uk'
    ];

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return in_array($value, $this->emails);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'Your email address is not allowed.';
    }
}
0 голосов
/ 20 января 2020

Попробуйте использовать Rule::in следующим образом:

use Illuminate\Validation\Rule;

protected function validator(array $data)
{
    $allowed_emails = ['one@two.three']

    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => [
            'required', 'string', 'email', 'max:255', 'unique:users',
            Rule::in($allowed_emails)
        ],
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ]);
}

См. Laravel документы Форма получения дополнительной информации.

...