Installation
composer require cvepdb-cms/module-navigations
Publish the package configuration and migrations:
php artisan vendor:publish --provider="Cvepdb\Navigations\NavigationsServiceProvider" --tag="config"
php artisan vendor:publish --provider="Cvepdb\Navigations\NavigationsServiceProvider" --tag="migrations"
php artisan migrate
Basic Usage
Register the navigation service provider in config/app.php under providers:
Cvepdb\Navigations\NavigationsServiceProvider::class,
First Navigation
Define a navigation in a service provider (e.g., AppServiceProvider):
use Cvepdb\Navigations\Facades\Navigation;
public function boot()
{
Navigation::register('main', function () {
return [
'Home' => route('home'),
'About' => route('about'),
'Contact' => route('contact'),
];
});
}
Displaying Navigation
Use the @navigation Blade directive in your layout file:
@navigation('main')
Workflow:
Navigation::register('admin', function () {
return User::find(auth()->id())->getAdminNavigationItems();
});
Use Case: Show/hide navigation items based on user roles or other conditions.
Navigation::register('user', function () {
$items = [
'Dashboard' => route('dashboard'),
'Profile' => route('profile'),
];
if (auth()->user()->isAdmin()) {
$items['Admin Panel'] = route('admin.dashboard');
}
return $items;
});
Structure:
Navigation::register('sidebar', function () {
return [
'Products' => [
'All Products' => route('products.index'),
'Categories' => route('products.categories'),
],
'Orders' => route('orders.index'),
];
});
Customization:
Extend the @navigation directive to modify output:
Blade::directive('navigation', function ($expression) {
return "<?php echo $nav = \\Cvepdb\\Navigations\\Facades\\Navigation::get($expression); ?>
<ul class=\"custom-nav\">@foreach($nav as $key => $item)
@if(is_array($item))
<li><a href=\"{{ $key }}\">{{ $item['title'] ?? $key }}</a>
<ul>@include('partials.subnav', ['items' => $item['items']])</ul>
</li>
@else
<li><a href=\"{{ $item }}\">{{ $key }}</a></li>
@endif
@endforeach</ul>";
});
Use Case: Expose navigation via API for SPAs or mobile apps.
Route::get('/api/navigation/{name}', function ($name) {
return response()->json(Navigation::get($name));
});
Registration Timing
AppServiceProvider@boot may not be available during middleware execution. Use AppServiceProvider@register or a dedicated provider for early registration.Caching Issues
php artisan view:clear
Overwriting Navigations
Check Registered Navigations
Dump all registered navigations in tinker:
php artisan tinker
>>> \Cvepdb\Navigations\Facades\Navigation::all()
Verify Blade Output
Use @dd(Navigation::get('main')) to inspect the raw navigation data before rendering.
config/navigations.php:
'driver' => 'redis',
'redis' => [
'connection' => 'cache',
],
Custom Navigation Items
Extend the Cvepdb\Navigations\Contracts\NavigationItem interface to add metadata:
class ExtendedNavigationItem implements NavigationItem
{
public function getTitle(): string;
public function getUrl(): string;
public function isActive(): bool;
public function getIcon(): ?string;
}
Middleware Integration Dynamically register navigations based on middleware:
Navigation::registerIf(
'admin-nav',
function () { return [...] },
function ($request) {
return $request->user()?->isAdmin();
}
);
Localization Support Add localization to navigation items:
Navigation::register('main', function () {
return [
__('Home') => route('home'),
__('About Us') => route('about'),
];
});
How can I help you explore Laravel packages today?