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

直播间 熊猫血 虚幻之物对应着冥冥之路!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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();
  }

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

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!