Laravel5.5 怎么重写 auth 环节中 Illuminate\Foundation\Auth\RegistersUsers 的 register 方法?

场景#

在做一个注册页面,使用了 laravel5.5 自带的 auth 功能,但验证用到了 geetest 的拖动验证,不是数字验证。这个需要二次验证,并且直接用到 form 表单提交。在 register 的时候,不能直接使用 Illuminate\Foundation\Auth\RegistersUsersregister 方法,需要对其进行重写。在 controller 中进行重写。其实,这个不是调用父类的方法。

需要使用到的几个类#

App\Http\Controllers\Auth\RegisterController
form 表单提交经过路由,就直接调用这里的 register 方法,可是这里没有 register 方法。

Illuminate\Foundation\Auth\RegistersUsers
上边说了,controller 中没有 register 方法,其实,register 方法,就在这个类中。

再看 register 方法。
Illuminate\Foundation\Auth\RegistersUsers

public function register(Request $request)
{
    $this->validator($request->all())->validate();

    event(new Registered($user = $this->create($request->all())));

    $this->guard()->login($user);

    return $this->registered($request, $user)
                    ?: redirect($this->redirectPath());
}

第一步,就是进行验证。但是我所需要的场景中的验证,这里满足不了。所以在 RegisterController 中重写了 register 方法。先进行验证,然后想再调用这里的 register 方法。这里,GeetestLib 是我自己封装的一个服务,使用的 geetest 的 api。我 php 不好(从 as3 转过来的),这里不懂怎么调用,有会的朋友,请指教一下。或是有其他好的思路。谢谢。

我的代码#

App\Http\Controllers\Auth\RegisterController

public function register(Request $request, GeetestLib $geetestLib)
{
    $this->__validGeetestData($request->all(), '请先完成验证!');

    $geetest_challenge = $request->input('geetest_challenge');
    $geetest_validate = $request->input('geetest_validate');
    $geetest_seccode = $request->input('geetest_seccode');

    // 二次验证
    $gtserver = Session::get('gtserver');
    if($gtserver == 1)
    {
        $data = array(
            "user_id" => 'xishui',
            "client_type" => "web",
            "ip_address" => $request->getClientIp()
          );

        $result = $geetestLib->success_validate($geetest_challenge, $geetest_validate, 
                                            $geetest_seccode,$data);
        if($result == FALSE)
            $this->__validGeetestData(array(), '二次验证不通过!');
    }
    else
    {
        $result = $geetestLib->fail_validate($geetest_challenge, $geetest_validate, 
                                            $geetest_seccode);
        if($result == FALSE)
            $this->__validGeetestData(array(), '宕机,二次验证不通过!');
    }
    //$registerUsers->register($request);
}

private function __validGeetestData($data, $message)
{
    return Validator::make($data, [
        'geetest_validate' => 'required',
    ], [
        'geetest_validate.required' => $message,
    ])->validate();
}

(https://blog.vini123.com/wp-content/uploads/2017/12/20171201112138.png

直播间 熊猫血 虚幻之物对应着冥冥之路!
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

再看了下 Illuminate\Foundation\Auth\RegistersUsers,发现类的修饰是 trait。这个解释是将该类混入到引用的类中。既然这样,干脆将 RegistersUsers 的 register 方法完全复制到 App\Http\Controllers\Auth\RegisterController 中。记得引入 Illuminate\Auth\Events\Registered
完整代码如下:

  public function register(Request $request, GeetestLib $geetestLib)
  {
      $this->__validGeetestData($request->all(), '请先完成验证!');

      $geetest_challenge = $request->input('geetest_challenge');
      $geetest_validate = $request->input('geetest_validate');
      $geetest_seccode = $request->input('geetest_seccode');

      // 二次验证
      $gtserver = Session::get('gtserver');
      if($gtserver == 1)
      {
          $data = array(
              "user_id" => 'xishui',
              "client_type" => "web",
              "ip_address" => $request->getClientIp()
            );

          $result = $geetestLib->success_validate($geetest_challenge, $geetest_validate, $geetest_seccode, $data);
          if($result == FALSE)
              $this->__validGeetestData(array(), '二次验证不通过!');
      }
      else
      {
          $result = $geetestLib->fail_validate($geetest_challenge, $geetest_validate, $geetest_seccode);
          if($result == FALSE)
              $this->__validGeetestData(array(), '宕机,二次验证不通过!');
      }
      // 完全照搬register中的方法,下边一句进行验证其他字段
      $this->validator($request->all())->validate();

      event(new Registered($user = $this->create($request->all())));

      $this->guard()->login($user);

      return $this->registered($request, $user)
                      ?: redirect($this->redirectPath());
  }

  private function __validGeetestData($data, $message)
  {
      return Validator::make($data, [
          'geetest_validate' => 'required',
      ], [
          'geetest_validate.required' => $message,
      ])->validate();
  }

至此,注册不再那么尴尬了。

7年前 评论