When building dynamic web applications with Laravel, you often need to show or hide sections of a page based on whether a user is logged in or not. The most common way developers handle this in Blade templates is by checking:
@if (auth()->check())
// content for logged-in users
@endif
This works great — but Laravel offers even cleaner and shorter ways to do the same thing. In this blog post, we’ll explore:
- How
auth()->check()works - Shorter alternatives for checking authentication
- Useful directives like
@authand@guest - Real-world examples
- Best practices to keep your Blade views clean and readable
🧠 Understanding auth()->check()
Let’s start with the basics.
What is auth()->check()?
auth()->check() is a Laravel helper that returns true if the user is authenticated, and false if not.
It’s equivalent to:
Auth::check()
So when you write this in Blade:
@if (auth()->check())
Welcome back, {{ auth()->user()->name }}!
@endif
You’re telling Laravel: “If a user is logged in, show them this content.”
But while this works, it can become repetitive and verbose — especially in larger templates.
⚡ The Problem: Too Much Boilerplate in Blade
Let’s say you want to show one section for logged-in users and another for guests:
@if (auth()->check())
<p>Welcome back, {{ auth()->user()->name }}</p>
@else
<p>Welcome, guest! Please <a href="/login">log in</a>.</p>
@endif
This works but feels bulky.
Wouldn’t it be great if Laravel gave us shorter and cleaner alternatives?
Good news: it does.
✨ Solution: Use @auth and @guest Blade Directives
Laravel includes two built-in Blade directives for handling authentication checks:
✅ @auth
This directive checks if the user is logged in:
@auth
<p>Hi, {{ auth()->user()->name }}!</p>
@endauth
✅ @guest
This directive checks if the user is not logged in:
@guest
<p>Hello, guest! <a href="/login">Log in</a></p>
@endguest
🔁 Refactor: Old vs New Style
Here’s a quick comparison:
🔴 Old Way:
@if (auth()->check())
Welcome back!
@endif
🟢 Cleaner Way:
@auth
Welcome back!
@endauth
🔴 Old Way for Guests:
@if (!auth()->check())
Welcome, guest!
@endif
🟢 Cleaner Way:
@guest
Welcome, guest!
@endguest
You get the same functionality with less code and better readability.
🧪 Real-World Examples
✅ Example 1: Navigation Menu Based on Auth
<nav>
<ul>
@auth
<li><a href="/dashboard">Dashboard</a></li>
<li><a href="/logout">Logout</a></li>
@endauth
@guest
<li><a href="/login">Login</a></li>
<li><a href="/register">Register</a></li>
@endguest
</ul>
</nav>
✅ Example 2: Personalizing Welcome Message
<div class="welcome-box">
@auth
<h2>Welcome back, {{ auth()->user()->name }}!</h2>
@endauth
@guest
<h2>Welcome! Please log in to continue.</h2>
@endguest
</div>
🧰 Bonus: Check Specific Guards
If your app uses multiple authentication guards (e.g., admin, user), both @auth and @guest accept a guard parameter.
Example:
@auth('admin')
<p>Welcome Admin!</p>
@endauth
@guest('admin')
<p>Admins must log in <a href="/admin/login">here</a>.</p>
@endguest
This is super useful in multi-auth systems where different users have separate login flows.
🚀 Extra Tip: Combining with auth()->user()
While @auth confirms the user is logged in, you can still use auth()->user() inside it:
@auth
<p>Logged in as {{ auth()->user()->email }}</p>
@endauth
This is perfectly valid and efficient — since the directive already confirms authentication, you can safely use auth()->user() inside.
📋 Recap of Blade Auth Directives
| Directive | Description | Equivalent To |
|---|---|---|
@auth | Checks if a user is logged in | @if (auth()->check()) |
@guest | Checks if no user is logged in | @if (!auth()->check()) |
@auth('admin') | Checks admin guard | @if (auth()->guard('admin')->check()) |
@guest('admin') | Checks if not logged into admin | @if (!auth()->guard('admin')->check()) |
📈 Benefits of Using @auth and @guest
- ✅ Cleaner syntax — no need for verbose
auth()->check()calls - ✅ Easier to read — self-explanatory logic
- ✅ Safer — ensures only authenticated users can access sensitive content
- ✅ Guard-friendly — works with multi-auth systems
💥 Common Mistakes to Avoid
❌ Using auth()->user() without checking
<p>{{ auth()->user()->name }}</p> <!-- This will break if not logged in -->
✅ Fix:
@auth
<p>{{ auth()->user()->name }}</p>
@endauth
❌ Forgetting to close the directive
@auth
Welcome back!
<!-- missing @endauth -->
✅ Always close with @endauth or @endguest.
🧱 Advanced Use: Roles and Permissions
Sometimes, you may want to go beyond just checking if the user is logged in. For example, showing content based on user roles:
@auth
@if (auth()->user()->hasRole('admin'))
<p>Welcome, admin!</p>
@endif
@endauth
If you use a package like Spatie Laravel Permission, this gets even easier:
@role('admin')
<p>This is admin-only content.</p>
@endrole
🧾 Summary
Laravel gives you powerful tools for managing authentication in views. Instead of writing this everywhere:
@if (auth()->check())
...
@endif
You can use Laravel’s expressive Blade directives:
@auth
...
@endauth
@guest
...
@endguest
These make your templates:
- ✅ Easier to read
- ✅ Cleaner to maintain
- ✅ Consistent with Laravel’s elegant philosophy
✅ Final Tips for Clean Blade Templates
- Use
@authand@guestinstead ofauth()->check()and!auth()->check() - Use guard parameters for multi-auth apps
- Use
auth()->user()safely within@authblocks - For more complex logic, push it into ViewModels or Components
- Use roles and permissions libraries if needed
🔚 Conclusion
Shorter syntax doesn’t just look better — it makes your codebase easier to maintain. Laravel’s @auth and @guest directives are perfect examples of how Blade encourages clean, readable, and secure template development.
So next time you reach for auth()->check() in a Blade file, remember: there’s a cleaner way.
Happy coding! ⚡

Leave a Reply