Prije pocetka

  • osigurati da je min verzija PHPa 7.2.5, ctype i iconv extenzije instalirane (trebale bi biti bundled)
    • vidi composer.json, require dio, pocetak
    • preporuka: opcache i APCu ukljuceni
  • composer update (instalirati composer po potrebi)
  • baza je up
  • kreirati schemu u bazi (CREATE DATABASE)
  • postaviti db url u .env fajlu (DATABASE_URL) ili bilo kak drugacije preko environmenta (apache/nginx, /usr/bin/env...)
  • server conf: https://symfony.com/doc/current/setup/web_server_configuration.html

Preporucena konfiguracija servera je na dva porta, razlika je u ENV varijabli APP_ENV

Primjer:

  • APP_ENV=prod na <host>:80
  • APP_ENV=dev na <host>:8080

Razlike: prod ima agresivniji caching i radi puno brze. Nakon svakog updejta potrebno je napraviti clear cache (bin/console cache:clear -e prod). dev rebuilda cache ako je potrebno za svaki request (sporije), ukljucuje profiling i debug toolbar

bin/console skripta: sve podkomande u ovom doc su napisane punim imenom; kod koristenja nije potrebno upisivati puno ime ako se ime podkomande moze jednoznacno odrediti iz kratice (primjerice make:entity se moze skratiti na m:e, ali m:f ne odreduje o kojoj se komandi radi; postoje make:fixtures i make:form. U tom slucaju da se pozove npr. make:form, dovoljno je upisati m:fo; takva kratica opet jednoznacno odreduje o kojoj se komandi radi).

Pomocne podkomande:

  • bin/cons list [grupa|cmd] - grupa je prefix prije :
  • bin/cons help [cmd] - cmd u punom ili skracenom obliku

Kreiranje tablica/entityja

Tablice u bazi su mapirane na entity klase. Svaka entity klasa predstavlja jedan red u tablici.

Entity klasu ne treba pisati rucno, najlakse je generirati preko cmd wizarda (komanda bin/console make:entity). Potrebno je postaviti svaki field i njegov tip (i opcionalne parametre, npr. duzina za text/string, itd.). Id polje nije potrebno postavljati, generira se automatski.

Ista komanda se koristi i za editiranje entity klasa. Potrebno je samo na pocetku upisati ime postojece klase.

Output direktorij je src/Entity. Generirana struktura je (uglavnom ne treba mjenjati rucno):

  • na property je zakacena @ORM definicija
  • za svaki property generirana je get/set metoda

Trenutno su generirana 2 entityja:

Test

Osim uobicajenih polja sadrzi:

  • datetime polje dateCreated: u php-u je predstavljeno kao DateTime(Immutable) objekt, u bazi je spremljeno kao date time
  • referentno polje code: pokazuje na drugu vrstu entityja (CodeTable), u bazi je spremljeno samo kao id
    • relacija je takoder generirana preko make:entity komande (type je postavljen na relation - to pokrece wizard za relacije)

      CodeTable

  • kao primjer za reference

Nakon svake promjene vezane za bazu (@ORM definicije, tip podatka...) na entity klasama potrebno je napraviti update baze:

  • ako je baza prazna (tablice jos ne postoje), pokrenuti bin/console doctrine:database:create
  • update: bin/console doctrine:database:update --force
  • u slucaju da se neki indexi ne poklapaju kod developmenta (i baza nema znacajnih podataka), najlakse je napraviti drop (bin/console doctrine:database:drop --force), pa opet create/update

CRUD view

Nakon kreiranja entityja, moguce je kreirati Create-Read-Update-Delete preglede za svaki od njih. Wizard cmd bin/console make:crud.

Generirane komponente:

  • Controller: osnovna logika za svaki od pregleda: index (tablica), new i edit (forme), show (pojedinacni pregled), delete
  • template: za svaki od kontrolera
  • FormType (src/FormType): definicija za formu (koja polja su ukljucena, tipovi polja na formi) - default: autodetect
    • primjer: TestType.code - polje je referenca
      • kod add(), drugi parametar je null: polje i dalje koristi autodetect za tip (u ovom slucaju EntityType- polje predstavlja drugi entity, drugu tablicu u bazi; u html-u se prikazuje kao dropdown)
      • treci parametar odreduje tekst koji ce se ispisati u dropdownu (moze biti string ili funkcija; ako je string, mora biti ime polja)

primjer 2

Kod generiranja klase TestType, u builder je dodano polje dateCreated. Naknadno polje je maknuto iz buildera (maknut je poziv na $builder->add('dateCreated'). U TestController::new, iza if ($form->isSubmitted() && $form->isValid()) naknadno je dodano $test->setDateCreated(new \DateTimeImmutable());. Svaki put kad se napravi novi zapis, dodaje se datum kreiranja (nije potrebno imati takvo polje na formi).

Bonus

  • postavljen je bootstrap (s CDN-a)
  • forme se generiraju s bootstrapovim markupom (nije potrebno dodavati nikakav html)
  • bazni layout (top nav, side nav)