Tak więc chciałbym rozwinąć swoją myśl w poprzednim wpisie dotyczącym mvc w php, o co mi tu chodzi oraz czy temat i kategoria ma się jakoś do treści tutaj przedstawionej. Otóż uważam że tak, wzorzec mvc jak samo rozwiniecie jego skrótu nam mówi, model, widok, kontroler. Chodzi o prezentacje kodu złożoną z warstw, i połączeniem tego z sobą, dobrze wiemy że kontroler czyli nasz cały mózg operacji powinien wywoływać metody z modelu do pobierania danych z bazy danych, tak że end user nie ma że tak powiem bezpośredniego dostępu do tej że warstwy prezentacji kodu, chyba że jesteśmy na tyle upośledzeni że nie zabezpieczymy sobie katalogów i struktura naszych katalogów pozwala użytkownikowi na przeglądanie zawartości katalogów gdzie mamy poskładane nasze klasy. W różnych książkach można spotkać różnie przedstawione formy zapisu nazewnictwa plików, *.phpm itp ale nie o tym chcę pisać, ponieważ dla mnie to powinno być na tyle intuicyjne i poprawne by nam później było łatwiej się odnaleźć w utworzonej przez nas aplikacji.

Wracając do tematu, bo wydaje mi się że trochę od niego odbiegłem, chciałbym rozwinąć swoją myśl przedstawioną w poprzednim poście (czuje jakbym się powtarzał…). Pisałem o tym że użytkownicy Doctrine dostali narzędzie i ogromnej mocy do utworzenia aplikacji zorientowanej obiektowo oraz o wzorzec MVC, i w cale nie chcę się z tego wycofać a poprzeć tą tezę argumentami.

Do czego bym zachęcał? Otóż by każdy zainteresowany pobrał sobie sandbox’a doctrine z strony projektu, standardowo linki na samym dole. Sandbox jest w pewnym stopniu za nas skonfigurowany, i jeżeli nie czujemy potrzeby modyfikacji jego ustawień proponowałbym zostawić układ taki jaki jest, chociażby dla samego tego artykułu. Ja go osobiście trochę przerobiłem na wzór układu katalogów z symfony ale nie ważne jest to teraz.

Pisałem o tym że nie będziemy musieli ładować w kontrolerach modułów a same widoki (widok), tak zakładam że jeden widok dla jednego kontrolera, jeden model dla jednego kontrolera. Wychodząc z założenia DRY ( Don’t Repeat Yourself ), jedna metoda dla jednej i tej samej akcji, bo po co się powtarzać?

Nie chciałbym by ten topic zszedł do tematu konfiguracji sandboxa, dlatego o konfiguracji Doctrine w innym temacie.

A teraz jak to nam uprzyjemnia życie? A dajmy na to że mamy jakiś kontroler, np HandlerNews

class HandlerNews extends EventHandler  {
 
	private $_tpl;
	private $_handle;
	private $_lang;
 
	public function __construct($tpl,$event,$trans)	{
		$this->_tpl = $tpl;
		$this->_handle = $event;
		$this->_lang = $trans->getLanguage();
 
	}
 
	public function handledEvent($route) {
		if( $route[2] != '' && method_exists($this,$route[2]) ) {
			$this->_{$route[2]}();
		} else 
		  throw new Exception ('Brak akcji');
	}
 
	private function _show()	{
		$news = Doctrine::getTable('News')->getNews(Route::getId(), $this->_lang);
                $this->tpl->assign('news',$news);
	}
}

No i nasza metoda getNews wyglądała by mniej więcej tak (plik NewsTable.php):

class NewsTable extends Doctrine_Table
{
  public function getNews( $id, $lang ) {
    $query = $this->createQuery( 'n' )
                           ->where( 'n.id = ?', $id)
                           ->andWhere( 'n.lang = ?', $lang)
                           ->execute();
    return $query;
  }
}

Oto całe nasze mvc, mamy model, który jest organizowany za pomocą doctrine, mamy plik kontrolera który sobie pobiera z bazy danych dane, wrzuca je do templatki no i jakoś tam musimy wykombinować żeby jeszcze templatke wczytywać, ale to już inna kwestia.

No więc jak widać implementacja takiego wzorca MVC nie jest trudna, i nie uprzykrzajcie sobie ludzie życia wymyślając nie wiadomo co, nie wiadomo jak złożone struktury katalogów jak to jest proste jak budowa cepa ;)

Ja wiem że równie dobrze możemy sobie utworzyć klasę w której będziemy mieli standardowe zapytania do bazy danych np na PDO, z zwykłą składnią SQL’ową. Nikt nie broni, a nawet dlaczego nie? np:

class NewsModel extends Model {
 
  public function __construct () {
    parent::__construct();  
  }
 
  public function getNews ( $id ) {
    $query = $pdo->prepare( 'SELECT * FROM news WHERE id = :id' );
    $query->bindParam( ':id', $id, PDO::PARAM_INT);
    return $query->execute();
  }
}

Dlaczego wybrałem Doctrine zamiast właśnie w ten sposób pisać osobne klasy jako modele z standardową składnią SQL? Bo tak mi jest wygodniej, oraz dla mnie bezpieczniej. Wasz wybór jaką drogę obierzecie, tylko nie modźcie z tym wzorcem… Bo widziałem różne implementację MVC i nie które to mnie po prostu przerażają, tak jak Zyx napisał, prosty wzorzec, ale nie dla wszystkich.