一步一步用laravel开发回风博客系统-03-登录和注册

原作者网站:http://laravelcoding.com/blog?tag=L5+Beauty
可以参考中文站点:http://laravelacademy.org/resources/blog

我是基于5.2的,而且有些东西我觉得有必要有的没必要,所以思路是跟着以上两个参考着搞,具体还是有区别的,我最终代码放在了Github:https://github.com/wedojava/hfblog.dev

由于正在补英语,所以有些我能看懂的就没从原作者那里翻译。

本节针对 laravel 5.2 完成一般网站应用都必不可少的登录和注册,当然,如果你不需要开启注册可以关闭注册,具体怎么关闭我没这需求,所以没了解,这里只将登录和注册。

laravel的各个版本在登录注册方面是有区别的:
4.2 自带登录注册
5.1 有登录注册,但是没有提供视图和路由,需要自己去添加设置,可以参考 laravel学院的文章
` 5.2` 一行命令实现登录注册。

1、数据库

修改根目录下的.env文件,修改数据库部分参数为:

DB_HOST=localhost
DB_DATABASE=hfblog_dev
DB_USERNAME=homestead
DB_PASSWORD=secret

执行迁移文件:
在laravel项目的根目录下运行:php artisan migrate

如没有特别说明,根目录运行命令指的是Homestead里的网站根目录,非本机的根目录,当然,如果你没有用虚拟机作为开发环境,那应该是在本机运行

2、一行命令

在laravel项目的根目录下运行:php artisan make:auth

命令执行成功:

vagrant@homestead:~/Code/hfblog.dev$ php artisan make:auth
Created View: /home/vagrant/Code/hfblog.dev/resources/views/auth/login.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/auth/register.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/auth/passwords/email.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/auth/passwords/reset.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/auth/emails/password.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/layouts/app.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/home.blade.php
Created View: /home/vagrant/Code/hfblog.dev/resources/views/welcome.blade.php
Installed HomeController.
Updated Routes File.
Authentication scaffolding generated successfully!

刷新下页面,不再是Laravel 5的欢迎页面了。注意到右上角有LoginRegister。去看看routes.php会发现自动添加了路由:

Route::group(['middleware' => 'web'], function () {
Route::auth();

Route::get('/home', 'HomeController@index');
});

注意:如果没有任何样式,说明你没翻墙,不能访问googleapi等地方。

3、命令行添加用户

php artisan tinker
$user = new App\User();
$user->name = 'admin'
$user->email = 'wedojava@gmail.com'
$user->password = bcrypt('123456');
$user->save();

4、分析

我们测试下登录和注册,发现登录后,页面还是显示老样子。已经登录了却还显示登录和注册的链接,但是如果访问的是 /home,就会显示登录的用户了。
这是为什么呢?
因为路由!
如果将默认路由——/路由包进web的middleware里,那么welcome页面就会显示当前登录用户了:

Route::group(['middleware' => ['web']], function () {
Route::get('/', function () {
return view('welcome');
});
});

更进一步,在 laravel 5.2里,cookie和error都被放到了web的中间件了。
看看app\Http\Kernel.php的这段代码:

protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];

protected $middlewareGroups = [

'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],

'api' => [
'throttle:60,1',
],
];

如果某路由没有中间件web那它所指向的页面就无法使用$errors,$cookies等,当然也就不能使用Auth::user()了。

注意到HomeController里的__constract()构造方法里的$this->middleware('auth');,它意味着要访问/home就必须处于登录状态,如果没有登录会自动跳转到登录页。这又是怎么实现的呢?请查阅app\Http\Middleware\Authenticate.php

5、修改跳转

如果查看 AuthController 类(app/Http/Controllers/Auth/AuthController)的 getLogout() 方法,你会发现并没有该方法,在其父类中也没有 getLogout() 方法,这是因为 AuthController 使用了 AuthenticatesAndRegistersUsers trait 和 AuthenticatesUsers trait,getLogout() 方法正是定义在了 AuthenticateUsers trait 中。

如果你在 vendor/laravel/framework/src 目录下找到 Illuminate/Foundation/Auth 目录,你会发现该目录下有一个 AuthenticatesUsers.php,在该文件中,可以看到 getLogout() 方法,并且该方法在退出完成后重定向到了根路径 /

这里有两种方法实现跳转的修改:

1.通过修改AuthController

打开AuthController(之前命令生成的),可以看到这段:

/**
* Where to redirect users after login / registration.
*
* @var string
*/
protected $redirectTo = '/';

修改$redirectTo的值,即可修改跳转的位置,我们这里修改为:

protected $redirectTo = '/home';

2.通过修改RedirectIfAuthenticated

打开 app/Http/Middleware/RedirectIfAuthenticated.php 文件,第38行代码如下:

return new RedirectResponse('/');

/修改为/home即可修改跳转的位置。


重新登录注册下看是否成跳转到/home

6、用户名登录

很多时候,我们也会需要通过用户名登录,我们可以在 AuthController 中设置 $username 属性来指定登录帐号,该属性默认值是 email,如果要用用户名登录,我们设置值如下:

protected $username = 'name';

然后我们修改登录视图 login.blade.php

<div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
<label class="col-md-4 control-label">E-Mail Address</label>

<div class="col-md-6">
<input type="email" class="form-control" name="email" value="{{ old('email') }}">

@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>

为:

<div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">
<label class="col-md-4 control-label">Username</label>

<div class="col-md-6">
<input type="name" class="form-control" name="name" value="{{ old('name') }}">

@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>

7、密码重置

视图和控制器都已经生成了,我们只需要修改邮件发送配置即可。Laravel使用SwiftMailer库提供的邮件API实现邮件操作,详情可查看Laravel学院的邮件文档Laravel官方邮件文档,这里我们仅作简单配置实现邮件发送,邮件配置文件是 config/mail.php

<?php

return [
'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'from' => ['address' => null, 'name' => null],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'sendmail' => '/usr/sbin/sendmail -bs',
'pretend' => false,
];

可见大部分配置在.env文件中设置,这里我的.env文件配置如下:

  • 163邮箱:

    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.163.com
    MAIL_PORT=25
    MAIL_USERNAME=youremail@163.com
    MAIL_PASSWORD=yourpassword
    MAIL_ENCRYPTION=null
  • Gmail邮箱:

    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.gmail.com
    MAIL_PORT=587
    MAIL_USERNAME=youremail@gmail.com
    MAIL_PASSWORD=yourpassword
    MAIL_ENCRYPTION=tls
  • QQ邮箱:

    MAIL_DRIVER=smtp
    MAIL_HOST=smtp.qq.com
    MAIL_PORT=465
    MAIL_USERNAME=youremail@qq.com
    MAIL_PASSWORD=yourpassword
    MAIL_ENCRYPTION=ssl

账户信息填写到 MAIL_USERNAMEMAIL_PASSWORD
此外我们还要配置mail.php中的from配置如下:
'from' => ['address' => 'youremail@163.com ', 'name' => '回风博客'],
这里只需要将 address.env 文件中的 MAIL_USERNAME 值相匹配即可。至于 name 值就是邮箱中发件人名称,可自定义。

做好这一步配置后,接下来即可测试密码重置了,退出当前登录用户->登录->点击忘记密码。

我是边开发边做的,没有出现任何问题。

本节到这里,下节实现内容添加和展现。