Anax med databasdrivna modeller enligt Active Record, ett exempel (v2)
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 (v2)”.
#Bygg vidare på tidigare exempel
Vi jobbar vidare i samma katalog 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
.
Pröva att öppna din webbläsare mot htdocs
för att kontrollera dina routes fungerar.
Tanken är att vi skall scaffolda fram ett CRUD exempel och sedan studera koden som genererats.
#Exemplet Bok
Det exempel vi skall titta på handlar om böcker, Book
. Exemplet visar en samling av CRUD-relaterade klasser som 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 med scaffolding och kodstrukturer.
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 roten av exempelrepot
anax create src/Book ramverk1-crud-v2
Du kommer att skapa alla filerna katalogen src/Book
.
När du får frågan om namespace skriver du in Anax\\Book
och byter ut Anax mot ditt eget vendor name. 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 │ └── router │ └── 100_bookController.php ├── sql │ └── ddl │ ├── book_mysql.sql │ └── book_sqlite.sql └── view └── book └── crud ├── create.php ├── delete.php ├── update.php └── view-all.php 9 directories, 12 files
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. Det är så som Active Record är implementerat.
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 publika properties som finns i modellklassen, även det är hur Active Record fungerar.
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.
Filen som innehåller routen för kontrollern ligger under extra/config/router/100_bookController.php
. Alla routes kommer att monteras under routen book/
.
I katalogen extra/sql/ddl/*.sql
finns grunden för databastabeller. Databastabellerna motsvaras av de properties som finns i modellklassen Books
, det finns dock ingen atuomatisk koppling för de properties/kolumner som används. Det får man redigera för hand.
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.
- Skapa databastabellen
Book
. - Kopiera vyerna.
- Lägg till routes för
book/
. - Pröva att det fungerar via routen
book/
.
#Skapa databastabellen Book
Jag tar och kopierar de SQL-filer som scaffoldats fram och lägger dem i min egen sql/ddl
.
# Stå i rooten av exempel repot
rsync -av src/Book/extra/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
Nu finns databastabellerna på plats. Du kan verifiera via .schema Book
så här.
$ sqlite3 data/db.sqlite ".schema Book" CREATE TABLE Book ( "id" INTEGER PRIMARY KEY NOT NULL, "column1" TEXT NOT NULL, "column2" TEXT NOT NULL );
#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 exempel repot rsync -av src/Book/extra/view .
Då är vi redo att testa.
#Lägg till routes för book/
Lägg till routes så att ramverket känner igen dem och skickar dem vidare till kontrollern.
# Stå i rooten av exempel repot rsync -av src/Book/extra/config/router ./config
Du kan verifiera att routerna är tillagda via din htdocs/dev/router
.
#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/update/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
- 2018-12-10: (B, mos) Uppdaterad till kursen ramverk1 v2.
- 2017-09-11: (A, mos) Första utgåvan.