使草稿帖子仅对管理员可见

时间:2019-12-02 18:24:24

标签: php laravel

我正在尝试使草稿帖子仅对管理员可见。(当管理员访问帖子页面时,即使该帖子未发布,它也应显示该帖子)

我试图创建一个中间件:

 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 个答案:

答案 0 :(得分:1)

如果帖子是草稿,则if语句的第一部分始终为true,这就是为什么它在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。

答案 1 :(得分:1)

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

stplanr::line2points(iow_highways)
#> Simple feature collection with 2814 features and 1 field
#> geometry type:  POINT
#> dimension:      XY
#> bbox:           xmin: 430780.7 ymin: 75702.05 xmax: 464851.7 ymax: 96103.72
#> epsg (SRID):    27700
#> proj4string:    +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs
#> First 10 features:
#>    id                  geometry
#> 1   1 POINT (464851.7 87789.73)
#> 2   1 POINT (464435.4 88250.85)
#> 3   2 POINT (464390.9 87412.27)
#> 4   2 POINT (464851.7 87789.73)
#> 5   3 POINT (462574.6 88987.62)
#> 6   3 POINT (462334.6 88709.92)
#> 7   4 POINT (464066.9 87576.84)
#> 8   4 POINT (464390.9 87412.27)
#> 9   5   POINT (464420 88227.79)
#> 10  5 POINT (464398.7 88225.33)  

答案 2 :(得分:1)

您必须做的第一件事是检查用户状态,如果用户状态为管理员,发布状态为草稿,那么您必须返回中间件的下一个请求

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