【问题标题】:Laravel page visibility from database solution来自数据库解决方案的 Laravel 页面可见性
【发布时间】:2020-07-06 15:52:55
【问题描述】:

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

因此,如果该页面是私有的,则用户需要登录才能查看该页面,但如果该页面是公开的,则任何人都可以查看该页面。下面是我的路由和控制器的 sn-ps。

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

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

【问题讨论】:

    标签: laravel routes middleware


    【解决方案1】:

    不确定这是否是正确的方法,但我在中间件中查询页面。

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

    【讨论】:

      【解决方案2】:

      我会使用 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。 但请记住保持简单。

      【讨论】:

      • 知道页面是否为active 与问题无关。此外,由于我没有重用活动查询,我不明白为什么范围会有所帮助
      猜你喜欢
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多