shopper/sidebar
Composer 安装命令:
composer require shopper/sidebar
包简介
A sidebar builder for Laravel
README 文档
README
A headless sidebar package for Laravel that allows you to create and manage sidebars with full customization support.
Originally forked from SpartnerNL/Laravel-Sidebar.
Installation
Require this package in your project:
composer require shopper/sidebar
Publish the config file:
php artisan vendor:publish --provider="Shopper\Sidebar\SidebarServiceProvider" --tag="sidebar-config"
Publish the views (optional, for customization):
php artisan vendor:publish --provider="Shopper\Sidebar\SidebarServiceProvider" --tag="sidebar-views"
Add the middleware to your route group or bootstrap/app.php:
// In a route group Route::middleware(['web', \Shopper\Sidebar\Middleware\ResolveSidebars::class]) ->group(function () { // Your routes }); // Or in bootstrap/app.php (Laravel 11+) ->withMiddleware(function (Middleware $middleware) { $middleware->appendToGroup('web', [ \Shopper\Sidebar\Middleware\ResolveSidebars::class, ]); })
Configuration
The config file (config/sidebar.php) allows you to customize:
return [ // Caching method: null, 'static', or 'user-based' 'cache' => [ 'method' => null, 'duration' => 1440, ], // Sidebar dimensions (CSS values) 'width' => '16.5rem', 'collapsed_width' => '4.5rem', // Responsive breakpoint (pixels) 'breakpoint' => 1024, // Allow sidebar to be collapsed on desktop 'collapsible' => true, ];
Creating a Sidebar
1. Create a Sidebar Class
<?php namespace App\Sidebar; use Shopper\Sidebar\Contracts\Builder\Menu; use Shopper\Sidebar\Contracts\Sidebar; class AdminSidebar implements Sidebar { public function __construct(private Menu $menu) {} public function build(): void { $this->menu->group('Main', function ($group) { $group->item('Dashboard') ->url('/dashboard') ->icon('heroicon-o-home') ->weight(1); $group->item('Users') ->url('/users') ->icon('heroicon-o-users') ->weight(2) ->items(function ($items) { $items->item('All Users')->url('/users'); $items->item('Create User')->url('/users/create'); }); }); $this->menu->group('Settings', function ($group) { $group->item('General') ->url('/settings') ->icon('heroicon-o-cog'); }); } public function getMenu(): Menu { return $this->menu; } }
2. Register the Sidebar
Create an event listener or use the SidebarBuilder event:
<?php namespace App\Providers; use App\Sidebar\AdminSidebar; use Illuminate\Support\ServiceProvider; use Shopper\Sidebar\SidebarManager; class SidebarServiceProvider extends ServiceProvider { public function boot(SidebarManager $manager): void { $manager->register(AdminSidebar::class); } }
Usage
The sidebar package provides two ways to render your sidebar:
Option 1: Livewire Component (Simple)
Use the built-in Livewire component for a ready-to-use sidebar with Alpine.js state management:
@livewire('sidebar', [ 'sidebarClass' => \App\Sidebar\AdminSidebar::class, 'class' => 'your-sidebar-classes', 'collapsible' => true, ])
The Livewire component includes:
- Alpine.js store integration (
$store.sidebar) - Collapse/expand functionality
- Responsive behavior (mobile/desktop)
- LocalStorage persistence
Option 2: Blade Components (Full Customization)
For complete control over the sidebar layout, use the SidebarRenderer directly in your Blade views:
{{-- layouts/sidebar.blade.php --}} <aside class="sidebar" x-bind:class="{ 'sidebar-collapsed': $store.sidebar.isCollapsed }" > {{-- Custom header with branding --}} <div class="sidebar-header"> <img src="/logo.png" alt="Logo" /> <span x-show="!$store.sidebar.isCollapsed">My App</span> </div> {{-- Sidebar menu (rendered by the package) --}} <nav class="sidebar-nav"> {!! $sidebar !!} </nav> {{-- Custom footer --}} <div class="sidebar-footer"> <a href="/settings">Settings</a> </div> </aside>
Both options use the same underlying SidebarRenderer, which renders:
item.blade.php- Individual menu itemsgroup.blade.php- Menu groupsbadge.blade.php- Item badgesappend.blade.php- Appended content
Alpine.js Store
The sidebar uses an Alpine.js store for state management. Initialize it in your JavaScript:
import Alpine from 'alpinejs' import sidebarStore from '@shopper/sidebar/stores/sidebar' Alpine.store('sidebar', sidebarStore()) Alpine.store('sidebar').init()
Store API
// State $store.sidebar.isOpen // Mobile: sidebar visibility $store.sidebar.isCollapsed // Desktop: collapsed state $store.sidebar.collapsible // Whether collapse is enabled // Methods $store.sidebar.toggle() // Smart toggle (mobile: open/close, desktop: collapse/expand) $store.sidebar.open() // Open sidebar (mobile) $store.sidebar.close() // Close sidebar (mobile) $store.sidebar.collapse() // Collapse sidebar (desktop) $store.sidebar.expand() // Expand sidebar (desktop) $store.sidebar.toggleCollapse() // Group management $store.sidebar.toggleGroup(label) $store.sidebar.isGroupCollapsed(label)
CSS Variables
The sidebar dimensions are available as CSS variables:
:root { --sidebar-width: 16.5rem; --sidebar-collapsed-width: 4.5rem; }
Inject them in your layout using the helper functions:
<style> :root { --sidebar-width: {{ \Shopper\Sidebar\sidebar_width() }}; --sidebar-collapsed-width: {{ \Shopper\Sidebar\sidebar_collapsed_width() }}; } </style> <body data-sidebar-breakpoint="{{ \Shopper\Sidebar\sidebar_breakpoint() }}" data-sidebar-collapsible="{{ \Shopper\Sidebar\sidebar_is_collapsible() ? 'true' : 'false' }}" >
Helper Functions
The package provides namespaced helper functions:
\Shopper\Sidebar\sidebar_config($key, $default) // Get config value \Shopper\Sidebar\sidebar_width() // Get sidebar width \Shopper\Sidebar\sidebar_collapsed_width() // Get collapsed width \Shopper\Sidebar\sidebar_breakpoint() // Get responsive breakpoint \Shopper\Sidebar\sidebar_is_collapsible() // Check if collapsible
Menu Item Options
$group->item('Label') ->url('/path') // URL ->route('route.name') // Or use route name ->icon('heroicon-o-home') // Icon (Blade UI Kit format) ->weight(1) // Sort order ->badge('New') // Add badge ->newTab() // Open in new tab ->authorize(fn() => auth()->check()) // Authorization callback ->items(function ($items) { // Sub-items $items->item('Sub Item')->url('/sub'); });
License
This package is licensed under MIT. You are free to use it in personal and commercial projects.
shopper/sidebar 适用场景与选型建议
shopper/sidebar 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 9.58k 次下载、GitHub Stars 达 2, 最近一次更新时间为 2023 年 07 月 20 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「builder」 「laravel」 「sidebar」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 shopper/sidebar 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 shopper/sidebar 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 shopper/sidebar 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova package that adds a notification feed in your Nova app.
Easily switch between entry types in entries section
A Sphinx Query Builder extension for the Laravel Database package
Anax Database Active Record module for model classes.
A Laravel Nova collapsible sidebar.
Displays a list of tags that the user is following in the sidebar.
统计信息
- 总下载量: 9.58k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 2
- 点击次数: 9
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-07-20