分享
三行代码  ›  专栏  ›  技术社区  ›  user12311699

使草稿文章仅对管理员可见

  •  -1
  • user12311699  · 技术社区  · 1 周前

    我试图使一篇草稿文章只对管理员可见。(当管理员访问文章页面时,即使没有发布,也应该显示文章)

    我试着创造一个中间产品:

     public function handle($request, Closure $next)
        {
            $post = Post::findBySlugOrFail($request->slug);
            if ($post->status == "draft") {
                abort(404);
            } elseif (auth()->check() && auth()->user()->hasAnyRole(['Administrator'])) {
    
                return $next($request);
            }
            return $next($request);
        }
    
    

    我有 status 我的专栏 posts 桌子。

    它总是显示 404 找不到。

    我做错了吗?

    知道怎么做吗?

    3 回复  |  直到 1 周前
        1
  •  1
  •   dennisgon    1 周前

    首先必须检查用户状态,如果用户状态是administrator,post状态是draft,那么必须返回到中间件的下一个请求

    public function handle($request, Closure $next)
        {
            $post = Post::findBySlugOrFail($request->slug);
            // first you must check if the user is administrator and the post status is draft
            if ($post->status == "draft"  && !auth()->user()->hasAnyRole(['Administrator'])) {
                abort(404);
            } elseif (auth()->check() && auth()->user()->hasAnyRole(['Administrator'])) {
    
                return $next($request);
            }
            return $next($request);
        }
    
        2
  •  1
  •   Alec Joy    1 周前

    如果帖子是草稿,那么If语句的第一部分总是正确的,这就是为什么它会100%地返回404。它永远也无法检查用户是否是管理员。试试这个吧

    public function handle($request, Closure $next)
    {
        $post = Post::findBySlugOrFail($request->slug);
        if ($post->status == "draft" && auth()->check() && !auth()->user()->hasAnyRole(['Administrator']))) {
            abort(404);
        }
        return $next($request);
    }
    

    这首先检查文章是否是草稿,如果不是草稿,则显示下一个请求。如果是,则检查用户是否已登录,以及他们是否不是管理员。如果是这样,则返回404。

        3
  •  1
  •   RiggsFolly Pascal Qyy    1 周前

    你只需要按正确的顺序做事

    public function handle($request, Closure $next)
    {
        $post = Post::findBySlugOrFail($request->slug);
        if ($post->status == "draft" &&
            auth()->check()          && 
            auth()->user()->hasAnyRole(['Administrator'])) 
        {
            return $next($request);
        } else {
            abort(404);
        }
    
    }