Laravel 来自数据库解决方案的页面可见性

Laravel page visibility from database solution

我想知道是否有人可以提供有关如何在我的应用程序中实现页面可见性的任何智慧?在我存储的数据库中 visiblity"public""private"

因此,如果页面是私有的,则用户需要登录才能查看该页面,但如果页面是 public,则任何人都可以查看该页面。以下是我的路线和控制器的片段。

routes/web.php

Route::get('/{slug}', '\App\Http\Controllers\Frontend\FrontendPagesController@page');

FrontendPagesController 中的页面方法

public function page($slug){
    $page = Page::where('slug',$slug)->where('active',1)->get()->first();
    if(is_null($page)){
        return abort(404);
    }
    $this->data['page'] = $page;
    return view('pages.page',$this->data);
}

该路由当前未使用任何中间件。我的第一个想法是给它分配一个中间件,当它到达这条路线时会查询数据库(如果它是私有的则强制进行身份验证),但我不想查询数据库两次。有没有办法将这个中间件的结果传递给控制器​​,或者有人对如何完成这个问题有任何其他建议吗?

不确定这样做是否正确,但我在中间件中查询了页面。

public function handle($request, Closure $next)
{
    $page = Page::where('slug',$request->segment(1))->where('active',1)->get()->first();
    if(is_null($page)){
        return abort(404);
    }
    if($page->visibility === 'private' && !Auth::check()){
        return redirect()->guest(route('login'));
    }
    $request->attributes->add(['page_model' => $page]);
    return $next($request);
}

由于我将页面添加到请求中,所以我不必多次查询数据库。所以现在在我的控制器中我可以执行以下操作。

$request->get('page_model');

我会使用 laravel 的本地查询范围。

在页面模型中

public function scopeActive($query)
{
    return $query->where('active', 1);
}

在你的控制器中

public function page($slug){
    $page = Page::active()->where('slug',$slug)->first();

    if( ! $page) {
         // redirect to login page.
    }

    // serve page content.
}

如果需要,您也可以使用 ACL。 但记得保持简单。