Laravel技巧库

基本权限控制

此课程是收费课程,请先购买或加入会员后再访问。

咱们之前已经把登录注册功能做的很完美了,但是这里的issues和用户还一点关系都没有,这是不正确的。应该是每一个活动都是属于某一个用户发布的。
关于权限控制,其实在一些大型项目中,是比较复杂的内容,我们这一小节没法详细描述。这种复杂的权限控制,我后面再单独出一篇课程来讲好了。

这一集我们要做的功能只是最基础的权限控制,实现这一点还是非常简单的。

登录才能发布issue

发布新活动,应该必须用户登陆以后才能发布信息。那么先到IssuesControllercreate方法中,添加一个判断

//...
use Auth;

class IssuesController extends Controller
{
    //...

public function create()
    {
        if (!Auth::check()) {
            return redirect('/')->with('alert', '没有执行此操作的权限,请先登录');
        }

        return view('issues.create');
    }
}

这里的Auth::check()是laravel手册中提供的方法,作用就是判断当前用户是否登录了。如果没有登录,就发送一个flash信息,提示要先登录。

migration

接着要做的是,建立issuesusers表之间的关联关系,那么需要在issues表中,添加一个user_id字段。

php artisan make:migration add_user_id_to_issues_table --table=issues
class AddUserIdToIssuesTable extends Migration
{
    public function up()
    {
        Schema::table('issues', function (Blueprint $table) {
            $table->integer('user_id');
        });
    }

    public function down()
    {
        Schema::table('issues', function (Blueprint $table) {
            $table->dropColumn('user_id');
        });
    }
}
php artisan migrate

打开数据库一下看,确实user_id已经有了,但是以前存在的数据,都被填上了0,而我们数据库中,根本就没有哪个用户的id是等于0的。所以我就人工的,都给他们填上对应的user_id

model

现在就要来建立 issueuser的关联关系了。

User.php

// 一个user 有很多 issues。
public function issues()
{
    return $this->hasMany('App\Models\Issue');
}

Issue.php

白名单中加上user_id

protected $fillable = ['title', 'content', 'user_id'];

//...

// 每一个issue,都属于一个user
public function user()
{
    return $this->belongsTo('App\User');
}

view

views/issues目录中,找到 createedit两个页面。
分别在他们的form标签中,加上

<input type="hidden" name="user_id" value="{{Auth::id()}}">

审查一看,确定表单中已经确实有了当前登录用户的user_id了。重新提交一下,刷新数据库,看到user_id确实已经添加进来了。

存在的问题

还有一点小问题是,现在发布的issue,头像和名字,都还是我本人的。

先到user.php中,添加一段头像的代码。如果数据库中有了用户的头像,那就直接使用它。如果没有,那就调用gravatar网络上的用户头像。

/**
 * 用户头像
 * @return mixed|string
 */
public function avatar()
{
    return $this->avatar ? $this->avatar : "https://www.gravatar.com/avatar/" . md5(strtolower($this->email)) . "?d=retro&s=48";
}

_issue_list.blade.php

<a href="{{route('issues.show', $issue->id)}}">
    <img src="{{$issue->user->avatar()}}" alt=""/>
</a>

<!-- ... -->

<span class="meta-data">{{$issue->user->name}}</span>

show.blade.php

<img src="{{$issue->user->avatar()}}" alt="" class="am-comment-avatar" width="100" height="100">

<!-- ... -->

<span class="am-comment-author">{{$issue->user->name}}</span>

只有作者本人可以修改删除 issue

show.blade.php

@if (Auth::check() && Auth::user() == $issue->user )
    <a href="{{route('issues.destroy', $issue->id)}}" data-method="delete" data-token="{{csrf_token()}}" data-confirm="Are you sure?" type="button" class="am-btn am-btn-danger am-radius am-btn-sm">Destroy</a>
    <a href="{{route('issues.edit', $issue->id)}}" type="button" class="am-btn am-btn-primary am-radius am-btn-sm">Edit</a>
@endif

登录才能发表评论

评论功能我们放在后面的课程再完善,现在只做一点点修改,就是要登录后才能发表评论。

@if (Auth::check()) 
    <form class="am-form" method="post" action="{{route('comments.store')}}">
        <!-- ... -->
    </form>
@else
    <p>
        <a href="{{route('login')}}" class="am-btn am-btn-secondary am-btn-block">
            <span class="am-icon-user"></span> 登录后发评论
        </a>
    </p>
@endif

回到最开始的话题,这只是一个权限控制的开始而已,实际还有不少不足的地方的。我们这里就不往细了说了。如果你对这方面有兴趣,可以关注我后续的专门讲解权限管理的课程。


现在就注册ITFun.tv会员
持续关注IT界最新技术,随时更新相关课程。在线学习IT课程或直接报名参加线下武汉PHP、Web前端培训。

仅仅30秒钟就可以简单注册

会员注册(免费)
×