Laravel 5.2 在同一页面上登录和注册表单

Posted

技术标签:

【中文标题】Laravel 5.2 在同一页面上登录和注册表单【英文标题】:Laravel login and register forms on the same page in Laravel 5.2 【发布时间】:2016-05-07 22:17:50 【问题描述】:

从 Laravel 5.2 自带的默认认证和注册系统, 只是做了一个简单的视图,可能是欢迎页面,并包括登录和注册表单。 目前,如果按下任何按钮,验证会检查并从两个表单中查找错误,并突出显示所有必需的错误。 那么包含它们的最佳解决方案是什么,并且可能对每个都进行单独验证?

我尝试将默认登录系统更改为与注册表单输入名称不同,但我认为由于验证并将输入值添加到数据库中存在链。

<div class="form-group $errors->has('login_email') ? ' has-error' : '' ">
    <label class="col-md-4 control-label">E-Mail Address</label>
    <div class="col-md-6">
         <input type="email" class="form-control" name="login_email" value=" old('login_email') ">
         @if ($errors->has('login_email'))
              <span class="help-block">
                   <strong> $errors->first('login_email') </strong>
              </span>
         @endif
     </div>
</div>

<div class="form-group $errors->has('login_password') ? ' has-error' : '' ">
     <label class="col-md-4 control-label">Password</label>
          <div class="col-md-6">
                <input type="password" class="form-control" name="login_password">
                @if ($errors->has('login_password'))
                     <span class="help-block">
                          <strong> $errors->first('login_password') </strong>
                     </span>
               @endif
          </div>
      </div>

可以看出,只是将电子邮件和密码输入名称从“email”更改为“login_email”,从“password”更改为“login_password”

欢迎任何快速有效的解决方案/想法

【问题讨论】:

说,Controller@Method 里的名字你也改了吗? 是的,我也修改了这些,然后我收到了 SQL 错误。似乎将输入名称与用户表中的列进行比较,但我认为编辑 try() 方法的核心是一个好主意,因为在下面的代码中,数组包含这些输入名称: if (Auth::guard( $this->getGuard())->attempt($credentials, $request->has('remember'))) return $this->handleUserWasAuthenticated($request, $throttles); 【参考方案1】:

另一个快速但可能不是那么优雅的解决方案是将隐藏字段插入登录表单

&lt;input type="hidden" name="loginform" value="1"&gt;

然后只需检查两种形式的电子邮件和密码错误。

在登录表单中类似于:

@if($errors-&gt;has('password') &amp;&amp; !old('loginform'))

并且在注册表中类似:

@if($errors-&gt;has('password') &amp;&amp; old('loginform'))

不需要服务器端代码。 Laravel 版本 5.*

【讨论】:

【参考方案2】:

在你的 AuthController 的构造函数中设置这个。

/**
 * Create a new authentication controller instance.
 *
 * @return void
 */
public function __construct(Request $request)

    $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    Session::put('last_auth_attempt', $request->auth_attempt);

您必须在隐藏输入中发送“auth_attempt”的值。通过这种方式,您可以在视图中了解您尝试登录或注册的操作。

注册表:

...     

<input type="hidden" name="auth_attempt" value="register">

...

登录表单:

...     

<input type="hidden" name="auth_attempt" value="login">

...

然后在您的验证或您需要的地方,您可以使用以下内容来验证您是否尝试登录或注册。

      <div class="form-group $errors->has('lastName') && Session::get('last_auth_attempt') == 'register' ? ' has-error' : '' ">
        <label for="name">Last Name</label>
        <input id="lastName" type="text" class="form-control" name="lastName" value=" old('lastName') ">

        @if ($errors->has('lastName') && Session::get('last_auth_attempt') == 'register')
            <span class="help-block">
                <strong> $errors->first('lastName') </strong>
            </span>
        @endif
      </div>

【讨论】:

【参考方案3】:

无需更改输入名称,只需覆盖特征函数并从被覆盖的函数中调用它...

完成此操作后,我们可以存储一个会话值,告诉我们身份验证尝试来自登录或注册表单的位置!

    use AuthenticatesUsers, RegistersUsers 
    AuthenticatesUsers::redirectPath insteadof RegistersUsers;
    AuthenticatesUsers::getGuard insteadof RegistersUsers;
    login as traitLogin;
    register as traitRegister;


// Override trait function and call it from the overriden function
public function login(Request $request)

    //Set session as 'login'
    Session::put('last_auth_attempt', 'login');
    //The trait is not a class. You can't access its members directly.
    return $this->traitLogin($request);



public function register(Request $request)

    //Set session as 'register'
    Session::put('last_auth_attempt', 'register');
    //The trait is not a class. You can't access its members directly.
    return $this->traitRegister($request);

并在您的 View.blade 文件中使用您的 Session 值检查您的错误...

<div class="form-group $errors->has('email') && Session::get('last_auth_attempt') == 'login' ? ' has-error' : '' ">
    <label class="col-md-4 control-label">E-Mail</label>

    <div class="col-md-6">
        <input type="email" class="form-control" name="email" value=" old('email') ">

        @if ($errors->has('email') && Session::get('last_auth_attempt') == 'login')
            <span class="help-block">
                <strong> $errors->first('email') </strong>
            </span>
        @endif
    </div>
</div>

通过这个您可以检查按下的按钮是否来自登录或注册按钮

【讨论】:

为什么不使用 session()->flash()?【参考方案4】:

我发现: 在 AuthenticatesUsers 特征中,将每个“电子邮件”更改为“登录电子邮件”,将“密码”更改为“登录密码”。 此外,登录尝试将使用这些作为凭据数组键,因此将此函数编辑为:

protected function getCredentials(Request $request)

    $credentials = $request->only($this->loginUsername(), 'login_password');
    $credentials['email'] = $credentials['login_email'];
    $credentials['password'] = $credentials['login_password'];
    unset($credentials['login_email']);
    unset($credentials['login_password']);
    return $credentials;
    //return $request->only($this->loginUsername(), 'login_password');

现在一切正常。

【讨论】:

您应该将此方法复制到您的 AuthController 并在那里编辑它(以覆盖它),但您的代码就像一个魅力:) @Spidey,你能分享完整的代码吗?我的意思是你在 View 以及控制器和路由中做了什么? @XahedKamal 。代码太长,这里就不加了。我已添加到以下链接,密码为:laravel textcrypt.com/y8zviqqP9z @Spidey,谢谢。但是您似乎添加了错误的控制器?我没有看到任何showLogin 函数 @XahedKamal,是同一个函数,只是重命名。 textcrypt.com/yMB5z5ZpZD密码:laravel

以上是关于Laravel 5.2 在同一页面上登录和注册表单的主要内容,如果未能解决你的问题,请参考以下文章

使用 Laravel 测试两个具有相同输入名称的表单

在 Laravel 中从同一网页发布两个表单

使用 Django 在一个页面上登录和注册表单

在一个用户表中使用 user_type 字段为多个用户创建 laravel 5.2 用户注册

Wordpress - 在同一页面中单独的登录和注册表格

Laravel 5.2:在用户登录/注销和注册后显示会话闪烁消息