用户注册
头像
使用 Gravatar
对用户提供个人头像支持。Gravatar 为“全球通用头像”,在 Gravatar 上传了头像之后,可通过 Gravatar 登录邮箱进行 MD5 转码,并与 Gravatar 的 URL 进行拼接来获取到自己的头像。
在 User 模型中定义一个 方法,用来生成用户头像。
public function gravatar($size = '100')
{
$hash = md5(strtolower(trim($this->attributes['email'])));
return "https://cdn.v2ex.com/gravatar/$hash?s=$size";
}
}
Gravatar 的官方链接是 http://www.gravatar.com/avatar/ 然而国内访问并不是很顺畅,这里我们是用 V2EX 社区提供的 https://cdn.v2ex.com/gravatar/ CDN 镜像。
以上方法主要做了以下几个操作:
- 为 gravatar 方法传递的参数 size 指定了默认值 100;
- 通过 $this->attributes['email'] 获取到用户的邮箱;
- 使用 trim 方法剔除邮箱的前后空白内容;
- 用 strtolower 方法将邮箱转换为小写;
- 将小写的邮箱使用 md5 方法进行转码;
- 将转码后的邮箱与链接、尺寸拼接成完整的 URL 并返回;
定义好 gravatar 方法之后,可以在视图中进行调用,例如:使用默认尺寸来获取头像:
$user->gravatar();
为 gravatar 指定尺寸大小来获取头像:
$user->gravatar('140');
展示用户基本信息:
<a href="{{ route('users.show', $user->id) }}">
<img src="{{ $user->gravatar('140') }}" alt="{{ $user->name }}" class="gravatar"/>
</a>
<h1>{{ $user->name }}</h1>
表单构建
@extends('layouts.default')
@section('title', '注册')
@section('content')
<div class="offset-md-2 col-md-8">
<div class="card ">
<div class="card-header">
<h5>注册</h5>
</div>
<div class="card-body">
<form method="POST" action="{{ route('users.store') }}">
<div class="mb-3">
<label for="name">名称:</label>
<input type="text" name="name" class="form-control" value="{{ old('name') }}">
</div>
<div class="mb-3">
<label for="email">邮箱:</label>
<input type="text" name="email" class="form-control" value="{{ old('email') }}">
</div>
<div class="mb-3">
<label for="password">密码:</label>
<input type="password" name="password" class="form-control" value="{{ old('password') }}">
</div>
<div class="mb-3">
<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
Laravel 提供了全局辅助函数 old 在 Blade 模板中显示旧输入数据。这样当用户信息填写错误,页面进行重定向访问时,输入框将自动填写上最后一次输入过的数据。
{{ old('name') }}
用户数据验证
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required|unique:users|max:50',
'email' => 'required|email|unique:users|max:255',
'password' => 'required|confirmed|min:6'
]);
return;
}
required
验证空;unique
验证唯一值;max
和mix
: 验证最大长度与最小长度;email
进行邮箱格式验证;confirm
密码匹配验证;
如果需要同时验证多个条件时,则可使用 | 对验证规则进行分割。
CSRF
Laravel 为了安全考虑,会让我们提供一个 token(令牌)来防止我们的应用受到 CSRF(跨站请求伪造)的攻击。只需要在表单元素中添加 Blade 模板为我们提供的 csrf_field 方法即可。调用如下:
{{ csrf_field() }}
上面这段代码转换为 HTML 如下:
<input type="hidden" name="_token" value="fhcxqT67dNowMoWsAHGGPJOAWJn8x5R5ctSwZrAq">
错误信息显示
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@if @endif 解析之后为:
if (count($errors) > 0) {
{{ count($errors) }}
}
添加语言包
Laravel 为消息验证的多语言提供了一种非常简便的方法进行支持。我们可以通过添加一个如 lang/zh_CN/validation.php 语言包,并在语言包的 custom 数组中对翻译语言进行设定。如:
'custom' => [
'email' => [
'required' => '邮箱地址不能为空!',
],
],
使用 Composer 来安装 laravel-lang:
composer require overtrue/laravel-lang:~6.0
config/app.php
<?php
return [
.
.
.
'locale' => 'zh_CN',
.
.
.
];
『字段』名称可以通过创建语言文件来解决:
lang/zh_CN/validation.php
<?php
return [
'attributes' => [
'name' => '名称',
'email' => '邮箱',
'password' => '密码',
],
];
如需要对属性或者验证消息改写,直接在 lang/zh_CN/validation.php 中添加需要定制的部分即可,
重定向
redirect()->route('users.show', [$user]);
这里是一个『约定优于配置』的体现,此处 $user 是 User 模型对象的实例。route() 方法会自动获取 Model 的主键,也就是数据表 users 的主键 id,以上代码等同于:
redirect()->route('users.show', [$user->id]);