资讯专栏INFORMATION COLUMN

Laravel 5.4 入门系列 9. 注册与登录,用户关联

smallStone / 3621人阅读

摘要:本节将实现文章评论与用户关联的功能。关系定义首先修改与表,增加字段增加全部回滚并重新执行迁移添加用户表与文章表评论表的一对多关系添加文章评论表与用户表的多对一关系同时,评论表的字段增加。同时,我们还自定义了返回的错误信息。

本节将实现文章、评论与用户关联的功能。

关系定义

首先修改 postscomments 表,增加 user_id 字段

/database/migrations/2017_04_12_124622_create_posts_table.php
/database/migrations/2017_04_15_062905_create_comments_table.php
public function up()
{
    Schema::create("posts", function (Blueprint $table) {
         
           // 增加
        $table->integer("user_id")->unsigned();
     
        $table->foreign("user_id")
              ->references("id")
              ->on("users")
              ->onDelete("cascade");
    });
}

全部回滚并重新执行迁移:

$ php artisan migrate:refresh

添加用户表与文章表、评论表的一对多关系:

/app/User.php
public function posts()
{
    return $this->hasMany(AppPost::class);
}

public function comments()
{
    return $this->hasMany(AppComment::class);
}

添加文章、评论表与用户表的多对一关系:

/app/Comment.php
/app/Post.php
public function user()
{
    return $this->belongsTo(AppUser::class);
}

同时,评论表的 $fillable 字段增加 user_id

注册

首先,定义处理注册相关业务的控制器:

$ php artisan make:controller RegistrationController

定义路由响应注册请求:

Route::get("/register","RegistrationController@create");

定义方法,返回注册页面视图:

public function create()
{
    return view("registration.create");
}

创建注册页面:

/resources/views/registration/create.blade.php
@extends("layouts.master")

@section("content")
    
    
{{ csrf_field() }}
我们不会与别人分享您的邮箱
@endsection

定义路由响应注册提交:

Route::post("/register","RegistrationController@store");

定义方法处理注册提交:

/app/Http/Controllers/RegistrationController.php
use AppUser;
public function store()
{    
    $this->validate(request(),[
        "name" => "required",
        "email" => "required|email",
        "password" => "required|confirmed",
    ]);

    $user = User::create(request(["name","password","email"]));

    auth()->login($user);

    return redirect()->home();
}

该方法包括了四部分:

验证字段,其中 password 使用了 confirmed 验证规则,会自动去匹配 xxxxxx_confirmation 是否一致,因此之前的视图要按照规范命名好。

创建用户

登录该用户

返回名字为「home」的路由

其中,我们需要为路由命名,以匹配第四步:

Route::get("/posts","PostsController@index")->name("home");

虽然完成了注册功能,但是我们保存密码使用的明文,我们可以定义一个修改器,让每次保存密码时都自动加密:

/app/User.php
public function setPasswordAttribute($password)
{
    $this->attributes["password"] = bcrypt($password);
}
登录

创建控制器,处理用户登录业务:

$ php artisan make:controller SessionsController

用户访问 /login 时,路由分发该请求:

Route::get("/login","SessionsController@create");

create 方法返回用户登录页面视图:

/resources/views/sessions/create.blade.php
@extends("layouts.master")

@section("content")
    
    
{{ csrf_field() }}
@endsection

用户点击登录后,路由分发该请求:

Route::post("/login","SessionsController@store");

最后是控制器对登录行为进行处理:

/app/Http/Controllers/SessionsController.php
public function store()
{    

    if (!auth()->attempt(request(["email", "password"]))) {
        return back()->withErrors([
            "messages" => "请确保邮箱和密码正确!"
        ]);
    }

    return redirect()->home();
} 

我们使用了 Auth 类提供的 attempt() 进行验证,只需要传入 emailpassword 即可,attempt 方法会对密码经过加密后与数据库进行比较,若匹配则
开启一个通过认证的 session 给用户。同时,我们还自定义了返回的错误信息。

登出

登出的实现比较简单,首先是路由:

Route::get("/logout","SessionsController@destroy");

控制器:

public function destroy()
{
    auth()->logout();

    return redirect()->home();
}

最后,我们优化下导航让,令其根据用户登录信息来显示不同的设置项:



注意,如果要让下拉框生效,需要引入相关的 js


权限控制

实现了登录与登出功能,就可以对用户行为进行权限控制了。

首先是文章的权限控制,对于「未登录」的用户,只可以阅读文章,因此可以直接使用 Laravel 提供的中间件来实现:

/app/Http/Controllers/PostsController.php
public function __construct()
{
    $this->middleware("auth")->except(["index","show"]);
}

意思是只有授权的用户才能够访问其他请求,除了 indexshow 外。

然后是用户的权限控制:

/app/Http/Controllers/SessionsController.php
public function __construct()
{
    $this->middleware("guest")->except(["destroy"]);
}

意思是只有游客才能访问其他请求,除了 destroy

完善文章与评论的创建

最后,完善文章与评论的创建功能,绑定用户 id。首先是文章的创建:

/app/Http/Controllers/PostsController.php
public function store(Request $request)
{
    $this->validate(request(), [
        "title" => "required|unique:posts|max:255",
        "body" => "required|min:5",
    ]);

    $post = new Post(request(["title", "body"]));

    auth()->user()->publishPost($post);

    return redirect("posts");
}

创建文章直接使用关系模型:

/app/User.php
public function publishPost(Post $post)
{
    $this->posts()->save($post);
}

然后是评论的创建:

public function store(Post $post)
{    
    $this->validate(request(),[
        "body" => "required|min:5"
        ]);

    $post->addComment(new Comment([
        "user_id" => auth()->user()->id,
        "body"       => request("body"),

        ]));
    return back();
}

同样使用关系模型:

/app/Post.php
public function addComment(Comment $comment)
{    
    $this->comments()->save($comment);
}

最后,是一些视图的更新:

文章列表中,绑定作者:

/resources/views/posts/index.blade.php
 

具体文章与评论显示时,也绑定作者:

/resources/views/posts/show.blade.php

{{ $post->title }}

{{$post->body}}

@foreach ($post->comments as $comment)
{{$comment->created_at->diffForHumans() }}

{{ $comment->body }}

by {{$comment->user->name }}


@endforeach

Eloquent: 修改器 | Laravel 5.4 中文文档

Laravel 的用户认证系统 | Laravel 5.4 中文文档

Navs · Bootstrap

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22766.html

相关文章

  • Laravel 5.4 入门系列 11. 通过邮件激活注册用户

    摘要:我们稍微封装下代码吧请您激活账户方法用于保存或更新字段方法用于判断是否在小时之内使用管理邮件在刚才的例子中,我们使用的是提供的方法来快速创建和发送邮件。 使用 Mailtrap 测试邮件功能 Mailtrap 提供了简单的测试邮件的服务,步骤如下: 登录网站 Mailtrap 注册用户 注册成功之后,会自动创建一个 demo,点进去之后就可以看到配置信息 showImg(https...

    dendoink 评论0 收藏0
  • Laravel 5.4 入门系列 6. 文章的创建

    摘要:基本功能创建文章的第一步是用户发请求,然后返回创建文章的页面。实际上,会报错添加保护虽然我们完成了基本功能,但是提交请求的时候还是会报错,其实这是防止攻击。假如违反了规则,错误信息会自动被保存在闪存的中,即只对下一次请求生效。 基本功能 创建文章的第一步是用户发请求,然后返回创建文章的页面。 路由:处理用户「创建文章」的请求 /routes/web.php Route::get(/po...

    levius 评论0 收藏0
  • Laravel 5.4 入门系列 12. 使用请求类进行字段验证

    摘要:本节内容比较简单,之前我们使用方法来进行字段验证,这样做有一个不好的地方就是,如果你要在很多地方使用同样的验证,就需要重复编写代码。因此,提供另外一种方式来进行字段验证,即请求类。 本节内容比较简单,之前我们使用 validator 方法来进行字段验证,这样做有一个不好的地方就是,如果你要在很多地方使用同样的验证,就需要重复编写代码。因此,Laravel 提供另外一种方式来进行字段验证...

    BearyChat 评论0 收藏0
  • Laravel 5.4 入门系列 10.文章归档

    摘要:将上述的一系列查询进行封装模型到了这一步,我们基本上实现了文章归档的功能。但是有一个问题,文章归档实际上包括在通用视图中,这就意味着,网站的所有请求都需要返回,否则就会报错。数据库之数据库请求构建器中文文档的视图功能中文文档 首先,要实现的是按照日期来统计文章,原始的 SQL 如下: select year(created_at) year, monthname(c...

    Nekron 评论0 收藏0
  • Laravel 5.4 入门系列 8. 文章评论

    摘要:编辑迁移文件我们为表格添加了外键,同时生定义了约束,该约束允许删除父表文章的时候,自动删除关联的子表评论。关联中文文档的辅助函数列表中文文档 本节将学习 Eloquent Relations,表与表之间存在着多种关系,举例如下: 一对一:文章与作者 一对多:文章与评论 多对多:标签与文章 文章与评论的一对多关系 一对多关系,主要理解两点: 如何实现一对多关系 实现了之后能给开发带...

    IntMain 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<