Permalänk
Medlem

MVC/Design-fråga, PHP

Jag har försökt att omstrukturera en sida jag jobbar med enligt mvc. Och visst, det blir mer lättöverskådligt med det. Men nu har en designfråga dykt upp.

Hittills har jag haft en model och en view klass för varje del av sidan, t.ex. mArtikel (model) och vArtikel (view). Den första med funktionen mHämtaArtikel och den senare med vVisaArtikel.

Så som jag lagt upp det nu så anropar vVisaArtikel funktionen mHämtaArtikel internt. Det jag undrar om det inte vore smartare att vVisaArtikel får resultatet från mHämtaArtikel som en parameter istället så att den endast "oroar" sig över att visa artikeln.

Alltså nu:

function mHämtaArtikel() { /* kod för att hämta artikeln*/ return Artikel; } function vVisaArtikel() { $bärare = mHämtaArtikel(); /* kod för att visa artikeln */ } vVisaArtikel();

Förslag

function mHämtaArtikel() { /* kod för att hämta artikeln*/ return Artikel; } function vVisaArtikel($artikel) { /* kod för att visa artikeln */ } vVisaArtikel(mHämtaArtikel());

Jag har lite svårt för att hitta praktiska exempel för hur man tillämpar MVC modellen inom PHP, de flesta guiderna verkar antingen bara upprepa samma saker ("controllern är det som kontrollerar...") eller handla om väldigt grundläggande saker ("nu ska vi göra en gästbok.."), så om det är någon som har ett bra länktips så tveka inte.

Visa signatur

Let me tell you something. You don't have to say anything, you know why? Cause you can pick up all your stuff, because you're mother-fucking fired! | Lemeno.se - En blogg om att Tjäna Pengar På Internet | Min blogg om styrketräning och kost

Permalänk

Allså, en modell ska innehålla massor med data, en view ska visa datan men inte interagera med modellen, en view kan aktivera en kontroller som kan förändra antingen view:en eller datan i din modell.

Ska göra en bild...

Permalänk
Medlem

Har själv pysslat med MVC, en hel del faktiskt. Håller med om att det är svårt att hitta bra resurser och guider, men det beror nog mycket på att MVC är ett abstrakt mönster som kan implementeras på olika sätt.

I ditt fall så tror jag att pull är att föredra framför push (dvs att vVisartikel själv hämtar data från modellen). Frågan är annars varifrån parametern till Viewen-lagret skall skickas.

Såhär tolkar jag att MVC skall (kan) implementeras

  • Controller - Sköter validering av användarinput, ändrar och uppdaterar modellen samt väljer view

  • Model - Interagerar med databasen, filsystemet eller andra databehållare

  • View - Hämtar den data som behövs från modellen, och renderar datan (utefter en template

Viewen består alltså av två delar, en del som hämtar data ur modellen och en template som tala om hur datan skall renderas. För att behålla separationen är det viktigt att viewen INTE ändrar eller uppdaterar modellen.

Genom ovanstående uppdelning där kontrollern väljer view, men inte skickar med data till Viewen kan ju alla Views användas från alla controllers (viewen vet ju vad den skall visa, det är onödigt om controllern skall behöva hålla reda på det).

Ett konkret exempel på när det kan bli problem med push metoden är om du har sammansatta vyer (composite pattern). Säg att du på varje sida har en sidebar med senaste nyheter. Om sidebaren är en egen view så kan den inkluderas i en annan view och på så sätt visas på alla sidor. Då är det mer praktiskt om viewen själv hämtar sin data.

Angående länktips så delar jag gärna med mig av de jag har

Rent genrellt kan jag säga att det är bäst att starta i liten skala och verkligen tänka till och därefter bygga ut det. Kom också ihåg att MVC i grunden är ett designmösnter som svarar på hur en applikation skall fungera, inte hur den skall implementeras.
Ofta kommer man också i kontakt med andra designmösnter (patterns) när man läser om MVC. För att lära sig mer om dem så rekomenderar jag sitepoints forum (se ovan) samt http://www.devshed.com/ för exempel på implementationer.

Undrar du något mer så hojta till!

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Medlem

Jag hade skickat med datan som inparameter (din andra kodsnutt). Detta på grund av att man i vissa lägen använder samma utskriftsfunktion fast med olika indata. Sedan hur det förhåller sig exakt till MVC-mönstret vet jag inte...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av hagbarddenstore
Allså, en modell ska innehålla massor med data, en view ska visa datan men inte interagera med modellen, en view kan aktivera en kontroller som kan förändra antingen view:en eller datan i din modell.

Ska göra en bild...http://static.pici.se/pictures/Bplndlqqp.png

Jag håller inte riktigt med om att modelen känner till viewen, anser att det skall vara tvärtom, något sånt här

Citat:

Ursprungligen inskrivet av DeeXt
Jag hade skickat med datan som inparameter (din andra kodsnutt). Detta på grund av att man i vissa lägen använder samma utskriftsfunktion fast med olika indata. Sedan hur det förhåller sig exakt till MVC-mönstret vet jag inte...

Problemet med ovanstående är dels vem som skall skicka datan? Borde väl vara controllern då?

Sen är det svårt att fritt använda olika views från vilken controller som helst. Viewens uppgift är att hämta och visa information.

Har du något exempel på när man vill använda samma view med annan data?

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »

Permalänk
Hedersmedlem

Vanligaste implementationen är att vyn inte känner till modellen överhuvudtaget, kontrollern tar helt hand om kommunikationen mellan vy och modell, de känner aldrig till varandra.

Tycker denna variant är snygg då det separerar datalogik och visning ganska bra, bara i kontrollern som de samlas litegrann, men inte så mycket.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Citat:

Ursprungligen inskrivet av m0REc
Vanligaste implementationen är att vyn inte känner till modellen överhuvudtaget, kontrollern tar helt hand om kommunikationen mellan vy och modell, de känner aldrig till varandra.

Tycker denna variant är snygg då det separerar datalogik och visning ganska bra, bara i kontrollern som de samlas litegrann, men inte så mycket.

Utveckla gärna.

Låt oss säga vi har en sajt som visar saker från en databas, hur ska vyn då få data från modellen? Ska man skapa ett nytt objekt som man sedan skickar vidare till vyn då eller (låter helknasigt)?

Visa signatur
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Tynnhammar
Utveckla gärna.

Låt oss säga vi har en sajt som visar saker från en databas, hur ska vyn då få data från modellen? Ska man skapa ett nytt objekt som man sedan skickar vidare till vyn då eller (låter helknasigt)?

Han menar nog att kontrollern hämtar den data som behövs och passar den vidare till vyn, där man alltså "bara" har presentationslogik.

Visa signatur

Brass knuckles and a 2x4

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av jonasc
Han menar nog att kontrollern hämtar den data som behövs och passar den vidare till vyn, där man alltså "bara" har presentationslogik.

Precis.

När jag tänker efter så når man för det mesta modellen direkt från vyn också, men tycker det är snyggare att hämta den i kontrollern och skicka upp till vyn därifrån.
Förutsatt att man inte behöver loopa två gånger för att hämta all data, då.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
Vanligaste implementationen är att vyn inte känner till modellen överhuvudtaget, kontrollern tar helt hand om kommunikationen mellan vy och modell, de känner aldrig till varandra.

Tycker denna variant är snygg då det separerar datalogik och visning ganska bra, bara i kontrollern som de samlas litegrann, men inte så mycket.

MVC handlar ju i grunden om att separera programlogik (kontrollern) från data (modellen) till visning (vyn). Varje komponent ansvarar för sin del. Kontrollern skall således bara hantera användarinput, uppdatera modellen (om det behövs) och sedan välja vy. Vyn kan sedan själv ansluta till modellen om den behöver det.

Delarna är löst sammankopplade. Modellen är helt fristående, den känner inte till någon annan, men både kontrollern och vyn känner till modellen. Kontrollern känner till vyn, me vyn känner inte till kontrollern. Kontrollern väljer endast vy, den interagrerar inte med den.

Det gör att vilken vy som helst kan användas från vilken kontroller som helst. Vyn vet ju vilken data den måste ha, då är det onödigt att kontrollern skall skicka med den när vyn kan hämta den själv.

Citat:

Ursprungligen inskrivet av jonasc
Han menar nog att kontrollern hämtar den data som behövs och passar den vidare till vyn, där man alltså "bara" har presentationslogik.

Jag ser det som att vyn består av två delar, dels en del som hämtar data från modellen osv, och en template engine som renderar datan utifrånen template (templaten innehåller bara presentationslogik)

Visa signatur

Windows XP Pro SP2 x32 | Ubuntu x64 | Firefox | Adobe Photoshop CS2 | Eclipse | Starcraft Broodwar
(X)HTML | CSS | XML | PHP | Java | C++ | vim script |
Daniel Örn, Eagleorn | Google is my friend, and he will be Yours to if You ask him »