laravel 5.1 中的 ACL,删除用户页面中显示的每个 post 上的 post 能力
ACL in laravel 5.1 , delete post abilities on each post shown in user page
我有一个用户页面,我在其中显示该用户的所有 post。
其他用户或多或少可以像 instagram 一样访问此页面。
现在的重点是,我想在该页面的每个 post 中显示一个可供 posted 而非其他用户使用的选项列表。
我检查了文档,所有示例都在显示一个 post (my.project/post/1) 的页面上,比方说,很明显这是通过 get 方法接收的,并且在视图中你可以添加 @can
方法并在控制器中定义 gate
将 post 吐出到该页面。
但是,如果我像这样将所有 post 发送到页面会怎样:
public function index()
{
$user = Auth::user();
$posts_with_comments = Post::with(['comments.author',
'user' => function ($q) {
$q->select('id', 'username');
},
'some_stuff'])->where('user_id', $user->id)->get()->reverse();
return view('user.page')->with('posts',$posts_with_comments);
}
我注册了这样的政策:
class PostPolicy
{
/**
* @param User $user
* @param Post $post
* @return bool
*/
public function deletePost(User $user, Post $post)
{
return $user->id === $post->user_id;
}
在 AuthServiceProvider 中
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
\App\Post::class => \App\Policies\PostPolicy::class
];
/**
* Register any application authentication / authorization services.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
public function boot(GateContract $gate)
{
parent::registerPolicies($gate);
}
}
那么我如何管理控制器中的 gate
东西来实现我的目标?
您无需在控制器中执行任何有关显示这些内容的操作。您可以在视图中执行此操作。 (您也可以通过其他方式解决这个问题)
@foreach ($posts as $post)
...
@can('deletePost', $post)
... only if the user is authorized ...
@endcan
@endforeach
对于控制器中的操作,您可以根据需要使用 authorize
方法。
public function delete($id)
{
$post = Post::findOrFail($id);
$this->authorize('deletePost', $post);
...
}
我有一个用户页面,我在其中显示该用户的所有 post。
其他用户或多或少可以像 instagram 一样访问此页面。
现在的重点是,我想在该页面的每个 post 中显示一个可供 posted 而非其他用户使用的选项列表。
我检查了文档,所有示例都在显示一个 post (my.project/post/1) 的页面上,比方说,很明显这是通过 get 方法接收的,并且在视图中你可以添加 @can
方法并在控制器中定义 gate
将 post 吐出到该页面。
但是,如果我像这样将所有 post 发送到页面会怎样:
public function index()
{
$user = Auth::user();
$posts_with_comments = Post::with(['comments.author',
'user' => function ($q) {
$q->select('id', 'username');
},
'some_stuff'])->where('user_id', $user->id)->get()->reverse();
return view('user.page')->with('posts',$posts_with_comments);
}
我注册了这样的政策:
class PostPolicy
{
/**
* @param User $user
* @param Post $post
* @return bool
*/
public function deletePost(User $user, Post $post)
{
return $user->id === $post->user_id;
}
在 AuthServiceProvider 中
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
\App\Post::class => \App\Policies\PostPolicy::class
];
/**
* Register any application authentication / authorization services.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
public function boot(GateContract $gate)
{
parent::registerPolicies($gate);
}
}
那么我如何管理控制器中的 gate
东西来实现我的目标?
您无需在控制器中执行任何有关显示这些内容的操作。您可以在视图中执行此操作。 (您也可以通过其他方式解决这个问题)
@foreach ($posts as $post)
...
@can('deletePost', $post)
... only if the user is authorized ...
@endcan
@endforeach
对于控制器中的操作,您可以根据需要使用 authorize
方法。
public function delete($id)
{
$post = Post::findOrFail($id);
$this->authorize('deletePost', $post);
...
}