xslain/laravel-modules-livewire
Installation:
composer require xslain/laravel-modules-livewire
php artisan vendor:publish --tag=modules-livewire-config
config/modules-livewire.php exists in your project.Generate a Livewire Component:
php artisan pagemodule:make-livewire Pages/AboutPage Core
AboutPage) inside the Core module, auto-registered for Livewire.Use the Component:
@livewire('core::pages.about-page')
:: syntax ensures the component is resolved from the Core module.Core, Admin, Blog) has its own Livewire components. The package auto-discovers and registers them, eliminating manual Livewire component registration.Component Organization:
Modules/Core/Http/Livewire/Pages/).pagemodule:make-livewire command to scaffold components with module-aware namespacing.View Binding:
--view= flag lets you specify a custom Blade view path for the component:
php artisan pagemodule:make-livewire Dashboard/Stats Core --view=modules/core/resources/views/livewire/dashboard/stats.blade.php
Inline Components:
--inline flag to generate a self-contained component (no separate Blade file):
php artisan pagemodule:make-livewire Widgets/Alert Core --inline
Custom Stubs:
php artisan vendor:publish --tag=modules-livewire-stubs
stubs/livewire.stub to include module-specific logic (e.g., middleware, module-specific properties).Dynamic Registration:
ModulesServiceProvider. Override the boot() method in your module’s service provider to add custom logic:
public function boot()
{
$this->app->make(\Xslain\ModulesLivewire\LivewireServiceProvider::class);
// Custom Livewire middleware or hooks
}
Module-Specific Livewire Hooks:
livewire:component event to inject module-specific data or middleware:
// In your module's EventServiceProvider
public function boot()
{
Livewire::component('core::pages.*', function ($component) {
$component->middleware('auth:admin'); // Example: Module-specific middleware
});
}
Livewire + Modules Middleware:
Apply module-specific middleware to Livewire components by leveraging the boot() method in your module’s ServiceProvider:
Livewire::component('core::*', function ($component) {
$component->middleware(['auth', 'verified']);
});
Shared Livewire Logic:
Create a base Livewire class in your module (e.g., Modules/Core/Http/Livewire/BaseLivewire.php) and extend it in generated components:
use Xslain\ModulesLivewire\Traits\HandlesModuleData;
class BaseLivewire extends Livewire
{
use HandlesModuleData;
}
Asset Management: Use module-specific asset paths in Livewire components:
public function mount()
{
$this->moduleAssets = asset('modules/core/assets/');
}
Testing: Test Livewire components in isolation using Laravel’s Livewire testing helpers:
$this->livewire('core::pages.about-page')
->assertSee('Welcome to About Page');
Component Naming Collisions:
core::pages.about-page vs. blog::posts.index). The package resolves components via module namespace, but ensure uniqueness across modules.Caching Issues:
php artisan livewire:discover
php artisan view:clear
config/livewire.php under component_path.Stub Overrides:
Middleware Scope:
Livewire::component() in boot() only affects components registered after the middleware is set. Use a high-priority service provider to ensure order.Inline Components and Assets:
--inline) won’t have separate Blade files, so manage assets (CSS/JS) directly in the component class or use @stack directives in the parent layout.Component Not Found:
Modules/Core/Http/Livewire/Pages/).config/modules-livewire.php for custom paths or registration logic.php artisan livewire:discover --verbose to debug discovery issues.Livewire Events Not Firing:
core::pages.about-page).Configuration Overrides:
php artisan config:clear
Module-Specific Livewire Config: Extend the package’s config to add module-specific Livewire settings:
// config/modules-livewire.php
'modules' => [
'core' => [
'middleware' => ['auth', 'verified'],
'namespace' => 'Core\\Http\\Livewire',
],
],
Livewire + Modules Events: Listen to module events to dynamically register or modify Livewire components:
// In your module's EventServiceProvider
public function boot()
{
Modules::firing('Modules\Core\Events\ModuleInitialized', function ($module) {
Livewire::component('core::dashboard.*', function ($component) {
$component->module = $module;
});
});
}
Performance:
// In your module's ServiceProvider
public function boot()
{
if (Modules::has('Core')) {
$this->app->make(\Xslain\ModulesLivewire\LivewireServiceProvider::class);
}
}
Livewire + Inertia:
If using Inertia.js, ensure the Livewire component is properly proxied in your Inertia setup. The package doesn’t natively support Inertia, so manually register components in app/Http/Middleware/HandleInertiaRequests.php:
public function rootView(Request $request)
{
return parent::rootView($request)->with([
'livewireComponents' => [
'core::pages.about-page' => 'AboutPage',
],
]);
}
Testing Modules: Use Laravel Modules’ testing helpers to isolate Livewire components:
$this->actingAs($user)
->withModule('Core')
->livewire('core::pages.about-page')
->assertSuccessful();
How can I help you explore Laravel packages today?