Laravel实现用户注册和登录

我会详细讲解一下Laravel实现用户注册和登录的完整攻略。

环境准备

首先,我们需要准备好Laravel开发环境,包括PHP、Composer等。具体的安装过程可以参考Laravel的官方文档。

创建用户模型和数据库表

在Laravel中,可以使用Artisan命令来快速生成用户模型和数据库迁移文件:

php artisan make:model User -m

执行这条命令后,Laravel会同时生成一个名为User的模型文件和一个名为create_users_table的迁移文件。我们可以在create_users_table文件中定义用户表的各个字段:

Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

然后执行迁移命令:

php artisan migrate

该命令会在数据库中创建一个名为users的表,用于存储用户信息。

创建用户注册页面

为了让用户能够注册,我们需要创建一个注册页面。可以在resources/views/auth/register.blade.php创建该页面:

@extends('layouts.app')

@section('content')
    <div class="card">
        <div class="card-header">{{ __('Register') }}</div>
        <div class="card-body">
            <form method="POST" action="{{ route('register') }}">
                @csrf
                <div class="form-group row">
                    <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                    <div class="col-md-6">
                        <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                        @error('name')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>

                <div class="form-group row">
                    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                    <div class="col-md-6">
                        <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">

                        @error('email')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>

                <div class="form-group row">
                    <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                    <div class="col-md-6">
                        <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">

                        @error('password')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>

                <div class="form-group row">
                    <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                    <div class="col-md-6">
                        <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                    </div>
                </div>

                <div class="form-group row mb-0">
                    <div class="col-md-6 offset-md-4">
                        <button type="submit" class="btn btn-primary">
                            {{ __('Register') }}
                        </button>
                    </div>
                </div>
            </form>
        </div>
    </div>
@endsection

routes/web.php文件中添加如下代码:

Route::get('/register', function () {
    return view('auth.register');
});

这样,当用户访问/register地址时,会显示出注册页面。

处理用户注册请求

当用户在注册页面填写好用户名、邮箱和密码后,需要将这些信息提交到后端进行处理。现在我们来处理这些请求。

app/Http/Controllers/Auth/RegisterController.php控制器中,我们需要添加一个register方法,该方法用于处理注册请求:

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

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

    Auth::login($user);

    return redirect($this->redirectPath());
}

这个方法首先会校验注册信息的合法性,然后使用create方法将用户信息存储到数据库中。最后,将用户信息写入到当前会话中,实现用户的登录状态。但是,我们还没有实现createvalidator方法,现在我们一起实现这两个方法。

validator方法用于校验用户提交的信息是否合法。我们需要在app/Http/Controllers/Auth/RegisterController.php控制器中添加该方法:

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'],
    ]);
}

这里我们使用了Laravel提供的Validator类,支持多种验证规则。

create方法用于将注册信息写入到数据库中。我们需要在app/Http/Controllers/Auth/RegisterController.php控制器中添加该方法:

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

这个方法将用户的密码进行加密后存储到数据库中,增加了账户的安全性。

创建用户登录页面

在Laravel中,用户登录页面同样可以使用Laravel自带的auth视图模板,可以在resources/views/auth/login.blade.php创建该页面。

@extends('layouts.app')

@section('content')
    <div class="card">
        <div class="card-header">{{ __('Login') }}</div>
        <div class="card-body">
            <form method="POST" action="{{ route('login') }}">
                @csrf
                <div class="form-group row">
                    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                    <div class="col-md-6">
                        <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                        @error('email')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>

                <div class="form-group row">
                    <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                    <div class="col-md-6">
                        <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                        @error('password')
                            <span class="invalid-feedback" role="alert">
                                <strong>{{ $message }}</strong>
                            </span>
                        @enderror
                    </div>
                </div>

                <div class="form-group row">
                    <div class="col-md-6 offset-md-4">
                        <div class="form-check">
                            <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                            <label class="form-check-label" for="remember">
                                {{ __('Remember Me') }}
                            </label>
                        </div>
                    </div>
                </div>

                <div class="form-group row mb-0">
                    <div class="col-md-8 offset-md-4">
                        <button type="submit" class="btn btn-primary">
                            {{ __('Login') }}
                        </button>

                        @if (Route::has('password.request'))
                            <a class="btn btn-link" href="{{ route('password.request') }}">
                                {{ __('Forgot Your Password?') }}
                            </a>
                        @endif
                    </div>
                </div>
            </form>
        </div>
    </div>
@endsection

routes/web.php文件中添加如下代码:

Route::get('/login', function () {
    return view('auth.login');
});

这样,当用户访问/login地址时,会显示出登录页面。

处理用户登录请求

当用户在登录页面输入用户名和密码后,需要将这些信息提交到后端进行处理。现在我们来处理这些请求。

app/Http/Controllers/Auth/LoginController.php控制器中,我们需要添加一个login方法,该方法用于处理登录请求:

public function login(Request $request)
{
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();

        return redirect()->intended('/');
    }

    return back()->withErrors([
        'email' => 'The provided credentials do not match our records.',
    ]);
}

这个方法首先会校验登录信息的合法性,然后使用attempt方法将用户信息进行认证。如果认证成功,将用户信息写入到会话中,实现用户的登录状态。如果认证失败,将会提示用户错误信息。但是,我们还没有实现attempt方法,现在我们来一起实现这个方法。

attempt方法用于对用户进行身份验证。我们需要在app/Providers/AuthServiceProvider.php文件中添加boot方法内容:

public function boot()
{
    $this->registerPolicies();

    Auth::viaRequest('api', function ($request) {
        return User::where('api_token', $request->input('api_token'))->first();
    });
}

这个方法将为Laravel提供一个新的用户身份验证驱动。在这里我们使用viaRequest方法自定义身份验证驱动,用于验证用户的登录信息是否正确。如果验证成功,将返回对应的用户信息,否则返回null

以上就是Laravel实现用户注册和登录的完整攻略。在以上的过程中,我们使用了Laravel自带的artian命令创建模型和迁移,创建了用户注册页面和用户登录页面,并通过相应的控制器处理用户的注册和登录信息请求。同时,还讲述了如何自定义身份验证驱动attempt方法,实现对用户身份的认证。

例如示例1:

用户“张三”在注册页面注册账号“zhangsan@126.com”,密码“123456”,提交注册请求后返回到登录页。用户打开登录页输入注册的账号和密码,提交请求,控制器处理后,发现账号和密码是正确的,控制器将用户信息写入到会话中,实现用户的登录状态。此时用户返回到首页,即可看到登陆成功的状态。

例如示例2:

用户“李四”在登录页面输入了一个错误的用户名“lisid@126.com”和密码“654321”,提交登录请求后,控制器无法验证该用户的登录信息,于是提示“用户名或密码错误”信息。此时用户重新输入正确的账号和密码,并提交请求,控制器处理成功后用户成功登录,可以进入到所需的页面。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Laravel实现用户注册和登录 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • css实现“加号”效果的实例代码

    我来为您讲解一下使用CSS实现“加号”效果的攻略。 一、通过动态伪类实现 HTML结构: <div class="box"> <div class="plus"></div> </div> CSS样式: .box { width: 50px; height: 50px; …

    css 2023年6月10日
    00
  • 一个JavaScript的求爱小特效

    现在我将详细讲解如何实现一个JavaScript的求爱小特效。 实现思路 我们可以利用HTML、CSS和JavaScript来实现这个小特效。具体实现过程如下: 首先,在HTML文件中添加两个input标签分别用于输入男方和女方的名字,以及一个button标签用于触发求爱动画; 然后,使用CSS样式来美化输入框和按钮的样式; 接着,使用JavaScript为…

    css 2023年6月11日
    00
  • CSS规范BEM CSS和OOCSS的示例代码详解

    CSS规范BEM CSS和OOCSS的示例代码详解 引言 在日常前端工作中,CSS规范的重要性不言自明。 CSS标准的定义和规范比较宽泛,因此前端工程师们经常会遇到样式混乱、代码重复、可维护性差,难以改造等问题。为了解决这些问题,我们需要编写遵循统一规范的CSS代码,其中BEM CSS和OOCSS是目前流行的两种规范方式。本篇文章主要讲解BEM CSS和OO…

    css 2023年6月10日
    00
  • HTML嵌入CSS样式(四种方法)

    HTML嵌入CSS样式的方法有以下四种: style标签嵌入CSS样式 在HTML文档的头部或body部分中通过style标签嵌入CSS样式。可以在style标签中添加任意数量的CSS样式规则。 代码示例: <!DOCTYPE html> <html> <head> <title>HTML嵌入CSS样式示例&l…

    Web开发基础 2023年3月15日
    00
  • 纯CSS制作各种各样的网页图标(三角形、暂停按钮、下载箭头、加号等)

    那我来为您详细讲解纯CSS制作各种各样的网页图标的完整攻略。 简介 CSS是一种强大的样式语言,可以用来为网站添加各种复杂和简单的效果,其中包括网页图标。使用CSS制作网页图标的好处是可以减少对图像的依赖,并且减少页面加载时间。这个过程中一般使用伪元素和CSS属性来控制样式。 纯CSS制作三角形 制作三角形可以用CSS的border属性,将三角形看做一个小数…

    css 2023年6月10日
    00
  • 通过margin:0px auto来实现一列固定宽度居中

    要实现一列固定宽度居中,可以采用CSS的margin属性和auto关键字。具体步骤如下: 设置固定宽度 首先,需要给该列设置一个固定的宽度,比如为500px(也可以根据实际需求设置其他宽度)。例如: .column { width: 500px; } 设置margin为0px auto 接着,需要将该列的margin属性设置为0px auto。其中,0px表…

    css 2023年6月10日
    00
  • Bootstrap图片轮播组件Carousel使用方法详解

    Bootstrap图片轮播组件Carousel使用方法详解 Bootstrap是一款目前非常流行的前端开发框架,其中的Carousel(图片轮播)组件可以用于网页展示轮播图或广告图等。接下来详细讲述如何使用Bootstrap中的Carousel组件,包含从起步到实现的完整攻略。 第一步:在HTML文件中引入Bootstrap 首先需要在HTML文件中引入Bo…

    css 2023年6月11日
    00
  • 基于Vue实现平滑过渡的拖拽排序功能

    下面是关于“基于Vue实现平滑过渡的拖拽排序功能”的完整攻略。 一、实现思路 本文介绍的是基于Vue实现拖拽排序功能,其主要思路包括以下几个步骤: 使用Vue.js框架搭建页面框架,引入相关依赖包; 定义一个数据源用于存储待排序的数据; 在页面中渲染数据源,并为每一个元素添加拖拽事件; 对于每一个元素,当其开始拖拽时,记录其位置数据,并设置可拖拽样式; 当元…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部