Here is the rewritten article:
The Problem
In many Laravel projects, Blade templates handle menu visibility using conditionals:
While this approach works for simple applications, it becomes cluttered and unmanageable as the number of menus increases.
The Solution
A Menu Builder system encapsulates menu logic into reusable classes, improving:
- Maintainability: Centralised menu definitions.
- Scalability: Dynamically generating menus based on roles or permissions.
- Reusability: Sharing menus across views.
Step-by-Step Implementation
1. Define a Gate for viewAdmin
To control access to the administration menu, define a viewAdmin gate in your AuthServiceProvider:
use Illuminate\Support\Facades\Gate;
use App\Models\User;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
//...
Gate::define('viewAdmin', function (User $user) {
return $user->hasRole('admin'); // Replace with your app's role-checking logic
});
}
}
2. Create the Raw MenuItem Class
The MenuItem class defines all attributes of a menu item, such as label, URL, icon, and visibility:
namespace App\Actions\Builder;
use CleaniqueCoders\Traitify\Contracts\Builder;
use InvalidArgumentException;
class MenuItem implements Builder
{
//...
}
5. Define Routes
Add the following route configuration for the administration page:
use Illuminate\Support\Facades\Route;
Route::middleware(['auth:sanctum', 'verified', 'can:viewAdmin'])
->as('administration.')
->prefix('administration')
->group(function () {
Route::view('https://dev.to/', 'administration.index')->name('index');
});
6. Usage in Blade Templates
Navigation Menu (navigation-menu.blade.php):
<x-app-layout>
<x-slot name="header>{{ __('Administration') }}</x-slot>
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2">
@foreach (menu('administration') as $menu)
//...
@endforeach
</div>
</x-app-layout>
Conclusion
This Menu Builder system simplifies navigation management in Laravel by:
- Centralising menu definitions for better maintainability.
- Dynamically controlling menu visibility using roles or permissions.
- Reusing menu logic across views and layouts.
By adopting this approach, you can scale your navigation system seamlessly, even in complex applications.
FAQs
Q: How do I load my menu details from the database?
A: You can modify the MenuItem class to load menu details from the database using Eloquent or Query Builder.
Q: Can I reuse this Menu Builder system in other projects?
A: Yes, you can reuse this Menu Builder system in other Laravel projects with minimal modifications.
Q: How do I customize the menu layout?
A: You can customize the menu layout by modifying the Blade template and the MenuItem class.

