【原创】Laravel用户注册

用户注册

头像

使用 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 镜像。

以上方法主要做了以下几个操作:

  1. 为 gravatar 方法传递的参数 size 指定了默认值 100;
  2. 通过 $this->attributes['email'] 获取到用户的邮箱;
  3. 使用 trim 方法剔除邮箱的前后空白内容;
  4. 用 strtolower 方法将邮箱转换为小写;
  5. 将小写的邮箱使用 md5 方法进行转码;
  6. 将转码后的邮箱与链接、尺寸拼接成完整的 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 验证唯一值;
  • maxmix : 验证最大长度与最小长度;
  • 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]);
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注