删除微博

生成授权策略

我们需要使用授权策略来对用户进行授权删除的操作,只有当被删除的微博作者为当前用户,授权才能通过。运行下面命令生成微博授权策略。

$ php artisan make:policy StatusPolicy

修改授权策略文件

我们需要在该授权策略中引入用户模型和微博模型,并添加 destroy 方法定义微博删除动作相关的授权。如果当前用户的 id 与要删除的微博作者 id 相同时,验证才能通过。

app/Policies/StatusPolicy.php

id === $status->user_id;
    }
}

修改 AuthServiceProvider

我们还需要在 AuthServiceProvider 中对授权策略进行配置才能正常使用。

app/Providers/AuthServiceProvider.php

 'App\Policies\ModelPolicy',
        \App\Models\User::class  => \App\Policies\UserPolicy::class,
        \App\Models\Status::class  => \App\Policies\StatusPolicy::class,
    ];

    /**
     * Register any application authentication / authorization services.
     *
     * @param  \Illuminate\Contracts\Auth\Access\Gate  $gate
     * @return void
     */
    public function boot(GateContract $gate)
    {
        $this->registerPolicies($gate);

        //
    }
}

添加删除按钮

需要把删除按钮加到渲染单条微博的局部视图上。并且删除按钮必须是微博的作者本人才能看到,我们可以很方便的利用 Laravel 授权策略提供的 @can Blade 命令,在 Blade 模板中做授权判断。

resources/views/statuses/_status.blade.php

  • {{ $user->name }} {{ $user->name }} {{ $status->created_at->diffForHumans() }} {{ $status->content }} @can('destroy', $status)
    {{ csrf_field() }} {{ method_field('DELETE') }}
    @endcan
  • 定义微博动态控制器的 destroy 动作来处理微博的删除。

    app/Http/Controllers/StatusesController.php

    middleware('auth');
        }
    
        public function store(Request $request)
        {
            $this->validate($request, [
                'content' => 'required|max:140'
            ]);
    
            Auth::user()->statuses()->create([
                'content' => $request->content
            ]);
            return redirect()->back();
        }
    
        public function destroy(Status $status)
        {
            $this->authorize('destroy', $status);
            $status->delete();
            session()->flash('success', '微博已被成功删除!');
            return redirect()->back();
        }
    }
    

    你可能感兴趣的:(删除微博)