Laravel 5: Change navbar if user is logged
Solution 1
If you are using Laravel 5's built in User model you can simply do
@if (Auth::check())
//show logged in navbar
@else
//show logged out navbar
@endif
Solution 2
For laravel 5.7 and above, use @auth and @guest directives.Here is the official documentation here
@auth
// The user is authenticated...
@endauth
@guest
// The user is not authenticated...
@endguest
You may specify the authentication guard that should be checked when using the @auth
and @guest
directives:
@auth('admin')
// The user is authenticated...
@endauth
@guest('admin')
// The user is not authenticated...
@endguest
Otherwise, you can use the @unless directive:
@unless (Auth::check())
You are not signed in.
@endunless
Solution 3
New versions of Laravel (5.6 at time of writing) support these two directives in Blade:
@auth
// The user is authenticated...
@endauth
@guest
// The user is not authenticated...
@endguest
See official documentation here: https://laravel.com/docs/5.6/blade
Solution 4
You can also use Auth::guest()
The Auth::guest()
method returns true or false.
Example -
@if (Auth::guest())
<a href="{{ route('login') }}">Login</a>
<a href="{{ route('register') }}">Register</a>
@else
{{ Auth::user()->name }}
<a href="{{ route('logout') }}">Logout</a>
@endif
Solution 5
This should help :
@extends(Auth::check() ? 'partials.navbarlogged' : 'partials.navbar')
The Auth::check()
sees whether the user is logged in or not and returns a boolean.
bockzior
Updated on July 09, 2022Comments
-
bockzior almost 2 years
I'm completely new to Laravel, MVC and templating engines in general.
I need to show certain navbar buttons and options if a user is logged in such as: Notifications, Logout, Profile, etc... and a Login button otherwise.
Any help on how I could address this the right way is greatly appreciated. This is what I'm considering at the moment:
- A
User
object is always passed to the view. - The view checks if the
User
is set (meaning it's logged in) to include the appropriate partial blade template for the navbar.
app.blade.php:
... @if (isset($user)) @include('partials.navbarlogged') @else @include('partials.navbar') ...
Is this the best method? Thanks for your time!
- A
-
bockzior about 9 yearsI'm not using the default Auth mechanisms, so that won't work, will need to find a way to get it to work with my custom OpenID authentication. But it looks like I'm in the good direction in terms of templating. Thanks for your time!
-
Jacob about 9 yearsI would avoid passing the entire User object around, so maybe a small auth helper is in order? Create your own helper file so you can do all of the messy code in there, so in the template you could do something like
Auth::check()
-
bockzior about 9 yearsWhat would be the recommended location for that new class? In fact the entire User object isn't needed. Would it be reasonable to store the needed fields from it in the Session (name, image_url, email, ...) and read from the Session directly in the view? Thanks once again.
-
Jacob about 9 yearsStoring specific values in the session is preferable to storing the entire object, but preferably you would not need to pass the User object or any values of it unless you need to specifically access them. Create an auth facade to handle authentication. The documentation instructs on how to create a facade: laravel.com/docs/5.0/facades