Files
mesreleves-php/app/Http/Controllers/ReleveController.php
T
yann64 d38efaad60 Fix routes shallow releves : Source ne peut pas être bindée sans {source} dans l'URL
Avec ->shallow(), show/edit/update/destroy deviennent /releves/{releve}.
Le contrôleur bindait Source $source depuis la route (introuvable) →
Laravel l'instanciait vide via DI → id null → route() échouait dans la vue.
Correction : charger $source via $releve->source dans les 4 actions shallow.
Redirect update() corrigé : releves.show (shallow) et non sources.releves.show.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:29:49 +02:00

118 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Enums\FieldType;
use App\Http\Requests\StoreReleveRequest;
use App\Http\Requests\UpdateReleveRequest;
use App\Models\Releve;
use App\Models\Source;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
class ReleveController extends Controller
{
public function index(Source $source): View
{
$this->authorize('viewAny', [Releve::class, $source]);
$source->load('sourceType.fields');
// Keyset pagination sur id (évite le COUNT sur des millions de lignes)
$releves = $source->releves()
->orderBy('id')
->cursorPaginate(25);
return view('releves.index', compact('source', 'releves'));
}
public function create(Source $source): View
{
$this->authorize('create', [Releve::class, $source]);
$source->load('sourceType.fields');
return view('releves.create', compact('source'));
}
public function store(StoreReleveRequest $request, Source $source): RedirectResponse
{
$data = $this->buildData($request->validated()['data'] ?? [], $source);
$source->releves()->create([
'data' => $data,
'created_by' => $request->user()->id,
'updated_by' => $request->user()->id,
]);
return redirect()->route('sources.releves.index', $source)
->with('success', 'Relevé ajouté.');
}
public function show(Releve $releve): View
{
$this->authorize('view', $releve);
$source = $releve->source->load('sourceType.fields');
$releve->load('createur', 'modificateur');
return view('releves.show', compact('source', 'releve'));
}
public function edit(Releve $releve): View
{
$this->authorize('update', $releve);
$source = $releve->source->load('sourceType.fields');
return view('releves.edit', compact('source', 'releve'));
}
public function update(UpdateReleveRequest $request, Releve $releve): RedirectResponse
{
$source = $releve->source->load('sourceType.fields');
$data = $this->buildData($request->validated()['data'] ?? [], $source);
$releve->update([
'data' => $data,
'updated_by' => $request->user()->id,
]);
return redirect()->route('releves.show', $releve)
->with('success', 'Relevé mis à jour.');
}
public function destroy(Releve $releve): RedirectResponse
{
$this->authorize('delete', $releve);
$source = $releve->source;
$releve->delete();
return redirect()->route('sources.releves.index', $source)
->with('success', 'Relevé supprimé.');
}
// Normalise les données POST en structure JSONB propre
private function buildData(array $raw, Source $source): array
{
$data = [];
foreach ($source->sourceType->fields as $field) {
$value = $raw[$field->name] ?? null;
$data[$field->name] = match ($field->type) {
FieldType::Boolean => (bool) ($value ?? false),
FieldType::Number => $value !== null && $value !== '' ? (float) $value : null,
FieldType::Date => [
'valeur' => $value['valeur'] ?? null,
'calendrier' => $value['calendrier'] ?? 'gregorien',
],
default => $value === '' ? null : $value,
};
}
return $data;
}
}