datlechin/filament-menu-builder
Composer 安装命令:
composer require datlechin/filament-menu-builder
包简介
Create and manage menus and menu items
README 文档
README
A Filament plugin for building menus with drag-and-drop ordering, nesting, custom links, and dynamic panels.
Requirements
- PHP 8.3+
- Filament 5.0+
- Laravel 12+
Upgrading
From v0.7.x (Filament v3) to v1.x (Filament v5)
- Update your
composer.json:
composer require datlechin/filament-menu-builder:^1.0
- Publish and run the new migration to add the
panel,icon, andclassescolumns:
php artisan vendor:publish --tag="filament-menu-builder-migrations"
php artisan migrate
The upgrade migration checks for existing columns before adding them, so it's safe on fresh installs too.
- Re-publish the config file if you published it previously:
php artisan vendor:publish --tag="filament-menu-builder-config" --force
Installation
Install via Composer:
composer require datlechin/filament-menu-builder
Publish and run the migrations:
php artisan vendor:publish --tag="filament-menu-builder-migrations"
php artisan migrate
Optionally, publish the config file:
php artisan vendor:publish --tag="filament-menu-builder-config"
Or use the install command:
php artisan filament-menu-builder:install
You will need to set up a Filament custom theme
If you don't yet have a custom theme, run the following command:
php artisan make:filament-theme
Next, open up the theme.css file for the custom theme and add the following line:
@import "../../../../vendor/datlechin/filament-menu-builder/resources/css/index.css"; @source "../../../../vendor/datlechin/filament-menu-builder/resources/**/*.blade.php";
Usage
Register the plugin in your panel provider:
use Datlechin\FilamentMenuBuilder\FilamentMenuBuilderPlugin; public function panel(Panel $panel): Panel { return $panel ->plugins([ FilamentMenuBuilderPlugin::make(), ]); }
Locations
Locations define where menus appear in your application:
FilamentMenuBuilderPlugin::make() ->addLocations([ 'header' => 'Header', 'footer' => 'Footer', ])
Menu Panels
Panels provide item sources for menus, either from Eloquent models or static lists.
Model Panel
Implement MenuPanelable on your model:
use Datlechin\FilamentMenuBuilder\Contracts\MenuPanelable; class Page extends Model implements MenuPanelable { public function getMenuPanelTitle(): string { return $this->title; } public function getMenuPanelUrl(): string { return route('pages.show', $this); } public function getMenuPanelName(): string { return 'Pages'; } }
Then register it:
use Datlechin\FilamentMenuBuilder\MenuPanel\ModelMenuPanel; FilamentMenuBuilderPlugin::make() ->addMenuPanels([ ModelMenuPanel::make() ->model(Page::class), ])
Static Panel
use Datlechin\FilamentMenuBuilder\MenuPanel\StaticMenuPanel; FilamentMenuBuilderPlugin::make() ->addMenuPanels([ StaticMenuPanel::make() ->name('pages') ->add('Home', '/') ->add('About', '/about') ->add('Contact', '/contact'), ])
add() also accepts target, icon, and classes:
StaticMenuPanel::make() ->name('social') ->add('GitHub', 'https://github.com', target: '_blank', icon: 'heroicon-o-code-bracket') ->add('Twitter', 'https://twitter.com', target: '_blank', classes: 'text-blue-500')
Custom Link & Custom Text Panels
The custom link panel is shown by default. The custom text panel (for non-link items like headings) is opt-in:
FilamentMenuBuilderPlugin::make() ->showCustomLinkPanel(true) ->showCustomTextPanel(true)
Custom Fields
Add extra fields to the menu or menu item forms:
use Filament\Forms\Components\TextInput; FilamentMenuBuilderPlugin::make() ->addMenuFields([ TextInput::make('description'), ]) ->addMenuItemFields([ TextInput::make('badge'), ])
Singular methods work too:
FilamentMenuBuilderPlugin::make() ->addMenuField(TextInput::make('description')) ->addMenuItemField(TextInput::make('badge'))
Multiple calls are merged, so fields registered from different service providers won't overwrite each other.
Customizing Navigation
FilamentMenuBuilderPlugin::make() ->navigationLabel('Menus') ->navigationGroup('Content') ->navigationIcon('heroicon-o-bars-3') ->navigationSort(3) ->navigationCountBadge(true)
Indent / Unindent
Nesting via indent/unindent actions is enabled by default:
FilamentMenuBuilderPlugin::make() ->enableIndentActions(true)
Translatable Menus
Built-in multilingual support with no extra packages required. Translatable fields are stored as JSON with locale tabs in the form UI.
Setup
- Enable translatable with your locales:
FilamentMenuBuilderPlugin::make() ->translatable(['en', 'nl', 'vi'])
- Publish and run the migration to convert columns from
stringtojson:
php artisan vendor:publish --tag="filament-menu-builder-translatable-migrations"
php artisan migrate
Existing string data is wrapped in the default locale (en). Edit $defaultLocale in the published migration to change this.
Configuring Translatable Fields
Only MenuItem.title is translatable by default:
FilamentMenuBuilderPlugin::make() ->translatable(['en', 'nl', 'vi']) ->translatableMenuItemFields(['title']) // default ->translatableMenuFields(['name']) // opt-in: make Menu name translatable too
Rendering Translated Titles
Use resolveLocale() in Blade to display titles in the current locale:
@foreach($menu->menuItems as $item) <a href="{{ $item->url }}"> {{ $item->resolveLocale($item->title) }} </a> @endforeach
resolveLocale() returns the translation for app()->getLocale(), falls back to the first available translation, or returns the raw string for non-translatable setups.
Spatie Translatable Compatibility
The JSON format is compatible with Spatie Laravel Translatable. If you add HasTranslations to a custom model, the plugin detects it and defers to Spatie's mutators.
use Spatie\Translatable\HasTranslations; class CustomMenuItem extends MenuItem { use HasTranslations; public array $translatable = ['title']; }
Custom Models
Replace the default models with your own:
FilamentMenuBuilderPlugin::make() ->usingMenuModel(CustomMenu::class) ->usingMenuItemModel(CustomMenuItem::class) ->usingMenuLocationModel(CustomMenuLocation::class)
Rendering Menus
Retrieve a menu by location. Results are cached and automatically busted on changes:
use Datlechin\FilamentMenuBuilder\Models\Menu; $menu = Menu::location('header');
Render menu items:
@if($menu) <nav> <ul> @foreach($menu->menuItems as $item) <li class="{{ $item->classes }} {{ $item->isActive() ? 'active' : '' }}"> @if($item->url) <a href="{{ $item->url }}" target="{{ $item->target }}" @if($item->rel) rel="{{ $item->rel }}" @endif> {{ $item->resolveLocale($item->title) }} </a> @else <span>{{ $item->resolveLocale($item->title) }}</span> @endif @if($item->children->isNotEmpty()) <ul> @foreach($item->children as $child) <li> <a href="{{ $child->url }}">{{ $child->resolveLocale($child->title) }}</a> </li> @endforeach </ul> @endif </li> @endforeach </ul> </nav> @endif
Active State Detection
Check if a menu item matches the current URL:
$item->isActive(); // exact URL match $item->isActiveOrHasActiveChild(); // matches self or any descendant
MenuItem Properties
| Property | Type | Description |
|---|---|---|
title |
string|array | The display title (array when translatable) |
url |
?string | The URL (null for text-only items) |
target |
string | Link target (_self, _blank, etc.) |
icon |
?string | Icon identifier (e.g. heroicon-o-home) |
classes |
?string | CSS classes for the item |
rel |
?string | Link rel attribute (e.g. nofollow noopener) |
type |
string | Panel name / source type (accessor) |
children |
Collection | Nested child items |
Testing
composer test
Changelog
See CHANGELOG for recent changes.
License
MIT License. See LICENSE.md.
datlechin/filament-menu-builder 适用场景与选型建议
datlechin/filament-menu-builder 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 58.71k 次下载、GitHub Stars 达 143, 最近一次更新时间为 2024 年 08 月 06 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「laravel」 「datlechin」 「filament-menu-builder」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 datlechin/filament-menu-builder 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 datlechin/filament-menu-builder 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 datlechin/filament-menu-builder 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
An Elegant Menu Builder for FilamentPHP
Alfabank REST API integration
Create and manage menus and menu items
Custom with fixes - Create and manage menus and menu items
Another menu builder plugin for filament php
Create and manage menus and menu items
统计信息
- 总下载量: 58.71k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 143
- 点击次数: 18
- 依赖项目数: 3
- 推荐数: 1
其他信息
- 授权协议: MIT
- 更新时间: 2024-08-06
