咱们之前已经把登录注册功能做的很完美了,但是这里的issues
和用户还一点关系都没有,这是不正确的。应该是每一个活动都是属于某一个用户发布的。
关于权限控制,其实在一些大型项目中,是比较复杂的内容,我们这一小节没法详细描述。这种复杂的权限控制,我后面再单独出一篇课程来讲好了。
这一集我们要做的功能只是最基础的权限控制,实现这一点还是非常简单的。
登录才能发布 issue
发布新活动,应该必须用户登陆以后才能发布信息。那么先到IssuesController
的create
方法中,添加一个判断
//...
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
接着要做的是,建立issues
与users
表之间的关联关系,那么需要在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
现在就要来建立 issue
与user
的关联关系了。
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
目录中,找到 create
和edit
两个页面。
分别在他们的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
回到最开始的话题,这只是一个权限控制的开始而已,实际还有不少不足的地方的。我们这里就不往细了说了。如果你对这方面有兴趣,可以关注我后续的专门讲解权限管理的课程。