Anax med databasdrivna modeller enligt Active Record, ett exempel
Vi bygger vidare på hanteringen med formulär och databasdrivna modeller genom att presentera ett exempel som implementerar CRUD med givna tekniker.
Det blir ett komplett kodexempel som visar hur man kan skriva koden i modellagret med stöd av de moduler som presenteras, inklusive formulärhantering, databas med query builder och designmönstret Active Record.
Via detta kodexempel får vi en kodbas att utgå ifrån, en kodbas som visar på ett mer komplext sammanhang där flera delar av ramverkets kod samverkar.
#Förutsättning
Du har läst artikeln “Anax och databasdrivna modeller”.
#Glöm inte .htaccess
Glöm inte att redigera din .htaccess
när du publicerar till studentservern.
#Bygg vidare på tidigare exempel
Vi jobbar vidare i samma katalog anax4
där vi gjorde formulär- och databas-exemplet. Du bör alltså ha tre routes som fungerar, nämligen user
, user/login
och user/create
.
Testa även att öppna din webbläsare mot htdocs
för att kontrollera att index-sidan fungerar samt att routen htdocs/debug/info
visar status om ramverket.
Tanken är att vi skall scaffolda fram ett CRUD exempel och sedan studera koden som använts.
Om du av någon anledning vill starta på nytt och utgå från koden som fanns i föregående artikel så kan du scaffolda fram den. Den scaffoldade varianten använder sig av databasen SQLite.
# Ställ dig i kursrepot me/kmom04
anax create anax4u ramverk1-database-user
cd anax4u
Om du väljer att skapa nytt behöver du kontrollera att de olika routerna fungerar som tänkt. Det scaffoldade exemplet använder sig av databasen SQLite.
Oavsett vad så bör vi nu ha en liknande kodbas att utgå ifrån. Jag jobbar vidare i min katalog anax4
.
#Exemplet Bok
Det exempel vi skall titta på handlar böcker, Book
. Det är en samling av CRUD-relaterade klasser tillsammans med en modell och en kontroller som hjälper oss att göra CRUD för böcker. Vi kan lägga till böcker, redigera dem, visa dem och radera dem. Exemplet är tänkt att visa på en mer komplett implementation av en databasdriven modell och hur man kan lösa CRUD.
När exemplet fungerar och är på plats kan det se ut så här.
Då börjar vi med att plocka fram kodbasen för exemplet.
#Scaffolda CRUD för Bok
Vi använder styrkan med scaffolding och genererar en kodbas för en göra CRUD på böcker.
# Ställ dig i rooten av anax4/anax4u
anax create src/Book ramverk1-crud
Du vill skapa alla filerna katalogen src/Book
.
När du får frågan om namespace skriver du in Anax\\Book
, du behöver dubbla backslash eftersom backslash är ett specialtecken, du escapar ditt backslash-tecken.
På frågan om klassnamn skriver du Book
.
Det kan se ut så här när du kör det.
När du är klar innehåller den scaffoldade katalogen src/Book
följande struktur.
$ tree src/Book/ src/Book/ ├── Book.php ├── BookController.php ├── HTMLForm │ ├── CreateForm.php │ ├── DeleteForm.php │ └── UpdateForm.php └── extra ├── config │ ├── di.php │ ├── route │ │ └── bookController.php │ └── route.php ├── sql │ └── ddl │ ├── book_mysql.sql │ └── book_sqlite.sql └── view └── book └── crud ├── create.php ├── delete.php ├── update.php └── view-all.php
Låt oss börja med att titta på vilka filer som är scaffoldade.
Kontrollern ligger i BookController.php
. Kontrollern innehåller metoder för routerna book/
, book/create
, book/update
och book/delete
. Den injectas med $di
och använder sig av modellen Book
för att spara böckerna.
Modellen ligger i Book.php
. Den är databasdriven och utökar Active Record. I modellklassen Book
finns en koppling till databastabellen med samma namn samt en koppling mellan klassens properties och de kolumner som finns i databastabellen.
Under katalogen HTMLForm
ligger de formulär som utför create, update och delete av böcker i databasen. De använder sig av modellklassen Book
för att lagra resultatet i databasen. De formulär som finns är hårt kopplade till de properties som finns i modellklassen.
I katalogen extra/
ligger de saker som behövs för att integrera koden i ditt ramverk. Normalt kopierar du innehållet i katalogen till sina respektive platser i ramverket. När du är klar kan du radera katalogen.
I filen extra/config/di.php
finns grunden till tjänsten som du behöver lägga till i din egen config/di.php
. Det är en kodbas du kan kopiera och utgå ifrån. Det rör sig om en tjänst bookController
för kontrollern.
I filen extra/route.php
finns grunden för att inkluder route-filen. Du kan kopiera in den delen in i din konfigurationsfil för routern, config/route.php
eller motsvarande. Alla routes kommer att monteras under routen book/
.
Själva filen som innehåller routerna ligger under extra/config/route/bookController.php
. Du kan kopiera hela den filen till din egna konfig-katalog för routes, config/route/
eller motsvarande.
I katalogen extra/sql/ddl/book_*.sql
finns grunden för databastabeller. Databastabellerna motsvaras av de properties som finns i modellklassen Books
.
De vyer som skall används ligger under extra/view/book/crud/*
. Det är vyer som är byggda för scaffolding och ger dig en grund att stå på.
Det var nog allt. Låt oss då göra det som krävs för att exemplet skall fungera.
#Ett fungerande exempel av den scaffoldade koden
Vi tar det steg för steg.
- Kontroller som tjänst i
$di
. - Lägg till routes för
book/
. - Skapa databastabellen
Book
. - Kopiera vyerna.
- Pröva att det fungerar via routen
book/
.
#Kontroller som tjänst i $di
Lägg kontrollern som en tjänst i $di
. Du kan utgå från koden du ser i extra/config/di.php
.
Du kan verifiera att tjänsten ligger i ramverket via din debug/info
.
Det kan se ut så här.
#Lägg till routes för book/
Lägg till routes så att ramverket känner igen dem och skickar dem vidare till kontrollern. Du finner kodbas du kan använda i extra/config/route.php
och i extra/config/route/bookController.php
.
Du kan verifiera att routerna är tillagda via din debug/info
.
Det kan se ut så här.
#Skapa databastabellen Book
Jag tar och kopierar de SQL-filer som scaffoldats fram och lägger dem i min egen sql/ddl
.
# Gå till roten av anax4/anax4u
rsync -av src/Book/extra/sql/ sql/
Sedan skapar jag tabellen i SQLite där jag sedan tidigare har en databas i data/db.sqlite
.
sqlite3 data/db.sqlite < sql/ddl/book_sqlite.sql
Jag väljer att använda terminalen för att skapa tabellen för MySQL.
mysql -uanax -panax anaxdb < sql/ddl/book_mysql.sql
Nu finns databastabellerna på plats. Du kan verifiera så här.
Först med SQLite.
$ sqlite3 data/db.sqlite ".schema Book"
CREATE TABLE Book (
"id" INTEGER PRIMARY KEY NOT NULL,
"column1" TEXT NOT NULL,
"column2" TEXT NOT NULL
);
Sedan med MySQL.
$ echo "SHOW CREATE TABLE Book\G;" | mysql -uanax -panax anaxdb
*************************** 1. row ***************************
Table: Book
Create Table: CREATE TABLE `Book` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`column1` varchar(256) COLLATE utf8_swedish_ci NOT NULL,
`column2` varchar(256) COLLATE utf8_swedish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci
Då vet vi att tabellerna finns i båda databaserna.
#Kopiera vyerna
Du kan kopiera template-filern till vyerna som ligger i katalogen extra/view/book/crud/
till din egen vy-katalog i view/book/crud/
.
# Stå i rooten av anax4/anax4u
install -d view/book/crud
rsync -av src/Book/extra/view/book/crud/ view/book/crud/
Då är vi redo att testa.
#Pröva routen book/
Vi prövar routen book/
. Det bör se ut så här.
Om det gick bra så prövar du att lägga till en bok via book/create
som finns som ett menyval i sidan.
När det går bra så ser det ut så här.
Nu kan jag klicka på bokens id för att redigera boken. Det tar mig till routen book/edit/1
där ettan står för bokens id.
Nu kan jag redigera och spara mina ändringar.
Du kan även radera en bok via menyvalet “Delete”. Det kan se ut så här.
Det vara det. Ett fungerande CRUD-exempel med databasdrivna modeller.
NU vore det ett bra läge att gå in och uppdatera koden så att den blir mer som en riktig bokhantering. Det vore ett bra sätt att se hur koden hänger ihop. Men det är en annan historia.
#Avslutningsvis
Vi har gått igenom hur formulärhantering och databashantering med databasdrivna modeller som implementeras via Active Record kan byggas ihop till en samling av klasser och filer som kan scaffoldas fram.
Vi har sett hur vi kan integrera den scaffoldade koden in i vårt eget ramverk och vi får en känsla för hur andra liknande moduler kan scaffoldas fram. Dessutom får vi ett större kodexempel på hur CRUD kan fungera i våra databasdrivna modeller.
Denna artikel har en egen forumtråd som du kan ställa frågor i, eller bidra med tips och trix.
#Revision history
- 2017-09-11: (A, mos) Första utgåvan.