Ako odlucis mijenjat controller u kontroler, to je teski breaking change; u rangu kao da PHP odluci da se klasa vise ne deklarira sa class nego sa ‘klasa’. Konvencije i standardi postoje da olaksaju posao, i samim time nisu varijabilne (barem ne u nekakvom razumnom roku), i naziv Controller je konvencija tvog frameworka (i skoro svih drugih
).
Unutar kontrolera zoves koliko god trebas modela, servisa, helpera, i bilo cega drugog, to je sasvim normalno.
Model opisuje bazu. Sad, ovo sto govorim nije uklesano u kamen; vise je stvar dizajna frameworka, ali ja preferiram ovakav dizajn:
Recimo model ‘post’ ce biti klasa sa protected varijablama id, author, category, content, createdAt, updatedAt itd - dakle cisto reflektira kolone u tablici koja sadrzi postove., i ima public metode koje getaju i setaju te varijable: getId(), getCategory(), getContent(), itd.
A repozitorij sadrzi one metode koje nisu cisto dohvacanje i spremanje kolona; odnosno direktno upravljanje onim protected varijablama koje opisuju bazu. Recimo nekakva metoda getRelatedPosts(), getWeeklyTopPosts() i stajaznan, nemaju sta radit u klasi koja opisuje model Post. To su metode koje sluze business logici.
Da imas nekakvu vezanu tablicu “related_posts” i tvoja posts tablica sadrzi foreign key na related_posts tablicu, onda bi getRelatedPosts() imao smisla u tom modelu jer opisuje ono sto je u bazi. Tako ti konvencija omogucava da gledajuci u kod tocno znas kako stvari izgledaju u bazi, ili obrnuto, gledajuci bazu tocno znas da sigurno mora postojati metoda u modelu, koju zbog konvencije bez gledanja u kod odmah znas kako se zove, i koja dohvaca ili seta neku kolonu.
A za sve ostalo postoji repozitorij, koji sadrzi sve one metode koje ne opisuju bazu nego sluze nekoj business svrsi. Takozvane “custom” metode, jer ih nisi napravio “zato sto moras”, odnosno radi konvencije, nego si ih napravio jer ti trebaju rijesiti neki problem kojeg osnovni set metoda iz modela ne rjesava.
Al opet kazem, to je dizajn kakav meni ima najvise smisla, i kakav dugorocno podrzava kompleksnije stvari. Takvim dizajnom tvoj ORM prema klasi zna tocno kako treba izgledat baza i kako mapirat podatke. Recimo meni fantastican feature kod Doctrine ORMa je to sto ce te nakon promjene modela (u kodu) upozorit da stanje u bazi ne odgovara onom sto mu je u modelu, i znat ce ti izbacit (i izvrsit) SQL kod potreban da se schema baze updatea da odgovara tvom novom modelu.
S druge strane, kod nekih frameworkova ces nac da se sve sta se tice baze trpa u file koji opisuje jedan model.