Laravel——Web开发实战之路(七)
@[Laraval|后端|框架]
前言
之前已经写好的注册页面,添加了控制器,也加了样式,但是还是没法注册,那是因为每加store方法,这次我们来给前面的东西扫扫尾
用户数据验证
我们还需要在用户控制器中添加一个用于处理表单数据提交后的 store 方法,用于处理用户创建的相关逻辑
app/Http/Controllers/UsersController.php
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:50',
'email' => 'required|email|unique:users|max:255',
'password' => 'required|confirmed|min:6'
]);
return;
}
验证数据:
- name:必需,最长50
- email:必需,符合email格式,唯一,最长255
- password:必需,要验证,最短6
这个时候注册是这样的
表单提交异常
也就是说,这个时候,注册页面还是没法正常工作
原因:使用 POST 方法提交表单时,Laravel 为了安全考虑,会让我们提供一个 token(令牌)来防止我们的应用受到 CSRF(跨站请求伪造)的攻击
解决办法:添加csrf_field放法
{{ csrf_field() }}
这时,就可将注册页面改为
@extends('layouts.default')
@section('title', '注册')
@section('content')
<div class="col-md-offset-2 col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<h5>注册</h5>
</div>
<div class="panel-body">
<form method="POST" action="{{ route('users.store') }}">
{{ csrf_field() }}
<div class="form-group">
<label for="name">名称:</label>
<input type="text" name="name" class="form-control" value="{{ old('name') }}">
</div>
<div class="form-group">
<label for="email">邮箱:</label>
<input type="text" name="email" class="form-control" value="{{ old('email') }}">
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" name="password" class="form-control" value="{{ old('password') }}">
</div>
<div class="form-group">
<label for="password_confirmation">确认密码:</label>
<input type="password" name="password_confirmation" class="form-control" value="{{ old('password_confirmation') }}">
</div>
<button type="submit" class="btn btn-primary">注册</button>
</form>
</div>
</div>
</div>
@stop
遗憾的是,由于缺失必要的错误提示和注册成功提示,依旧没法使用表单
注册失败提示
在resources/views/shared/_errors.blade.php
加上提交失败提示
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
简单的说,就是当出现error时,把每一个error列举出来
Blade 支持所有的循环语句和条件判断语句,如 @if, @elseif, @else, @for, @foreach, @while 等等,应用在 Blade 中的表达式都需要以 @ 开头。
接下来,就在resources/views/users/create.blade.php
中加入这个子视图就好啦
@extends('layouts.default')
@section('title', '注册')
@section('content')
<div class="col-md-offset-2 col-md-8">
<div class="panel panel-default">
<div class="panel-heading">
<h5>注册</h5>
</div>
<div class="panel-body">
@include('shared._errors')
<form method="POST" action="{{ route('users.store') }}">
{{ csrf_field() }}
<div class="form-group">
<label for="name">名称:</label>
<input type="text" name="name" class="form-control" value="{{ old('name') }}">
</div>
<div class="form-group">
<label for="email">邮箱:</label>
<input type="text" name="email" class="form-control" value="{{ old('email') }}">
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" name="password" class="form-control" value="{{ old('password') }}">
</div>
<div class="form-group">
<label for="password_confirmation">确认密码:</label>
<input type="password" name="password_confirmation" class="form-control" value="{{ old('password_confirmation') }}">
</div>
<button type="submit" class="btn btn-primary">注册</button>
</form>
</div>
</div>
</div>
@stop
此时提交结果依旧和之前一样,因为还差一个成功后的重定向(书上说已经可以看到结果,然并卵)
注册成功
用户注册完成后,需要做的事有
- 将用户提交的信息存储到数据库,并重定向到其个人页面;
- 在网页顶部位置显示注册成功的提示信息;
一、保存用户,重定向到个人主页
app/Http/Controllers/UsersController.php
加入
<?php
namespace App\Http\Controllers;
.
.
.
class UsersController extends Controller
{
.
.
.
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|max:50',
'email' => 'required|email|unique:users|max:255',
'password' => 'required|confirmed|min:6'
]);
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
return redirect()->route('users.show', [$user]);
}
}
创建一个新用户,并且使用路由定向到它的个人主页
二、消息提示
在return前加上
session()->flash('success', '欢迎,您将在这里开启一段新的旅程~');
使用 session() 方法来访问会话实例。而当我们想存入一条缓存的数据,让它只在下一次的请求内有效时,则可以使用 flash 方法。flash 方法接收两个参数,第一个为会话的键,第二个为会话的值,我们可以通过下面这行代码的为会话赋值。
然后,像添加错误提示一样加上_messages.blade.php就好
@foreach (['danger', 'warning', 'success', 'info'] as $msg) @if(session()->has($msg)) <div class="flash-message"> <p class="alert alert-{{ $msg }}"> {{ session()->get($msg) }} </p> </div> @endif @endforeach
并且在blade视图内include进去
<!DOCTYPE html>
<html>
<head>
<title>@yield('title', 'Sample App') - Laravel 入门教程</title>
<link rel="stylesheet" href="/css/app.css">
</head>
<body>
@include('layouts._header')
<div class="container">
<div class="col-md-offset-1 col-md-10">
@include('shared._messages')
@yield('content')
@include('layouts._footer')
</div>
</div>
</body>
</html>
最后
现在,我们就可以进行注册了