Laravel 注册。仅注册拥有来自特定域的电子邮件的用户

xhu*_*lio 2 php laravel laravel-5

我有一个 Laravel 应用程序,我想将注册的用户限制为仅拥有公司电子邮件的特定目标组。我在我的Registrar.php

public function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|max:255',
        'lastname' => 'required|max:255',
        'email' => 'required|email|max:255|unique:users',

        'password' => 'required|confirmed|min:6',
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return User
 */
public function create(array $data)
{
    $result = null;
    $confirmation_code = str_random(30);

    $data = array_add($data, 'conf',$confirmation_code);
    if(!$data['email'].ends_with(('email'), 'specificdomain.com')){
        Flash::message('Welcome ' .$data["name"]. '. Thanks for registering. We have sent you a validation link in your e-mail address!');
        Mail::send('emails.verify', $data, function($message) use ($data) {
            $message->to($data['email'], $data['name'])
                ->subject('Verify your email address');
        });
        $result = User::create([
            'name' => $data['name'],
            'lastname' => $data['lastname'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
            'confirmation_code' => $confirmation_code
        ]);

    }else{
       $result = Flash::warning('Hi ' .$data["name"]. '. We appreciate your interest on using our System. However at the moment we offer this service only to this company!');
        //break;
    }
    return $result;

}
Run Code Online (Sandbox Code Playgroud)

这将引发以下异常

Argument 1 passed to Illuminate\Auth\Guard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, Laracasts/Flash/Flash given.
Run Code Online (Sandbox Code Playgroud)

我不能在 else 语句中中断,因为我得到以下信息:

Cannot break/continue 1 level
Run Code Online (Sandbox Code Playgroud)

显然我必须return Users::create([....])这样做,但我必须将此块保留在 if 语句之外。如果我这样做,我将无法检查电子邮件域是否是必需的。所以我问,我怎样才能将它集成到public function validator(array $data){.....}块中?

感谢所有的帮助。

Fra*_*ere 7

您可以在验证器规则中扩展电子邮件验证,例如:

'email' => 'required|email|max:255|unique:users|regex:/(.*)your\.domain\.com$/i',
Run Code Online (Sandbox Code Playgroud)

(或者如果您需要在正则表达式中使用管道将其作为数组传递)

然后,您可以向验证器添加一系列消息,例如:

$messages = array(
 'email.regex' => 'We appreciate your interest on using our System. However at the moment we offer this service only to this company!',
Run Code Online (Sandbox Code Playgroud)

);

在您调用 Validator 的地方添加消息作为第三个参数:

// Where $rules is the array you pass on now
$validator = Validator::make($data, $rules, $messages);
Run Code Online (Sandbox Code Playgroud)

在 laravel文档中,您可以准备好有关响应的所有内容。

您不能退回 Flash。您可以使用Flash(在您的情况下)将消息放入会话中,该消息将在请求后删除。我不完全确定您如何调用 create 函数以及返回的预期结果应该是什么,但我会与此保持一致。由于您现在可以使用验证消息来解决它,因此您应该只需要显示成功消息或错误。