Budowa prostego MVC w PHP (>5.3), cz. 1 – wprowadzenie do tematu

Killavus dnia Luty 14, 2011

MVC (Model-View-Controller) to jeden z najbardziej rozpowszechnionych wzorców projektowych wykorzystywanych przy projektowaniu front-endów aplikacji sieciowych. Jego niewątpliwą zaletą jest fakt, że możemy rozdzielić 3 najważniejsze „części” programu – prezentację, pobieranie danych, oraz manipulowanie nimi. Staje się to przydatne najbardziej, gdy nad projektem pracuje kilka(naście) osób – graficy nie potrzebują zaawansowanej wiedzy programistycznej, by wyświetlać treść w swoich projektach, specjaliści od bezpieczeństwa nie muszą zajmować się wewnętrznymi szczegółami dotyczącymi pobierania danych, gdyż nieistotne jest dla nich, czy pochodzą one z pliku, bazy danych czy jeszcze innego źródła, zaś programiści mogą przygotować metody zbierania danych, zachowując przy tym taki sam interfejs niezależnie od ich źródła. Ponadto szukanie błędów w takiej aplikacji jest prostsze – dzięki rozdzieleniu warstw możemy szybko i sprawnie wyszukać która część odpowiada za problem i wydelegować do jego rozwiązania odpowiedni sztab ludzi.

Mimo tego, że napisanie aplikacji w oparciu o ten model wydaje się skomplikowane, wcale takie nie jest. Wystarczy wiedza z zakresu obiektowo-orientowanego programowania w dowolnym języku (my wybierzemy PHP) i trochę cierpliwości. W tym artykule postaram się odpowiedzieć na pytanie, jak stworzyć pierwszą część takiego wzorca – Model danych. Opowiem też o tym, za co odpowiada która część i dlaczego kod, który napiszemy nie działa na 90% polskich hostingów. Zatem do dzieła!


Model… View… Controller? O co w tym wszystkim chodzi?

Być może dziwne nazwy, które zawarte są w nazwie tego wzorca mogą odstraszać, ale nie jest to wcale trudna rzecz.  Przedstawię tutaj pomocniczy schemat, który na przykładzie bloga przybliży Wam, w czym rzecz.

Schemat działania MVC

Myślę, że powyższy schemat dość dobrze pokazuje, o co w tym wszystkim chodzi. Zapytanie przekazywane jest do kontrolera, kontroler przetwarza je,  pobierając z modeli te dane, które są mu potrzebne (być może nie tylko dane wpisu – może też dane autora, komentarzy itp.) i przekazuje wykonywanie dalej, do widoku (view).

Dla tych, do których przemawia jedynie kod, przedstawiam mały, poglądowy kod jak mogłoby to wyglądać (pomijam tutaj model):

Kontroler:

<?php
class PostController extends ControllerHandler {
	// ...
	public function view( $id ) {
		$post = new Post($id);
		if( !$post ) { // wpis o tym ID nie istnieje.
			$this->error('404');
			return;
		}
 
		$this->viewVars['post-content'] = $post->content; // Potrzebujemy tresc wpisu
		$this->render(); // Przekazujemy wykonanie do widoku.
	}
	// ...
}
?>

Widok:

<h1>Wpis na blogu:</h1>
<?php echo $v['post-content']; ?>

Jak widzimy, pobieranie danych i ich walidacja (przykładem jest tutaj wywalenie błędu, gdy nie ma wpisu o ID 12 jest realizowane w kontrolerze, zaś widok zajmuje się tylko wyświetleniem danych na ekran.

Szczegóły implementacyjne

Wiemy już, jak to powinno działać. Pozostaje pytanie – jak to zaimplementować? W następnych częściach naszego artykułu przejdziemy do konkretów, implementując każdy szczegół z osobna.

Do napisania!

Zostaw komentarz

Wymagany.

Wymagany. Nie będzie publikowany.

Jeżeli ją posiadasz.