rahmanramsi / livewire-page-group
a simple way to group your livewire full pages
Package info
github.com/rahmanramsi/livewire-page-group
pkg:composer/rahmanramsi/livewire-page-group
Requires
- php: ^8.1
- illuminate/contracts: ^10.0 || ^11.0 || ^12.0 || ^13.0
- livewire/livewire: ^3.8 || ^4.1
- spatie/laravel-package-tools: ^1.93.1
Requires (Dev)
- laravel/pint: ^1.14
- nunomaduro/collision: ^7.10 || ^8.1
- orchestra/testbench: ^8.22 || ^9.0 || ^10.0 || ^11.0
- pestphp/pest: ^2.36 || ^3.8 || ^4.0
- pestphp/pest-plugin-arch: ^2.7 || ^3.1 || ^4.0
- pestphp/pest-plugin-laravel: ^2.4 || ^3.2 || ^4.0
README
This package groups class-based, full-page Livewire components behind a shared domain, URL prefix, layout, middleware stack, and boot callback.
Requirements
- PHP
^8.1 - Laravel 10, 11, 12, or 13
- Livewire
^3.8or^4.1
Livewire is installed as a runtime dependency. Composer selects a compatible release from ^3.8 || ^4.1, so applications constrained to Livewire 3 can stay on that line while applications such as Filament 5 projects can resolve Livewire 4.
Installation
Install the package with Composer:
composer require rahmanramsi/livewire-page-group
Getting Started
Create a service provider for each page group and register it with your application providers:
<?php namespace App\Providers; use App\Livewire\Admin\Dashboard; use App\Livewire\Admin\Users\ListUsers; use Illuminate\Support\Facades\Route; use Rahmanramsi\LivewirePageGroup\PageGroup; use Rahmanramsi\LivewirePageGroup\PageGroupServiceProvider; class AdminPageGroupServiceProvider extends PageGroupServiceProvider { public function pageGroup(PageGroup $pageGroup): PageGroup { return $pageGroup ->id('admin') ->path('admin') ->domain(config('app.admin_domain')) ->homePage(Dashboard::class) ->layout('layouts.admin') ->middleware(['web', 'auth']) ->pages([ ListUsers::class, ]) ->discoverPages( app_path('Livewire/Admin'), 'App\\Livewire\\Admin', ) ->routes(function (PageGroup $pageGroup): void { Route::get('/health', fn (): string => "{$pageGroup->getId()} is healthy") ->name('health'); }) ->bootUsing(function (PageGroup $pageGroup): void { // Run once when this group is selected for the request. }); } }
The example creates these route name prefixes:
livewirePageGroup.admin.pages.*
livewirePageGroup.admin.*
Use domain(null) or omit domain() when the group should respond on every host. The path() value is the URL prefix. Group middleware applies to the home page, discovered pages, explicit pages, and custom routes. Pass true as the second argument to middleware() when those middleware should also be persistent across Livewire requests.
The configured layout must accept the Blade $slot. It also receives the mounted component as $livewire, which allows a layout to render the page title:
<title>{{ $livewire->getTitle() }}</title> {{ $slot }}
Pages
Pages extend Rahmanramsi\LivewirePageGroup\Pages\Page:
<?php namespace App\Livewire\Admin\Users; use Rahmanramsi\LivewirePageGroup\Pages\Page; class ListUsers extends Page { protected static ?string $title = 'Users'; protected static ?string $slug = 'users'; protected static string $view = 'livewire.admin.users.list-users'; }
Explicit pages are registered with pages([...]). discoverPages($directory, $namespace) discovers non-abstract Page subclasses from an autoloadable namespace. Set protected static bool $isDiscovered = false on a page to exclude it from discovery.
The package uses Route::get($uri, ComponentClass::class) for its class-based full-page components. This form works on both supported Livewire lines. Livewire-specific component registration is isolated behind a compatibility layer so component aliases remain stable across Livewire 3 and 4.
Single-file and multi-file Livewire 4 components are not discovered as page-group pages. Page-group pages remain class-based subclasses of Rahmanramsi\LivewirePageGroup\Pages\Page.
Page Generator
Generate a class and its Blade view for a registered group:
php artisan make:livewire-page Users/ListUsers --group=admin
The command uses the group's first discovered directory and namespace. If more than one is configured, it prompts for the destination. Existing class or view files are not overwritten unless --force is supplied.
Changelog
Please see CHANGELOG for more information on what has changed recently.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
- Rahman Ramsi
- Filament for inspiration
- All Contributors
License
The MIT License (MIT). Please see License File for more information.