Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MVC-arkkitehtuurista

Sivun loppuun

p99o [11.12.2014 23:47:58]

#

Olen tässä yrittänyt muutamia kertoja sisäistää MVC-arkkitehtuurin perusideaa (php:n tasolla), mutta idea ei ole ehkä vieläkään auennut.

> Onko ideana luoda näkymä, jonka sisältö käsitellään controllerissa, joka puolesstaan keskustelee modeli[e]n kanssa?

V <--> C <--> M

Voiko Model olla siis iso joukko muita yleisesti käytössä olevia luokkia/muita tiedostoja (esim. userClass.php, joka vain hakee tietoa kannasta, ei sen kummempaa toiminnallisuutta). Vai onko model vain 1 tiedosto?

Controller puolestaan olisi näkymää rakentava tiedosto/luokka, joka keskustelee molempien kanssa ("luo toiminnan").

Jos oletamme, että olemme profiili-näkymässä, kutsumme siis controllerin metodia:

haeTiedot($profiilin_id) {
    // hakee käyttäjän tiedot userClass:n avulla
    // ...
    // hae käyttäjän valokuvat käyttäen blahBlahBlahClass:ia
    // ...
    // hakee jotain muuta jonkin muun luokan avulla
    // ...
}

Toivottavasti ymmärsitte.

Synomi [12.12.2014 08:50:37]

#

Näkymät yleisesti voi tarvittaessa koostua pelkästä HTML:stä. Joten erillistä PHP:tä sinne ei pitäisi tarvita. Tietoja ei välttämättä tarvitse hakea näkymällä, koska ne on kontrollissa jo haettu valmiiksi näkymää varten. Näkymässä siis on suurinpiirtein valmis data valmiina, joka on muodostettu kontrollerissa. Se pitää vain jäsennellä näkymään oikein.
Kontrollerissa ei kumminkaan muodosteta suoraa HTMLlää, vaan sieltä tuodaan data muuttujat näkymään. Näkymässä sitten looppailaan dataa ja luodaan taulukkoja jne.

Kontrolleri:

public function etusivu()
{
  $loggedUserNames = User::model->getLoggedInUserNames();
  $news = News::model()->getRecentNews();
  $this->render('etusivu',array('loggedUserNames' => $loggedUserNames, 'news' => $news));
}

Näkymä etusivu.php:

<h1>Etusivu</h2>
<h2>Uutiset</h2>
<?php
foreach($news as $newsHeading)
echo '<a href="'.$newsHeading->getUrl().'">' $newsHeading->getTitle() . '</a><br />';
?>
<h2>Kirjautuneet käyttäjät:</h2>
<p><?php echo implode(', ', $loggedUserNames)?></p>

Tässä esimerkissä malleilla on myös staattisia metodeita. Kun kontrolleri saa etusivun nouto pyynnön hakee se uutiset ja käyttäjätiedot niitä vastaavista malleista ja vie haetut tiedot näkymälle renderin kautta. Näkymä käy läpi sille tuodut tiedot. News::model()->getRecentNews() palauttaa n määrän taulukossa News-malleja ja User::model->getLoggedInUserNames() palauttaa merkkijonotaulukon.

feenix [12.12.2014 08:51:31]

#

Minusta on väärin lähteä miettimään minkään arkkitehtuurin ideaa minkään kielen tai toteutuksen tasolla, tai onko se yksi vai monta tiedostoa. Noilla ei ole mitään merkitystä itse mallin suhteen, voihan joku vääntää vaikka jokaisen metodin omaan tiedostoonsa, tai änkeä kaiken koodin yhteen. Sillä ei ole mitään väliä (mallin suhteen, toki kumpikin noista on rumaa muuten).

p99o [13.12.2014 00:58:47]

#

Jos oikein ymmärsin niin olen oikeilla jäljillä

vesikuusi [15.12.2014 20:03:07]

#

Opettelemalla käyttämään jotakin MVC-frameworkkia (oikein) saat varmasti hyvän ymmärryksen. Olet varmaan lukenut putkan oppaan aiheesta?

p99o [15.12.2014 21:48:33]

#

Luin kyllä, mutta ei se kovin laajaa kuvaa mielestäni antanut.

groovyb [16.12.2014 12:50:57]

#

Vaihtoehtoisesti voit alkaa opettelemaan esim. Ruby on railsiä, joka toimii puhtaasti mvc:n päällä, fiksatulla patternilla.

The Alchemist [16.12.2014 17:28:25]

#

Jos vaihtoehtoina on opetella 1) uusi framework tai 2) uusi kieli sekä uusi framework, niin saattaisin ehkä silti kallistua ykköseen ilman muita tarpeita kielen vaihtamiseen.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta