高尔基曾说过:我扑在书籍上,像饥饿的人扑在面包上一样。虽然我没有到达那个地步,但是我还是会向蜗牛一样向着阳光慢慢挪动,满怀希望!
最近通过学习laravel找到了一些学习方法,可以说是自己的正能量,就是每天晚上下班之后,回到宿舍(宿舍之所以称之为宿舍,因为它再好也不如家里好^_^),看看新知识。然后第二天去公司,敲一敲,练一练。艾老师(艾宾浩斯)说过,人过了八到九个小时之后,记忆的知识大概只有开始记忆的时候的35%,但是我觉得应该是50%,为什么这么说呢,因为我学的是新知识,之前没有了解过的,并带着100%的希冀在学习,所以记起来也会深刻一些。切记,每天晚上不要学习太多知识,不然脑子会瓦特掉的,我每天也就学习一个小时,看一下视频(因为本人不怎么喜欢看书,但是最近也在看关于Python的书籍,形式所逼啊!),然后将视频的中的知识截图发到QQ上,第二天在公司想不起来的时候看一下,效果还行,还有就是第二天想不起来的知识,我会在便签中记录,然后下午下班之前在看下(最近总想着开发管理自己知识短板的网站),这样自己也会很有成就感,对成就感,可以每天把学到的东西,写篇博客,坚持更博(不太容易),这样也会提升你对知识的渴望,俗话说得好,一个习惯的养成需要90天,我相信每天的努力,早晚有一天,你会变成你当初梦想的样子!废话说的有点多了,继续我今天的主题:laravel的登录注册重构!Fighting!
路由
//注册页面
Route::get('/register', '\App\Http\Controllers\RegisterController@index');
//注册行为
Route::post('/register', '\App\Http\Controllers\RegisterController@register');
//登录页面
Route::get('/login', '\App\Http\Controllers\LoginController@index');
//登录行为
Route::post('/login', '\App\Http\Controllers\LoginController@login');
//登出行为
Route::get('/logout', '\App\Http\Controllers\LoginController@logout');
使用 artisan
创建控制器
php artisan make:controller RegisterController //用户注册控制器
php artisan make:controller LoginController //用户登录控制器
渲染用户注册页面
class RegisterController extends Controller
{
public function index()
{
//渲染注册页面
return view('user.regist');
}
}
创建 user/regist.blade.php
模板(基于boostrap的注册页面,有需要的可以带走)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
<title>注册</title>
<!-- Bootstrap core CSS -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="http://v3.bootcss.com/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="http://v3.bootcss.com/examples/signin/signin.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<form class="form-signin" method="POST" action="/register">
{{ csrf_field() }}
<h2 class="form-signin-heading">请注册</h2>
<label for="name" class="sr-only">名字</label>
<input type="text" name="name" id="name" class="form-control" placeholder="名字" required autofocus>
<label for="inputEmail" class="sr-only">邮箱</label>
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱" required autofocus>
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="输入密码" required>
<label class="sr-only">重复密码</label>
<input type="password" name="password_confirmation" class="form-control" placeholder="重复输入密码" required>
<button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>
</form>
</div>
</body>
</html>
渲染用户登录页面
class LoginController extends Controller
{
public function index()
{
//渲染注册页面
return view('user.login');
}
}
创建 user/login.blade.php
模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../favicon.ico">
<title>登陆</title>
<!-- Bootstrap core CSS -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="http://v3.bootcss.com/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="http://v3.bootcss.com/examples/signin/signin.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<form class="form-signin" method="POST" action="/login">
{{ csrf_field() }}
@include('layout.errors')
<h2 class="form-signin-heading">请登录</h2>
<label for="inputEmail" class="sr-only">邮箱</label>
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>
<div class="checkbox">
<label>
<input type="checkbox" value="1" name="is_remember"> 记住我
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
<a href="/register" class="btn btn-lg btn-primary btn-block" type="submit">去注册>></a>
</form>
</div> <!-- /container -->
</body>
</html>
渲染效果图
注册页面
登录页面
下面开始我们的注册行为
路由地址虽然一样,但是提交方式不一样所以路由不冲突
在注册的控制器中定义注册的处理方法
public function register()
{
//验证
//逻辑
//渲染
}
表单提交三步骤
- 验证
- 逻辑
- 渲染
首先在表单中加上{{ csrf_field() }}
写注册表单验证逻辑
public function register()
{
//验证
$this->validate(\request(),[
//unique(验证user表中是否存在用户的名字)
'name' => 'required|min:3|max:10|unique:user,name',
//email属性就是验证是否符合email规则
'email' => 'required|unique:user,email|email',
//confirmed就是验证密码和确认密码保持一致
'password' => 'required|min:8|max:16|confirmed'
]);
//逻辑
$name = \request('name');
$email = \request('email');
$password = bcrypt(\request('password'));
//这里User(当然要在上面先引入)
User::create(compact(['name', 'email', 'password']));
//渲染(注册成功跳转至登录页面)
return view('user.login');
}
如果登录成功,跳转至登录页面,失败,则展示失败信息,所以我们还需要在表单中定义失败模板,因为不定义的话,页面不会展示错误信息,失败之后只会刷新当前页面,容易让人费解!
因为很多页面要用到,所以我们不如定义一个错误信息的模板 errors.blade.php
<div class="errors">
@if (count($errors) > 0)
<div class="box-body">
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i>错误:</h4>
@foreach($errors->all() as $error)
{{$error}}
@endforeach
</div>
</div>
@endif
</div>
然后在注册摸板中引用 @include('layout.errors')
<form class="form-signin" method="POST" action="/register">
{{ csrf_field() }}
<h2 class="form-signin-heading">请注册</h2>
<label for="name" class="sr-only">名字</label>
<input type="text" name="name" id="name" class="form-control" placeholder="名字" required autofocus>
<label for="inputEmail" class="sr-only">邮箱</label>
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="邮箱" required autofocus>
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="输入密码" required>
<label class="sr-only">重复密码</label>
<input type="password" name="password_confirmation" class="form-control" placeholder="重复输入密码" required>
@include('layout.errors')
<button class="btn btn-lg btn-primary btn-block" type="submit">注册</button>
</form>
这样一个注册功能就写好了!
用户登录
//登录页面
Route::get('/login', '\App\Http\Controllers\LoginController@index');
//登录行为
Route::post('/login', '\App\Http\Controllers\LoginController@login');
//登出行为
Route::get('/logout', '\App\Http\Controllers\LoginController@logout');
登录逻辑 登录成功跳转至文章列表,失败则返回刚才的页面
public function login()
{
//验证
$this->validate(request(),[
'email' => 'required|email',
'password' => 'required',
//是否记住密码
'is_remember' => 'integer'
]);
//逻辑
$user = \request(['email', 'password']);
$is_remember = \request('is_remember');
if (\Auth::attempt($user, $is_remember)) {
return redirect('/posts');
}
//渲染
return \Redirect::back->withErrors('邮箱或密码不正确');
}
登出行为
public function logout()
{
//退出登录,并跳转至登录页面
Auth::logout();
return view('user.login');
}