Listening to the Words

laravel学习之注册与登录

用户认证脚手架

这是一个非常实用的脚手架功能,只需一键就生成了整个注册登录过程的后端处理逻辑代码

php artisan make:auth

《laravel学习之注册与登录》

web.php文件中会生成路由代码:

Auth::routes();

此处是 Laravel 的用户认证路由,以上等同于:

// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

是不是很强大,开发效率一下子提高了一个级别?!

blade模板

@guest
    <li><a href="{{ route('login') }}">登录</a></li>
    <li><a href="{{ route('register') }}">注册</a></li>
@else
    .
    .
    .
@endguest

如果是未登录用户的话,就显示注册和登录按钮,如果是已登录用户的话,即显示用户菜单。

资源路由

Route::resource('users', 'UsersController', ['only' => ['show', 'update', 'edit']]);

以上的代码等用于

Route::get('/users/{user}', 'UsersController@show')->name('users.show');
Route::get('/users/{user}/edit', 'UsersController@edit')->name('users.edit');
Route::patch('/users/{user}', 'UsersController@update')->name('users.update');

可以看到使用resource方法不仅节省很多代码,且严格遵循了RESTful URI的规范,生成的资源路由列表信息如下所示:

HTTP 请求 URI 动作 作用
GET /users/{user} UsersController@show 显示用户个人信息页面
GET /users/{user}/edit UsersController@edit 显示编辑个人资料页面
PATCH /users/{user} UsersController@update 处理 edit 页面提交的更

隐形路由绑定

Laravel 会自动解析定义在路由或控制器行为中与类型提示的变量名匹配的路由段名称的 Eloquent 模型。

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

在这个例子中,由于 $user 变量被类型提示为 Eloquent 模型 App\User,变量名称又与 URI 中的 {user} 匹配,因此,Laravel 会自动注入与请求 URI 中传入的 ID 匹配的用户模型实例。如果在数据库中找不到对应的模型实例,将会自动生成 404 异常。

数据表迁移

我们进行的是字段添加操作,因此在命名迁移文件时需要加上前缀,遵照如 add_column_to_table 这样的命名规范,并在生成迁移文件的命令中设置 --table 选项,用于指定对应的数据库表。最终的生成命令如下:

php artisan make:migration add_avatar_and_introduction_to_users_table --table=users

表单请求 UserRequest

laravel中对AOP编程思想的具体使用范例

表单请求验证(FormRequest) 是 Laravel 框架提供的用户表单数据验证方案,此方案相比手工调用 validator 来说,能处理更为复杂的验证逻辑,更加适用于大型程序。在本课程中,我们将统一使用 表单请求验证来处理表单验证逻辑。

 php artisan make:request UserRequest

中文显示友好时间戳

在 Laravel 中,时间戳 created_at 和 updated_at 作为模型属性被调用时,都会自动转换为 Carbon 对象,下图我们使用 Laravel 自带的 dd() 辅助函数验证一下:

《laravel学习之注册与登录》

打印出来的结果:

《laravel学习之注册与登录》

Carbon 是 PHP 知名的 DateTime 操作扩展,Laravel 将其默认集成到了框架中。diffForHumans 是 Carbon 对象提供的方法,默认情况是英文的,如果要使用中文时间提示,则需要对 Carbon 进行本地化设置。对 Carbon 进行本地化的设置很简单,只在 AppServiceProvider 中调用 Carbon 的 setLocale 方法即可实现

Intervention/image 图片剪裁扩展包

图片太大会拖慢页面的加载速度,所以接下来我们将对此进行优化。

composer require intervention/image

权限控制

Laravel 中间件 (Middleware) 为我们提供了一种非常棒的过滤机制来过滤进入应用的 HTTP 请求,例如,当我们使用 Auth 中间件来验证用户的身份时,如果用户未通过身份验证,则 Auth 中间件会把用户重定向到登录页面。如果用户通过了身份验证,则 Auth 中间件会通过此请求并接着往下执行。Laravel 框架默认为我们内置了一些中间件,例如身份验证、CSRF 保护等。所有的中间件文件都被放在项目的 app/Http/Middleware 文件夹中
接下来让我们使用 Laravel 提供身份验证(Auth)中间件来过滤未登录用户的 edit, update 动作
app/Http/Controllers/UsersController.php

<?php
.
.
.
class UsersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth', ['except' => ['show']]);
    }
.
.
.
}

用户只能编辑自己的资料

在完成对未登录用户的限制之后,接下来我们要限制的是已登录用户的操作。当 id 为 2 的用户去尝试更新 id 为 1 的用户信息时,我们应该返回一个 403 禁止访问的异常。在 Laravel 中可以使用 授权策略 (Policy) 来对用户的操作权限进行验证,在用户未经授权进行操作时将返回 403 禁止访问的异常。
我们可以使用以下命令来生成一个名为 UserPolicy 的授权策略类文件,用于管理用户模型的授权。

php artisan make:policy UserPolicy

https://laravel-china.org/courses/laravel-intermediate-training-5.5/644/access-control


  • 用户注册登录功能的开发;
  • 学会查看 Whoops 报错和定位问题;
  • 添加注册验证码;
  • 数据库视图工具查看 Homestead 中的数据库;
  • 资源路由和资源控制器;
  • 隐性路由模型绑定;
  • 使用 Chrome 开发者工具查看网络请求;
  • 使用表单请求类来验证用户数据(FormRequest);
  • 验证错误消息中文化;
  • Carbon 友好时间输出中文化;
  • 用户图片上传;
  • 图片分辨率验证;
  • 图片裁剪;
  • 使用授权策略来做用户访问控制。
点赞