Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Wzorowa podstawa

Już dość dawno temu obiecałem tekst o frameworkach i wzorcach projektowych. Dziś mam odrobinę wolnego czasu, który poświęcę by spisać kilka informacji na ten temat. Może się komuś przyda?

Zacznę od wzorców projektowych*. W procesie tworzenia aplikacji (zwłaszcza internetowych, wyposażonych w interfejs i część coreową) ważne jest, by wybrać i konsekwentnie trzymać się pewnych założeń. Od najprostszych i najbardziej szczegółowych (nazywanie metod w języku angielskim, nazywanie ich w konkretny, czytelny sposób itd.) do tych najbardziej ogólnych (struktura katalogowa itd.). Na całe szczęście programowanie nie zostało wymyślone rok temu, wiele już zostało zrobione w tej dziedzinie. Wzorców projektowych nawet w PHP jest wiele, ale najlepiej (moim zdaniem) zacząć naukę poważnego projektowania od opanowania pisania w MVC.

Model-Controller-View

Wzorzec MVC nastawiony jest przede wszystkim na rozdzielenie powierzchni logicznej od tej dostępnej użytkownikowi. Dlatego utworzone na użytek wzorca zostały trzy pojęcia:

Model - czyli część aplikacji odpowiedzialna za komunikację z bazą danych.
View - czyli część aplikacji odpowiedzialna za wyświetlanie interfejsu.
Controller - czyli część aplikacji, która tak naprawdę służy do "porozumiewania" się wcześniejszych dwóch części.

Tak teoretycznie to naprawdę nie jest łatwe do wytłumaczenia. W praktyce okazuje się jednak dużo prostsze. Zacznijmy od teoretycznej struktury katalogów w aplikacji:/. ..Model ______...htaccess ______..model.class.php ..View ______...htaccess ______..view.class.php ..Controller ______...htaccess ______..controller.class.php ..index.php ...htaccess

Z góry przepraszam, za skandaliczne formatowanie... Mam nadzieję, iż widać na powyższym... e... czymś, co powinno przypominać strukturę folderów, że aplikacja składa się z trzech folderów (Model, View, Controller) 4 plików typu .htaccess, 3 klas oraz jednemu plikowi index.php. Jak wygląda działanie aplikacji? Wywołanie index.php powoduje przekazanie do kontrolera danych w tablicy POST, COOKIE oraz GET (o samym gecie za chwilę). Kontroler na podstawie tych tablic wywołuje metody klasy model.class.php, które przekazują w odpowiedzi żądane dane z powrotem do kontrolera, a na ich podstawie kontroler ładuje odpowiednie metody z klasy widoku. Konkretniej?

Index.php zawiera (domyślnie) formularz logowania. Użytkownik loguje się, dane logowania otrzymuje kontroler. Odpowiednio je obrabia (sleshuje i przeprowadza inne operacje, które wykluczą próby włamania się do aplikacji), a następnie wywołuje metodę z klasy model auth_user(). Ta metoda przyjmuje dwa argumenty (login i hasło), a następnie zwraca TRUE lub FALSE, w zależności od poprawności danych wejściowych. Odpowiedź otrzymuje kontroler i uruchamia odpowiednie metody tym razem klasy widok. Załóżmy, że dane są poprawne - kontroler przekazuje uruchamia metodę show_site() z argumentem o loginie użytkownika. Metoda jest po prostu szablonem strony, z miejscem na ów nick. O tym czym są szablony były już na dobrychprogramach artykuły.

I to cała filozofia pracy w MVC. Teoretycznie wydawać się może, że pracy zgodnie z tym wzorcem jest więcej, niż pisząc wszystko "ciągiem". Tutaj, by zobaczyć wyniki prostego zdania trzeba grzebać w trzech klasach. Zysk widoczny jest jednak najbardziej, gdy rozszerzamy naszą aplikację lub "pożyczamy" kod do innej.

CodeIgniter

Teraz kolej na framework. Framework to po prostu gotowa i w sporym stopniu uniwersalna podstawa aplikacji. A dokładniej... a dokładniej to zbiór klas, które ułatwiają nam pisanie kodu. Po frameworku spodziewać się można gotowych klas do łączenia się z bazą danych, które za nas pamiętają o odpowiednim zabezpieczeniu danych wejściowych, tworzenia ciasteczek, czy wsparcia dla "koszyków sklepowych". Wszystko to bowiem zostało już kiedyś napisane i nie trzeba wynajdować od nowa.

Sam CodeIgniter przy pierwszym spotkaniu przypominał mi Zenda. Zend z drugiej strony jest przeogromnym, rozbudowanym do granic, ale za to także wszechstronnym frameworkiem. CI natomiast jest lekki, wydajny, również wszechstronny, ale przede wszystkim - bardzo prosty w opanowaniu. Dodatkowo posiada doskonały user guide, który zawiera dokładne opisy wszystkich metod, wraz z przykładami użycia. Na stronie projektu zobaczyć można również 30 minutowy film, na którym obserwować można stworzenie prostego (prostackiego wręcz) bloga. Film ten jednak demonstruje doskonale potencjał frameworka. Trzeba jednak przyznać, że filmy są dość stare i pokazują niektóre elementy, które zostały wycofane. Cóż to jednak za problem, skoro wikipedia projektu zawiera kilkadziesiąt różnych filmów instruktażowych.

Przyszła pora na powrót do tablicy GET. Programiści projektu CI wychodzą (z bardzo słusznego moim zdaniem) założenia, ze tablica GET to zło. Dlatego sugerują by w ogóle z niej zrezygnować. W zamian proponują (dzięki mod_rewrite) ciekawy, ale nie oryginalny sposób wywoływania żądań. Polega on na tym, że elementy adresu URL przekładane są na nazwy klas (a w zasadzie to nazw plików, które zawierają klasy o tej samej nazwie) controllera oraz metod tych klasy. To może przykład:

http://example.com/blog/show_articles

Wywołanie tego adresu spowoduje uruchomienie metody show_articles z klasy blog. Oczywiście część tych parametrów może zostać domyślnie załadowana. Framework posiada parametr zawierający domyślny controller. Dlatego można tak skonfigurować (żeby nie napisać - zaprogramować) framework by wywołanie adresu:

http://example.com/

spowodowało uruchomienie klasy blog i jej metody index().

Na sam koniec podaje linka do user guide frameworka CodeIgniter. Zawiera on wiele przydatnych informacji nie tylko o samym CI, ale także mnóstw cennych informacji dla wszystkich programistów (o samym MVC, o zasadach formatowania kodu i wiele innych). O tym wszystkim poczytacie tutaj.

*Piszę o PHP, nie dla wszystkich języków jest to przekładalne, ale dla sporej części tak

PS. Wyszło mi to jakoś tak... nijak. 

Komentarze

0 nowych
FaUst   12 #1 29.09.2011 14:55

A właśnie miałem o tym pisać bo mam (nie)przyjemność tego uzywać ;)

tfl   8 #2 29.09.2011 15:09

@MrFaUst

Znaczy MVC czy CI ? Choc skoro uzywac to pewnie CI... A co Ci w nim przeszkadza, skoro to nieprzyjemnosc?

FaUst   12 #3 29.09.2011 16:32

CodeIgniter-a. A przeszkadza mi to, że w ogóle muszę go używać bo nie jestem programistą :)

  #4 29.09.2011 16:51

Code ignitor to największy z gniotów na rynku frameworków, czemu go opisujesz? Ten bubel nadal korzysta z php4 ...

Polecam przeczytać:
http://forum.php.pl/CodeIgniter_200_wydany_t168880.html

tfl   8 #5 29.09.2011 17:39

@up

Z tego watku polecam ci przeczytac cos wiecej niz 2 pierwsze posty. Zwlaszcza, ze po pierwszym twoim zdaniu wydaje mi sie, ze cala twoja wiedza o CI ogranicza sie wlasnie do tych 2 postow.

  #6 29.09.2011 17:44

Moje wiedza to przeanalizowanie kodu źródłowego 5 frameworków w tym CI. Więc wiem co mówię nazywając CI gniotem.

tfl   8 #7 29.09.2011 17:57

A swoja wiedze opieram na kilkuletnim doswiadczeniu w procesie tworzenia rozbudowanych aplikacji i na tej wiedzy opieram swoja opinie, iz CI jest frameworkiem idealnym dla tych wszystkich czesci aplikacji, ktore jeszcze warto robic w PHP.

CI z php4? W ktorym miejscu, plz?

djfoxer   18 #8 29.09.2011 18:54

ASP.NET MVC - miodzio. Polecam dla każdego. A jak jeszcze dodać do tego nHibernate, to już nam więcej do szczęścia nie jest potrzebne :)

  #9 29.09.2011 19:51

"ale najlepiej (moim zdaniem) zacząć naukę poważnego projektowania od opanowania pisania w MVC."

Naukę poważnego projektowania to najlepiej zacząć od czegoś innego niż php...

  #10 30.09.2011 07:04

Nie tylko Pan ma wieloletnie doświadczenie ;)

Co do php4 w CI wystarczy zajrzeć do klas:
class CI_FTP {
var $hostname = '';
var $username = '';
var $password = '';
Var było w php4 teraz mamy public, protected oraz private.
O pomysłach na realizację kodu dyskutować mi się nie chce bo szkoda na tego gniota czasu. Dobrym fw był ale z 4 lata temu.

JanStefan   6 #11 30.09.2011 09:11

@noBezJaj...

Długo oczekiwany framework, zrezygnował z wspierania PHP4, najstarszą wymaganą wersją jest PHP5.1.

Śmieszne, bo wyczytałem to z linka który podałeś - czytanie ze zrozumieniem się kłania, a z doświadczenia wiem, że z takim nie ma co dyskutować.

Pozdrawiam

  #12 30.09.2011 09:15

Jan - czytales wszystko czy pierwszy post tylko? kod widzisz? Jeśli tak to po co to głupie gadanie?

JanStefan   6 #13 30.09.2011 09:16

@ksi

Naukę "poważnego" (cokolwiek to oznacza) projektowania najlepiej zacząć od czegoś innego niż php. Z tym muszę się zgodzić, jest to paint. Tam wychodzą fajne wizualizacje. A rendering przebiega mega szybko. Podziwiam Paint.

Ja... od czego się nie zacznie, to zawsze na plus. Zakładając, że przed nami czeka długie życie, to dość sporo jesteśmy w stanie się nauczyć ;)

Pozdrawiam

deallas   3 #14 30.09.2011 11:08

@no(b|B)ez(j|J)aj
@JanStefan
Po części każdy z Was ma rację. CI wymaga wersji 5.1.6, ale pozostały w nim pozostałości po starej wersji frameworka wspierającej PHP4 (choćby słówko "var" o którym wspomniano). Wystarczy zobaczyć na poniższą klasę:

class CI_DB_active_record extends CI_DB_driver {

var $ar_select = array();
...

public function select($select = '*', $escape = NULL)

Najpierw korzystają z przestarzałego słówka "var" a chwilę później pojawia się "public" przy funkcji. Jak już przechodzą w pełni na PHP5 to niech przynajmniej zrobią porządek z kodem. Kolejny przykład:

class CI_DB_mysql_driver extends CI_DB {

var $dbdriver = 'mysql';
...
function db_connect()

Także w moim mniemaniu kod CI jest niechlujny oraz nienowoczesny. Brak wsparcia dla PDO, ładowarek klas (tych z prawdziwego zdarzenia -> PSR-0), nieczytelna struktura plików (przy ZF i SF to może się schować). Jak dla mnie jedyną zaletą CI jest jego "lekkość".
Osobiście polecam ZF oraz SF 2 ;)

tfl   8 #15 30.09.2011 11:30

@UP Ci wszyscy od tego var, a zwlaszcza deallas

Po pierwsze - nie wiem z ktorej wersji korzystasz, ale nie korzystasz z najnowszej.

Po drugie - zwlaszcza do nobezjaj:

lubisz linki? http://pl.php.net/manual/en/language.oop5.visibility.php

A dokladniej:
Note: The PHP 4 method of declaring a variable with the var keyword is still supported for compatibility reasons (as a synonym for the public keyword). In PHP 5 before 5.1.3, its usage would generate an E_STRICT warning.

@ksi i JanStefan:

Napisalem o projektowaniu. Projektowanie aplikacji. MVC nazywa sie wzorcem projektowym nie bez przyczyny i nie ma nic wspolnego z paintem (hhohohoo ale smiszne).

  #16 30.09.2011 15:20

"MVC nazywa sie wzorcem projektowym..."
Wzorcem architektonicznym ...

tfl   8 #17 30.09.2011 15:38

@nobezjaj

http://php.pl/Wortal/Artykuly/PHP/Architektura/Wprowadzenie-do-MVC

"MVC jest zorientowanym obiektowo wzorcem projektowym"

http://pl.wikipedia.org/wiki/Model-View-Controller

"Model-View-Controller (pol. Model-Widok-Kontroler) to architektoniczny wzorzec projektowy "

Lubisz linki, dobrze pamietam?