Installation:
composer require lavary/laravel-menu
Publish the config file:
php artisan vendor:publish --provider="Lavary\Menu\MenuServiceProvider"
Run migrations:
php artisan migrate
First Menu Creation:
Use the Menu facade to create a menu:
use Lavary\Menu\Menu;
Menu::make('main', function($menu) {
$menu->add('Home', ['url' => '/']);
$menu->add('About', ['url' => '/about']);
});
Display in Blade:
{!! Menu::get('main') !!}
Create a footer menu dynamically based on user roles:
Menu::make('footer', function($menu) {
$menu->add('Contact', ['url' => '/contact']);
if (auth()->check()) {
$menu->add('Dashboard', ['url' => '/dashboard']);
}
});
Static Menus:
Define menus in a service provider's boot() method:
public function boot()
{
Menu::make('main', function($menu) {
$menu->add('Products', ['url' => '/products']);
$menu->add('Services', ['url' => '/services']);
});
}
Dynamic Menus: Use closures to conditionally build menus:
Menu::make('user', function($menu) {
if (auth()->user()->isAdmin()) {
$menu->add('Admin Panel', ['url' => '/admin']);
}
$menu->add('Profile', ['url' => '/profile']);
});
Reusable Menu Components: Extract menu logic into a dedicated class:
class NavigationBuilder
{
public static function buildMainMenu()
{
Menu::make('main', function($menu) {
$menu->add('Home', ['url' => '/']);
$menu->add('Blog', ['url' => '/blog']);
});
}
}
Blade Directives: Create a custom Blade directive for cleaner syntax:
Blade::directive('menu', function($expression) {
return "<?php echo Lavary\Menu\Menu::get($expression); ?>";
});
Usage:
@menu('main')
Middleware Integration: Dynamically adjust menus based on middleware:
public function handle($request, Closure $next)
{
Menu::make('main', function($menu) {
$menu->add('Secure Area', ['url' => '/secure']);
});
return $next($request);
}
Caching: Cache menus for performance:
Menu::make('main', function($menu) {
// Menu logic
})->cacheFor(60); // Cache for 60 minutes
Localization: Use localization helpers to generate multi-language menus:
Menu::make('main', function($menu) {
$menu->add(__('Home'), ['url' => '/']);
$menu->add(__('About'), ['url' => '/about']);
});
Menu Not Updating:
php artisan menu:clear or disable caching temporarily:
Menu::make('main', function($menu) { /* ... */ })->cacheFor(0);
Duplicate Menu Items:
Menu::get('menu_name') to check if a menu exists before recreating it.Active Item Logic:
Menu::get('main')->active to debug active item logic or manually set active items:
$menu->add('Home', ['url' => '/', 'active' => request()->is('/')]);
Nested Menu Performance:
Dump Menu Structure:
dd(Menu::get('main')->toArray());
Check Menu Existence:
if (Menu::has('main')) {
// Menu exists
}
Inspect Active Item:
$activeItem = Menu::get('main')->active;
dd($activeItem);
Default Cache Driver:
The package uses Laravel's cache driver by default. Ensure your .env has a valid cache driver (e.g., file, redis).
Menu Storage:
Menus are stored in the menus table. Customize the table name in config/menu.php:
'table' => 'custom_menu_items',
Item ID Generation: By default, IDs are auto-generated. To manually set IDs:
$menu->add('Home', ['url' => '/', 'id' => 'home']);
Custom Menu Builders:
Extend the Lavary\Menu\Builder class to add custom methods:
class CustomMenuBuilder extends \Lavary\Menu\Builder
{
public function addCustomItem($title, $options)
{
// Custom logic
}
}
Register the builder in AppServiceProvider:
Menu::extend('custom', function() {
return new CustomMenuBuilder();
});
Custom Renderers: Override the default renderer for custom HTML output:
Menu::make('main', function($menu) {
// Menu logic
})->renderUsing(function($menu) {
return '<ul class="custom-menu">' . $menu->render() . '</ul>';
});
Event Listeners: Listen to menu events for logging or analytics:
Menu::get('main')->on('beforeRender', function($menu) {
// Log menu rendering
});
Database Extensions:
Add custom fields to menu items by extending the MenuItem model:
class CustomMenuItem extends \Lavary\Menu\Models\MenuItem
{
protected $casts = [
'custom_field' => 'boolean',
];
}
Update the config to use your custom model:
'model' => \App\Models\CustomMenuItem::class,
How can I help you explore Laravel packages today?