Nakon ovog poglavlja
Što ćete znati napraviti
- Mapirati CRUD radnje na HTTP metode i URL-ove.
- Provesti isti tok validacije za create i update.
- Zaštititi promjene CSRF tokenom i autorizacijom.
Predvidivi URL-ovi
Resurs članak ima sedam tipičnih ruta
Popis i detalj koriste GET. Forma za stvaranje i uređivanje također koristi GET, ali promjene idu kroz POST, PATCH i DELETE. U čistom PHP-u HTML forma može poslati skriveno _method polje, a router ga nakon CSRF provjere prevesti.
GET /articles index
GET /articles/create create
POST /articles store
GET /articles/{id} show
GET /articles/{id}/edit edit
PATCH /articles/{id} update
DELETE /articles/{id} destroy
Jedna pravila, dva slučaja
Validacija prije repozitorija
Kontroler dohvaća i validira poznata polja. Store stvara novi objekt, update prvo učitava postojeći i provjerava smije li ga korisnik mijenjati. Jedinstvena pravila kod updatea trebaju zanemariti trenutačni zapis.
Nakon uspjeha preusmjeravamo na kanonski detalj. Ako se spremanje sudari s ograničenjem baze, hvatamo konkretan problem i vraćamo korisnu poruku ili ponavljamo transakciju kada je to sigurno.
<?php
$data = validateArticle($_POST);
if ($data->hasErrors()) {
return render('articles/form.php', ['errors' => $data->errors()]);
}
$articleId = $articles->create($data->value());
redirect("/articles/{$articleId}", 303);
Visok utjecaj
Brisanje mora biti namjerno i kontrolirano
Brisanje nikada ne ide GET vezom. Zahtijeva prijavu, autorizaciju, CSRF i potvrdu u sučelju. Za poslovne podatke često je bolji soft delete ili arhiviranje kako bi povijest ostala dostupna.
Dva korisnika mogu istodobno urediti isti zapis. Za važan sadržaj dodajte version ili updated_at provjeru i odbijte spremanje ako je zapis u međuvremenu promijenjen.
UPDATE articles
SET title = :title, body = :body, version = version + 1
WHERE id = :id AND version = :expected_version;
Primijenite naučeno
Vježba: CRUD bilješki
Izradite modul privatnih bilješki za prijavljenog korisnika.
- Implementirajte popis, stvaranje, uređivanje i brisanje.
- Svaki upit ograničite na user_id prijavljenog korisnika.
- Dodajte CSRF i PRG nakon svake uspješne promjene.
Za provjeru i nastavak