MVC vs Templates

0

Cześć wszystkim,
znów piszę, ponieważ w trakcie nauki MVC doszedłem do wniosku, że prawie identycznie to u mnie działa. Działanie MVC rozumiem tak:

  1. Wchodzę na jakąś podstronę (lub stronę główną) i kontroler po pierwsze wyszukuje modelu (o ile taki istnieje) oraz przesyła do modelu parametry.
  2. Model na podstawie tych parametrów coś tam wykonuje i przesyła do kontrolera kolejną tablicę parametrów
  3. Kontroler przesyła tę tablicę parametrów do widoku, który wyświetla stronę.

Mój kod bez stosowania MVC działa tak:

  1. W pliku index.php sprawdzam czy istnieje plik z kodem.
  2. Jak istnieje to wykonuje jego zawartość i w wyniku otrzymuję tablicę parametrów
  3. Tę tablicę przekazuję do klasy odpowiedzialnej za wyświetlanie (template)

Poglądowy kod:

(file_exists($nazwa)) ? include($nazwa) : include('main.php');
$template->set_array($global_array);
$template->display($nazwa_ta_sama__co_powyzej);

$global_array jest to tablica zwracana przez plik $nazwa

Jako, że dla mnie jest to działanie prawie identyczne to proponuję takie rozwiązanie:

  1. (ważne) podczepiam ścieżki do wszystkich podfolderów (które używam)
  2. tworzę plik router, który sprawdza istnienie pliku i przesyła do niego parametry w postaci tablicy
  3. Wykonuję wszystko co trzeba i przesyłam wynik do kontrolera
  4. Wyświetlam wszystko przy pomocy szablonów (klasa template)

Jak dla mnie będzie to MVC - no chyba że się mylę. Jakie inne funkcje jeszcze ma pełnić MVC?

0

pierwsza linijka to potencjalna dziura - szczególnie, jeżeli $nazwa pochodzi od użytkownika i jej nie filtrujesz. lepiej zrobić tablicę znanych wartości niż includować na podstawie file_exists
globale to zło. czasem upraszczają, ale generalnie zło. kontroler niech posiada jakieś atrybuty, które będą Ci przechowywać dane do templatek.

0

Masz rację z tą dziura :D Ale zabezpieczenia mam porobione i wiadomo porobię teraz w klasach. A co do globalnej zmiennej to trochę przesadziłem z nazewnictwem, ponieważ wygląda to tak (poglądowo):

index.php

include(jakis_plik) // w tym pliku tworzę zmienną $globa_array;
$template->set_array($globa_array);
$template->display();

Czyli jest to zmienna z includowanego pliku.

0

No i zapomniałem napisać o najważniejszym:
Czy moja wizja MVC jest poprawna?

0

Brzmi dobrze, ale ja tak naprawdę nie zagłębiam się w to, czy mój kod jest na 1000% MVC i czy wszystko jest zrobione najidealniej jak można, bo ... nigdy nie będzie. Zawsze znajdzie się lepsze rozwiązanie w trakcie nauki ;)

Z tą tablicą z danymi - ja jednak wolałbym wszelkie zmienne ustawiać w tym includowanym pliku, ponieważ aktualnie kod wygląda tak:

// jakiś tam wstępny kod
// includowanie jakiegoś pliku i to jeszcze różnego pliku, zależnego od zmiennej
// używanie [set_array()] zmiennej "z d.. wziętej" (my wiemy, że jest utworzona w includowanym pliku, ale pomyśl jak to wygląda ogólnie)
// coś tam dalej

Ja osobiście robię tak:

// magia, mająca na celu zdecydowanie który plik includować
// includowanie, includowany plik sam przypisuje do templatek dane, a kontrolerowi tylko ostatecznie zwraca decyzję który plik templatek mnie interesuje
// kontroler czyta, którą templatkę ładować i ją ładuje

Nie wiem, może to nie jest 100% MVC, ale wydaje mi się logiczniejsze i czytelniejsze.

0

ok, dzięki ;P

0

Ja podpatrzyłem sobie MVC w CakePHP. Za wszystkie includy, wywoływanie Akcji conrtollera, wyświetlanie odpowiada mi plik bootstrap.php. Ładuje tam Jedną jedyną klase widoku do której przekazuje nazwe akcji i controller. Ta klasa natomiast sama juz includuje pliki odpowiedzialne za widok. Dla przykładu Controller -> Post akcja->index czyli bootsrap wykonuje cos takiego

$controller = new $controller_name(); // W tym przypadku mamy Post
$controller->$action(); // Tutaj natomiast mamy index
//jakieś operacje

$view = new $View($controller_name,$action); // ładowanie widoku

następnie klasa View ma coś takiego

function __construct($controller,$action){
     require 'Views/'.$controller.'/'.$action.'.php'; // ładowanie widoku ;)
}

Robie folder Views w którym tworze dla przykładu Controllera Post folder Post/. Następnie tam umieszczam pliki z widokiem które muszą mieć taką samą nazwe jak akcja która jest wykonywana. czyli analogicznie do akcji index plik musi być index.php.

@PS. Troszke odkop ale może się przydać ;)

0
  1. Wchodzę na jakąś podstronę (lub stronę główną) i kontroler po pierwsze wyszukuje modelu (o ile taki istnieje) oraz przesyła do modelu parametry.
  2. Model na podstawie tych parametrów coś tam wykonuje i przesyła do kontrolera kolejną tablicę parametrów
  3. Kontroler przesyła tę tablicę parametrów do widoku, który wyświetla stronę.

Oj, nie.

Kontroler to jest takie coś, co łączy model i widok. Tam pobierasz dane z Modeli, jakoś je przetwarzasz , i wysyłasz do widoku

Model to takie coś, co wykorzystuje kontroler. W modelu przechowujesz metody, które mogą być używane w innych kontrolerach (np. dodawanie wpisow do bazy, pobieranie danych itp)

Widok - czyli jak kontroler pobrał dane z Modelu, i jakoś je przetworzył, to wysyła wyniki do Widoku - widok już zajmuje się renderowaniem danych

0

Bordeux tworze sobie tablice np $passedArgs; do której przy pomocy funkcji set przypisuje parametry. bootstrap po wykonaniu wszystkich operacji kontrollera przekazuje tą tablice do Wikodu gdzie ona Extractuje wszystko do zmiennych i mam dane ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1