mhmiton/laravel-modules-livewire
Installation:
composer require mhmiton/laravel-modules-livewire
php artisan vendor:publish --tag=modules-livewire:config
config/modules-livewire.php exists in your project.First Use Case: Create a Single File Component (SFC) for a module:
php artisan module:make-livewire sfc.post.create Core --sfc
Modules/Core/Resources/views/livewire/sfc.post.create.blade.php.Modules/Core/App/Livewire/SfcPostCreate.php.Core module.Usage in Blade:
@livewire('core::sfc.post.create')
core:: prefix ensures the component is namespaced to the module.Component Creation:
--sfc for Single File Components (recommended for simplicity).--sfc for traditional class-based Livewire components.php artisan module:make-livewire post.create Core
Module-Specific Registration:
core::sfc.post.create).Reusing Components Across Modules:
:: syntax to reference components from other modules:
@livewire('admin::user.profile')
Configuration:
config/modules-livewire.php file to:
livewire → components).kebab-case vs. snake_case).Integration with Laravel Modules:
// Modules/Core/Routes/web.php
Route::get('/posts/create', fn () => view('core::pages.posts.create'))
->middleware(['auth', 'verified']);
<!-- Modules/Core/Resources/views/pages/posts/create.blade.php -->
@livewire('core::sfc.post.create')
Testing:
public function test_post_creation()
{
$this->livewire(SfcPostCreate::class)
->set('title', 'Test Post')
->call('save')
->assertEmitted('postCreated');
}
Asset Management:
Modules/{Module}/Resources/assets/ and compile with Laravel Mix or Vite.@stack directives in SFCs to load module-specific assets:
@push('core-scripts')
<script src="{{ asset('modules/core/js/post.js') }}"></script>
@endpush
Shared Logic:
Shared) and extend them in other modules:
// Modules/Shared/App/Livewire/BaseComponent.php
class BaseComponent extends Component {
public function authorize() {
return auth()->check();
}
}
// Modules/Core/App/Livewire/SfcPostCreate.php
class SfcPostCreate extends BaseComponent { ... }
Dynamic Component Loading:
module() helper to dynamically resolve module paths:
$module = module('Core');
$viewPath = $module->getPath().'/Resources/views/livewire/sfc.post.create.blade.php';
Livewire Events:
$this->dispatch('core-post-created', data: ['id' => $post->id]);
@script
Livewire.on('core-post-created', (data) => {
console.log('Post created:', data);
});
@endscript
Middleware:
// Modules/Core/Http/Middleware/EnsureCoreUser.php
public function handle($request, Closure $next) {
if (!$request->user()->isCoreUser()) {
abort(403);
}
return $next($request);
}
// Modules/Core/App/Livewire/SfcPostCreate.php
public function middleware() {
return [EnsureCoreUser::class];
}
Component Naming Collisions:
sfc.post.create) across modules.core.post.create vs. admin.post.create).View Path Resolution:
--sfc flag was used (or the component is in the correct class-based path).php artisan module:publish Core).config/modules-livewire.php for custom view paths.Livewire Component Not Auto-Registering:
php artisan module:boot Core).AppServiceProvider if needed:
Livewire::component('core::sfc.post.create', \Modules\Core\App\Livewire\SfcPostCreate::class);
Asset Loading Issues:
mix.js()/mix.css() to include module paths:
mix.js('Resources/assets/js/app.js', 'public/js')
.js('Modules/Core/Resources/assets/js/post.js', 'public/modules/core/js');
Testing Quirks:
Module::bootForTesting() in tests:
use Modules\Core\Module;
public function setUp(): void {
parent::setUp();
Module::bootForTesting('Core');
}
Caching:
php artisan view:clear
php artisan cache:clear
php artisan module:clear-compiled
Log Component Registration:
vendor/mhmiton/laravel-modules-livewire/src/ModuleLivewireServiceProvider.php to verify registration:
Log::debug('Registering Livewire component:', ['name' => $name, 'class' => $class]);
Check Published Config:
config/modules-livewire.php matches your expectations:
'view_path' => 'livewire', // Default: 'livewire'
'component_namespace' => 'modules', // Default: 'modules'
Inspect Blade Directives:
@dd to debug the @livewire directive’s resolved component:
@php
dd(\Livewire::getComponentClass('core::sfc.post.create'));
@endphp
Livewire Wire:Log:
php artisan livewire:log
storage/logs/livewire.log for component lifecycle events.Custom Component Factories:
php artisan vendor:publish --tag=modules-livewire:stubs
resources/stubs/livewire/ to add custom logic (e.g., auto-injecting traits).Dynamic Module Loading:
ModuleLivewireServiceProvider to lazy-load modules:
public function register()
{
if (!$this->app->runningInConsole()) {
$this->loadModules();
}
}
Hybrid Components:
API Integration:
// Modules/Core/App/Live
How can I help you explore Laravel packages today?