慕容的工作随笔

慕容的工作随笔

记录学习和工作

【原创】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>

      &lt;div class=&quot;mb-3&quot;&gt;
        &lt;label for=&quot;email&quot;&gt;邮箱:&lt;/label&gt;
        &lt;input type=&quot;text&quot; name=&quot;email&quot; class=&quot;form-control&quot; value=&quot;{{ old(&#039;email&#039;) }}&quot;&gt;
      &lt;/div&gt;

      &lt;div class=&quot;mb-3&quot;&gt;
        &lt;label for=&quot;password&quot;&gt;密码:&lt;/label&gt;
        &lt;input type=&quot;password&quot; name=&quot;password&quot; class=&quot;form-control&quot; value=&quot;{{ old(&#039;password&#039;) }}&quot;&gt;
      &lt;/div&gt;

      &lt;div class=&quot;mb-3&quot;&gt;
        &lt;label for=&quot;password_confirmation&quot;&gt;确认密码:&lt;/label&gt;
        &lt;input type=&quot;password&quot; name=&quot;password_confirmation&quot; class=&quot;form-control&quot; value=&quot;{{ old(&#039;password_confirmation&#039;) }}&quot;&gt;
      &lt;/div&gt;

      &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;注册&lt;/button&gt;
  &lt;/form&gt;
&lt;/div&gt;

</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 [

&#039;attributes&#039; =&gt; [
    &#039;name&#039; =&gt; &#039;名称&#039;,
    &#039;email&#039; =&gt; &#039;邮箱&#039;,
    &#039;password&#039; =&gt; &#039;密码&#039;,
],

];

如需要对属性或者验证消息改写,直接在 lang/zh_CN/validation.php 中添加需要定制的部分即可,

重定向

redirect()->route('users.show', [$user]);

这里是一个『约定优于配置』的体现,此处 $user 是 User 模型对象的实例。route() 方法会自动获取 Model 的主键,也就是数据表 users 的主键 id,以上代码等同于:

redirect()->route('users.show', [$user->id]);

评论 (0)

还没有评论,来做第一个吧。

发表评论

提交后需管理员审核通过后显示