Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MVC - malli ja olio-ohjelmointi -harjoittelua

Quirzo [23.11.2014 22:32:13]

#

Terve, tässä olen harjoitellut olio-ohjelmoinnin perusteita ja koitan itse harjoitusmielessä tehdä sivustoa, jossa pohjalla olisi MVC - mallin mukainen luokista koostuva sivusto.

Tietoa olen yhdistellyt eri lähteistä ympäri nettiä, nytpä ajattelin vielä ammattilaisilta kysellä vinkkejä. Pohjaa olen opetellut yllättävän hyvänoloisen videotutoriaalin avulla (http://www.youtube.com/watch?v=OsCTzGASImQ).

Teen koemielessä simppeliä sivua, jonne voi lisätä, poistaa ja selata autoja. Onko ajatusmaailma oikea, kun olen rakennellut sitä seuraavalta pohjalta:

1) Ohjain määritetään urlissa, tyyliin localhost/autot/listaa, joka siis valitsee autot -ohjaimen ja listaa -metodin.

2) Ohjaimessa määritetään, mitä tehdään kun toimintona on esim. "listaa". Tällöin katsotaan että missä muodossa tiedot halutaan ja haetaan tiedot mallilta (Model) ja sitten luodaan näkymä (View) view->render -funktiolla.

//Controller
class Autot extends Controller {
	protected $autoModel;

	public function __construct() {
		parent::__construct();
		$this->autoModel = $this->model('automodel');

		$this->view = new View();
		$this->view->setUser($this->user);
		$this->view->set('linkit', array("Etusivu" => "autot/index", "Listaa" => "autot/listaa", "Lisää" => "autot/lisaa"));
	}

	//Etusivu
	public function index($name = '') {
		$this->view->render('autot/index');
	}

	//Listaa
	public function listaa($args = '') {
		if ($args == "json") {
			$json = new View();
			$json->renderData($this->autoModel->listaaKaikki('json'));
		}

		$this->view->set('autoLista', $this->autoModel->listaaKaikki());
		$this->view->set('autoLista_json', $this->autoModel->listaaKaikki('json'));
		$this->view->render('autot/listaa');
	}
}

Mallissa taas on kaikki tietokanta yms. käsittelyt:

class AutoModel extends Model {

	private $auto = "";

	public function __construct() {
		parent::__construct();
	}

	public function listaaKaikki($type = '') {
		$sql = "SELECT * FROM autot;";

		$this->_setSql($sql);
		$tulokset['aaData'] = $this->getAll();
		if (empty($tulokset)) return false;

		switch ($type) {
			case '':
				return $tulokset;
				break;
			case 'json':
				return json_encode($tulokset);
				break;
		}
	}
}

Näkymässä sitten muutetaan lopuksi $pageDatan:n sisältö muuttujiksi, jotta voi template -tiedostossa käyttää helposti.

class View {
	//Data, joka menee templatelle. Defaultteja voi esittää
	protected $pageData = array("html_title" => "Oletusotsikko");
	protected $userData = array();

	//Template - tiedosto
	protected $filename = "";

	//Tämän ansiosta voi käyttää $this->muuttuja (= $pageData['muuttuja'])
	public function __get($key) {
		if (array_key_exists($key, $this->pageData)) {
			return $this->pageData[$key];
		}
	}

	//Muuttujan asetus (pageData)
	public function set($key, $value) {
		$this->pageData[$key] = $value;
	}

	public function setUser($userObj) {
		$this->userData = $userObj->getUserData();
	}

	public function render($fname) {
		$this->filename = $fname;

		if (!file_exists(juuriOsoite(true) . '/app/views/' . $this->filename . '.php')) {
			throw new Exception("Template - tiedostoa " . $this->filename . " ei löydy.");
		}

		extract($this->pageData);
		extract($this->userData, EXTR_PREFIX_ALL, "u");

		//Päätiedosto. Kyseisessä tiedostossa includetaan sitten lopputemplate
		require_once juuriOsoite(true) . '/app/views/base.php';
		exit();
	}
}

Ehkä on vähän hakuammuntaa, kun ei kaikki koodi ole näkyvilläkäään. Taitaa nyttenkin olla jo liikaa. Mutta onko hyvä pohja tämmöinen, vai teenkö jotain väärin? Onko oikea tapa että ohjain hoitaa kaiken mallin ja näkymän välillä, näin ainakin olen ymmärtänyt?

Auttakaapa amatööriä.

The Alchemist [23.11.2014 22:38:21]

#

Json-enkoodaus on viewin ongelma mutta jostain syystä se on laitettu mallikerrokseen.

Perinteinen loppukaneetti: en jaksaisi itse alkaa kehitellä tällaisia systeemeitä enää tyhjästä, koska niistä tulee puutteellisia ja rajoittuneita ja lopulta purkkaa. Lähtisin rakentamaan jonkin valmiin kehysympäristön päälle. Niitä löytyy joka lähtöön ja valinta riippuu loppuviimein siitä, millaisella tyylillä haluaa koodata.

Quirzo [24.11.2014 20:43:42]

#

Elikkä view -luokassa olisi hyvä olla ihan esim renderJson() -funktio, joka hoitaisi muutoksen?

Tiedän kyllä että on olemassa valmiita kehysympäristöjä, mielestäni opin kuitenkin paljon paremmin tekemällä asiat itse kunnes ymmärrän ne. Sitten voi hyvillä mielin käyttää valmista, kun voi todeta että ymmärtää kuinka se oikein pohjimmiltaan toimii.

The Alchemist [24.11.2014 21:37:26]

#

Itse tekemällä toki saattaa (!) ymmärtää, mitä koodissa tapahtuu, mutta silloin ei vielä paljoa opi ymmärtämään sitä, miten asiat kannattaa lähtökohtaisesti tehdä. Itse olen kyllä aika hyvin oppinut myös muiden tekemien kehysten sielunelämää, koska katson usein lähdekoodia api-dokumentaation sijaan (ja sen puuttuessa).

Mvc-ohjelmointi on esimerkiksi paljon muuta kuin kolme luokkaa (model, view ja controller). RenderJson() on aivan liian spesifi funktio ollakseen View-luokassa, joten laittaisin sen jonnekin muualle. Olio-ohjelmoinnissa kannattaa pyrkiä minimaalisiin komponentteihin bloattien "perusluokkien" sijaan.

Synomi [25.11.2014 11:44:59]

#

Hyvällä pohjallahan tuo testi koodisi on. Tosiaan json-muutoksen voisi tehdä vaikka erillisen luokan avulla (esim kohteessa: /classes, /modules, /extensions tai /components) jos aattelee että siihen joskus tulisi jotain muutosta/lisätoimintoja. Toisaalta en ole itseäni pakottanut tekemään MVC-mallia siten, että palauttaisin kaiken näkymien kautta. Esim JSON:n datan palautan usein suoraa kontrollerilla tai kontrollerissa jonkin luokan avulla. Sama myös silloin kun on kyseessä ladattava tiedosto tms. Mutta normaali sivut tietty poikkeuksetta näkymien kautta.

Eihän ole myöskään kovin hyvä hakea monta kertaa samalla kyselyllä dataa tietokannassa ja toisella kerralla vaan palauttaa se eri muodossa kontrolleriin. Tietty jos tietokanta kyselyyn lisää välimuistin tai kyselyt ovat kevyitä, niin eihän se sillon juuri haittaa, mutta aina näin ei asia ole.

Samaa mieltä the alchemistin kanssa siitä, että tämmöistä ei kannate tehdä itsekseen, mutta toisaalta kyllähän se varmasti opettaa. Itse rakensin suhkot suuren sovelluksen omalla MVC:n tapasella systeemillä muutama vuosi sitten, kyllähän sitä itse vielä suhkot helpolla päivittää, mutta en lähtisi enään moiseen sen jälkeen kun Yii Frameworkkia aloin käyttämään.

Yhdessä vaiheessa jouduin myös opettelemaan jonkun muun tekemän vanhan frameworkin, jossa on muummuassa 3000 rivisiä luokkia, sen verran tuskaa se oli, että en kyllä ikinä enään itse ala tekemään nuita omia MVC-systeemeitä. Jos ikinä jonkun muun pitää opetella päivittämään koodiasi, niin sillon ainakin suosittelen menemään valmiin frameworkin puolelle.

Quirzo [25.11.2014 22:20:27]

#

Hieno kuulla että suunta on oikea! Täytyykin miettiä jos tekisi oman luokan tuolla muutokselle. Pääasia on että olen ymmärtänyt systeemin jokseenkin oikein.

Taidan nyt jatkaa opiskeluja oman sovelluksen kanssa ja mietin myöhemmin jos opettelisin jonkun frameworkin käytön. Kiitoksia kaikille. Onko muuten joku framework, mikä ehdottomasti kannattaa opetella? Vai valitsenko vain mieleisen?

Vastaus

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

Tietoa sivustosta