fix(auth): register Spatie role/permission middleware + add missing #[Layout] (fixes post-login crash)

Login authenticated fine but the landing page crashed (so it looked like
'login doesn't work'):
- bootstrap/app.php didn't register Spatie's middleware aliases -> any route
  with role:/permission: threw 'Target class [role] does not exist'.
  Registered role / permission / role_or_permission.
- config/livewire.php absent -> default layout is the non-existent
  components.layouts.app. ProjectList, PhaseProgress and ReportsDashboard
  lacked #[Layout('layouts.app')] -> MissingLayoutException. Added it (the
  other 10 routed components already had it).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-17 16:12:20 +02:00
parent 316e0ede39
commit 5f4b82ae07
6 changed files with 239 additions and 226 deletions
+2
View File
@@ -3,8 +3,10 @@
namespace App\Livewire; namespace App\Livewire;
use Livewire\Component; use Livewire\Component;
use Livewire\Attributes\Layout;
use App\Models\Phase; use App\Models\Phase;
#[Layout('layouts.app')]
class PhaseProgress extends Component class PhaseProgress extends Component
{ {
public Phase $phase; public Phase $phase;
+2
View File
@@ -4,9 +4,11 @@ namespace App\Livewire;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
use Livewire\Attributes\Layout;
use App\Models\Project; use App\Models\Project;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
#[Layout('layouts.app')]
class ProjectList extends Component class ProjectList extends Component
{ {
use WithPagination; use WithPagination;
@@ -3,11 +3,13 @@
namespace App\Livewire\Reports; namespace App\Livewire\Reports;
use Livewire\Component; use Livewire\Component;
use Livewire\Attributes\Layout;
use App\Models\Project; use App\Models\Project;
use App\Models\Phase; use App\Models\Phase;
use App\Models\Inspection; use App\Models\Inspection;
use Carbon\Carbon; use Carbon\Carbon;
#[Layout('layouts.app')]
class ReportsDashboard extends Component class ReportsDashboard extends Component
{ {
public $dateRange = 'month'; // week, month, quarter, year public $dateRange = 'month'; // week, month, quarter, year
+7
View File
@@ -12,6 +12,13 @@ return Application::configure(basePath: dirname(__DIR__))
) )
->withMiddleware(function (Middleware $middleware): void { ->withMiddleware(function (Middleware $middleware): void {
$middleware->appendToGroup('web', \App\Http\Middleware\SetLocale::class); $middleware->appendToGroup('web', \App\Http\Middleware\SetLocale::class);
// Spatie permission middleware aliases
$middleware->alias([
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
]);
}) })
->withExceptions(function (Exceptions $exceptions): void { ->withExceptions(function (Exceptions $exceptions): void {
// //
@@ -1,5 +1,5 @@
<div> <div>
<x-slot name="header"> <x-slot name="header">
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<a href="{{ route('companies.manage') }}" class="btn btn-ghost btn-sm px-2" wire:navigate> <a href="{{ route('companies.manage') }}" class="btn btn-ghost btn-sm px-2" wire:navigate>
<x-heroicon-o-arrow-left class="w-4 h-4" /> <x-heroicon-o-arrow-left class="w-4 h-4" />
@@ -8,10 +8,10 @@
{{ $company ? 'Editar empresa: ' . $company->name : 'Nueva empresa' }} {{ $company ? 'Editar empresa: ' . $company->name : 'Nueva empresa' }}
</h2> </h2>
</div> </div>
</x-slot> </x-slot>
<div class="py-8"> <div class="py-8">
<div class="max-w-3xl mx-auto sm:px-6 lg:px-8"> <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
@if(session('notify')) @if(session('notify'))
<div class="alert alert-success mb-4">{{ session('notify') }}</div> <div class="alert alert-success mb-4">{{ session('notify') }}</div>
@@ -241,6 +241,6 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@@ -1,5 +1,5 @@
<div> <div>
<div class="max-w-4xl mx-auto p-4"> <div class="max-w-7xl mx-auto p-4">
<div class="flex items-center justify-between mb-4"> <div class="flex items-center justify-between mb-4">
<h1 class="text-2xl font-bold">{{ $project ? __('Edit Project') : __('New Project') }}</h1> <h1 class="text-2xl font-bold">{{ $project ? __('Edit Project') : __('New Project') }}</h1>
<a href="{{ route('projects.index') }}" class="btn btn-ghost btn-sm gap-1" wire:navigate> <a href="{{ route('projects.index') }}" class="btn btn-ghost btn-sm gap-1" wire:navigate>