Laravel видимость страницы из базы данных - PullRequest
0 голосов
/ 26 марта 2020

Мне было интересно, может ли кто-нибудь рассказать о том, как сделать sh видимость страницы в моем приложении? В базе данных я храню visiblity, который либо "public", либо "private"

Так что, если страница является закрытой, пользователю необходимо войти в систему, чтобы увидеть страницу, но если страница Это опубликовано c, то любой может просмотреть страницу. Ниже приведены фрагменты моего маршрута и контроллера.

маршрутов / веб. 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);
}

В настоящее время маршрут не использует промежуточное ПО. Моей первой мыслью было назначить ему промежуточное программное обеспечение, которое будет запрашивать базу данных при попадании на этот маршрут (для принудительной аутентификации, если она была закрытой), но я не хотел запрашивать базу данных дважды. Есть ли способ передать результаты этого промежуточного программного обеспечения контроллеру, или у кого-нибудь есть другие предложения о том, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

Я бы использовал область локальных запросов 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 Если вам нужно. Но не забудьте сохранить это просто.

0 голосов
/ 26 марта 2020

Не уверен, что это правильный способ сделать это, но я запрашиваю страницу в промежуточном программном обеспечении.

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...