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);

    ...
}

Laravel 5.1 Docs - Authorization - Controller Authorization