php mvc struktur / brug

Tags:    php mvc

Heej folks, så er jeg her igen, med endnu et spørgsmål omkring brugen af mvc (:
Den mvc jeg har lavet mig, har denne struktur:

Har en CORE class, som tjekker den indtastede url, for en tilsvarende controller og method, og derefter giver den diverse parametre til den method der er kaldt, (hvis altså params er givet).

Så har jeg en base_controller, med functionerne model(), view() og redirect(). Det er den class, som jeg laver mine andre controllers et child af, så jeg kan "loade" min model fx. model("user"), så jeg derefter kan kalde min view method, med informationen fra min model. fx. view("home/index", "username" => "$model->username"), så den loader index filen fra min home directory.

ps. Den ovenstående forklaring er givet, så i forhåbentlig best muligt kan svare på den kommende problemstilling, og fordi jeg gerne vil vide om det er nogenlunde den rigtige struktur.

Nu kommer mit store problem så, fordi lige nu der tjekker jeg for mine formes submits osv. i min user_model.php, det er også den fil der opretter $_SESSION'S hvis, username og pass stemmer overens med db. Jo mere jeg kigger på den måde jeg har det på lige nu, bliver jeg mere og mere forvirret, da jeg ikke forstår hele den måde mine controllers så fungere på. giver lige hurtigt et eksempel mere:

Fold kodeboks ind/udPHP kode 


Og kan ikke rigtig forstå at det er det eneste der egentlig skal forgå i mine controllers, da jeg hele tiden læser mig frem til at alt min logik skal forgå i mine controllers og models. Er jeg helt forkert på den, eller hvordan ser det ud?

Er meget ked af, hvis det er lidt forvirrende skrevet, eller hvis det bare generelt ingen mening giver, men håber da at det giver mening og at der er en derude der kan give mig et oplysende svar.
Tusind tak på forhånd.
Mvh. WunderStrudel



Indlæg senest redigeret d. 05.08.2014 01:04 af Bruger #20949
1 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Som tommelfingerregel: Logik i din model er det "generelle". Logik i din controller er det "specifikke". Det vil sige at din model skal indeholde kode, der altid er tilfældet når du arbejder med den enhed i din database, som modellen repræsenterer. Hvis modellen fx har en relation til en anden model, der skal have sine data opdateret når du poster nye data til den første model, så skal den logik finde sted i dit model-lag. Din controller bør du anvende til kode-situationer, der er mere specifikke. For eksempel bør din Model være http-method unaware -- den skal bekymre sig om at opdatere de data du beder den om, den skal ikke spekulere over hvorvidt det kommer fra GET, POST eller om det bliver læst fra en XML-fil der er blevet overført til serveren via FTP. Modellen skal "bare" sørge for, at de data den får, bliver behandlet på en konsistent og ensartet måde. Sagt på en anden måde, din model skal være sikker i sin sag. Den må ikke lave antagelser. Din model skal virke, uanset om controlleren der kalder den er fra et admin-panel, et kommandolinie-program, et produkt-import cronjob eller en blog-forside. Din model er fakta, din controller er den kontekst fakta bliver fremsat i.

Dog er der også den tommelfingerregel, at det er bedre at dine modeller er tykke, end at din controller er det. Hvis der er kode du er i tvivl om bør være i din model eller din controller, så er det altid godt at smide det i modellen indtil andet er bevist. Du får sandsynligvis brug for det senere fra en anden controller alligevel, og så er det meget mere DRY (Don't Repeat Yourself) at have den logik tilkoblet din model.

Så som udgangspunkt vil jeg mene, at det scenarie du beskriver er en fin start. Der er plads til megen forbedring, fx ville jeg flytte SESSION-behandling ud af modellen, men det er en rar ting, at du synes du skal skrive meget lidt kode for at få tingene til at virke rigtigt. Når du ikke behøver skrive mere end 2-3 linier kode i din controller for at få noget lavet, så ved du, at du er på rette spor. I CakePHP 3.0, som har en ret avanceret MVC struktur, ville din index-funktion nemlig ikke se meget anderledes ud:
Fold kodeboks ind/udKode 


Du kan eventuelt kigge på CodeIgniter's MVC struktur som inspiration. CodeIgniter gør det meget simpelt og uden så meget fis, men er naturligvis ikke ligeså "rigtig" som CakePHP, Symfony og ZendFramework er det. CodeIgniter er pædagogisk og veldokumenteret, og tager udgangspunkt i at du gerne vil skrive noget kode -- hvor CakePHP tager udgangspunkt i, at du gerne for så vidt muligt vil slippe for det ;)



Indlæg senest redigeret d. 05.08.2014 01:57 af Bruger #8223
t