Date:

Building Dynamic and Maintainable Menus in Laravel

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:

  1. Maintainability: Centralised menu definitions.
  2. Scalability: Dynamically generating menus based on roles or permissions.
  3. 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:

  1. Centralising menu definitions for better maintainability.
  2. Dynamically controlling menu visibility using roles or permissions.
  3. 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.

Latest stories

Read More

LEAVE A REPLY

Please enter your comment!
Please enter your name here