spatie/laravel-blade-x
Blade-X brings Blade-style HTML components to Laravel 6 and below, letting you use tags like instead of @include. Package is abandoned because Laravel 7+ has native Blade components; migrate when upgrading.
Installation:
composer require spatie/laravel-blade-x
Publish the config (if needed):
php artisan vendor:publish --provider="Spatie\BladeX\BladeServiceProvider"
First Component:
Create a Blade file at resources/views/components/my-alert.blade.php:
<div class="alert alert-{{ $type }}">
{{ $slot ?? $message }}
</div>
Use it in a view:
<x-my-alert type="error" message="Something went wrong!" />
Key Directories:
resources/views/components/ (auto-discovered).x- prefix (e.g., <x-my-alert />).Component Structure:
alert.blade.php → <x-alert />).alert.blade.php (view) + alert.php (logic).
// resources/views/components/alert.php
public function mount($type) {
$this->type = $type;
}
Slot Content:
<x-card>
<h1>Title</h1>
<p>Content</p>
</x-card>
<!-- card.blade.php -->
<div class="card">
{{ $slot }}
</div>
Dynamic Attributes:
<x-button class="btn-primary" :disabled="$disabled" />
<!-- button.blade.php -->
<button {{ $attributes }}>
{{ $slot }}
</button>
Reusable Logic:
Use mount() in PHP components to pre-process data:
public function mount($user) {
$this->fullName = $user->name;
}
Conditional Rendering:
@if($show)
<x-component />
@endif
<x-form.input type="email" name="email" />
$this->blade->render('<x-alert />', ['type' => 'success']);
Namespace Conflicts:
<x-auth />).<x-namespace::component />
Caching Issues:
php artisan view:clear
Deprecated in Laravel 7+:
<!-- Old (Blade-X) -->
<x-alert />
<!-- New (Laravel 7+) -->
@component('alert') @endcomponent
Slot Fallback:
$slot ?? $default may not work as expected; use @isset($slot) for checks.Missing Components:
resources/views/components/ (case-sensitive).<x-Alert /> vs. alert.blade.php).Attribute Binding:
:attribute for dynamic values (e.g., :id="$id").{{ $attributes->merge(['data-test' => 'true']) }}.Custom Directories:
Configure in config/blade-x.php:
'paths' => [
resource_path('views/components'),
resource_path('views/vendor/components'),
],
Global Components:
Register in AppServiceProvider:
Blade::component('alert', AlertComponent::class);
Stacks:
Use @stack for deferred content:
<x-layout>
@stack('scripts')
</x-layout>
@push('scripts')
<script>...</script>
@endpush
Legacy Migration:
@include with <x-component />.<!-- Old -->
@include('alert', ['type' => 'error'])
<!-- New -->
<x-alert type="error" />
How can I help you explore Laravel packages today?