Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC - kontoler
Forum PHP.pl > Forum > PHP > Object-oriented programming
Black-Berry
W systemie MVC tylko modele powinny być obietami - do takich wniosków doszedłem. Czy słusznie ?
nospor
skad taki wniosek?
Mephistofeles
Nie, nie słusznie. Zazwyczaj w MVC wszystko jest oparte na klasach, popatrz choćby na Zend Framework.
Black-Berry
Modele bardzo łatwo przedstawić za pomocą obiuektów dlatego świetnie się do tego nadają.
Widoki to poprostu powinny być pliki .phtm dlatego z obiektowośćią nie mogą mieć nic wspólnego.
Próby opakowania kontrolera w obiekt są wymuszone.

Przykłąd:
Klient zleca nam dobudowanie kalendarza w storpce strony. Kalendarz powinien się pokazywać w parzyste dni miesiąca, przy czym dla każdej wersji językowej musi mieć inny szablon kolorystyczny.

Rozwiązanie:
Jeden z modeli to komponent "kalendarz". Łatwo stworzyć obiekt Calendar- jest to naturalne.
Widok to plik .phtml który wykorzystuje dane z modelu np "BlueCalendar.phtml".
Kontroler powinien zająć się sprawdzaniem czy dziń jest parzysty, no i dla wersji jezykowej ładować odpowiedni szablon.

Moje pytanie:
Dlaczego miałbym pakować kontroler w obiekt? Czy nie wydaje się wam to wymuszone skoto kontroler to tak naprawdę tylko "switch"? Taki switch o nazwie "CalendarController.php" Powinien być poprostu includowany gdzieś na stronie.
bim2
nie tylko switch. Aplikacja wybiera kontroler, a kontroler wybiera jakie skladniki bedą mu potrzebne. Pomysl ze chcesz zrobić dodawanie użytkownika i w nim wybór grupy z bazy danych

  1. <?php
  2. class Controller {
  3. publuic function adduserForm()
  4. {
  5. $oCal = $this->modelGroup('getAllGroups');
  6. $this->viewUser('addUser', $oCal);
  7. }
  8. }
  9. ?>

:]
NuLL
Cytat
Dlaczego miałbym pakować kontroler w obiekt? Czy nie wydaje się wam to wymuszone skoto kontroler to tak naprawdę tylko "switch" ?

Dzis pierwszy kwietnia ? blinksmiley.gif
bim2
NuLL, piątek trzynastego, dlatego takie pechowe myslenie smile.gif
Black-Berry
  1. <?php
  2. switch ($_GET['form']) {
  3.   case 'add_user':
  4.          $data = $user->authorization->getUserGrouops();
  5.          include 'Forms/AddUserForm.phtml';
  6.          $data = null;
  7.       break;
  8. }
  9. ?>
Kocurro
To ja może taką złotą myśl co usłyszałem niedawno od człowieka, który zajmuje się tworzeniem bardzo rozbudowanych aplikacji:

Łączenie kodu obiektowego i strukturalnego jest jak zabawa z plastikową lalką - do pewnego wieku (poziomu doświadczenia) to rzecz normalna, potem zaczyna to być chore i zboczone.

Rzecz w tym, że z czasem liczy się przede wszystkim prędkość rozwoju aplikacji i jej utrzymania (sprzęt zawsze można dokupić - jest on tańszy niż praca profesjonalisty), a programowanie obiektowe potrafi znacznie przyśpieszyć tworzenie aplikacji (kod strukturalny jest ciężki w utrzymaniu kiedy się rozrośnie). Dlatego też warto ograniczać ilość kodu strukturalnego do niezbędnego minimum.


---- edit ----

Wiesz Black-Berry, kod który podałeś wydaje się brzydszy i mnie czytelny niż gdybyś go zawarł obiektowo w klasie.
Black-Berry
Tak, tylko zwróć uwagę że w przypadku Web Developerki nie robi się 1 duzego projektu ale raczej dużo małych i czesto. Jeśli struktury obiektowe są ze sobą sztywno powiązane to za rok kiedy zadzwonią do Ciebie i każdą dodać jakiś plugin to może się okazać że przez ten sztywny projekt dodałeś sobie zbędnej pracy.

Cytat(Kocurro @ 13.03.2009, 10:56:47 ) *
Wiesz Black-Berry, kod który podałeś wydaje się brzydszy i mnie czytelny niż gdybyś go zawarł obiektowo w klasie.

Ale zgodzisz się chyba że kontrolery działają strukturalnie? Zwykłe przełaczniki. Dla mnie brzydkie wydaje się ukrywanie tego.
bim2
black-Berry teraz żeby skontrolować np. uruchamiane akcje musisz dopisać np. kolejną zmienną.

Skąd masz zmienną $user? Ja metodą call, pobieram co wywolac, odczytuje jaki model/widok i jaką metodę. Mam łatwy dostep do bazy danych dziedzicząc z Syd_Application_Action (u mnie nazywa sie to action), gdzie ustawione są wszystkie motedy
  1. <?php
  2. class Action_User extends Syd_Application_Action
  3. {
  4. public function addUserForm()
  5. {
  6. $sLink = $this->url('Article/view?name=FAQ'); //stworzy urla <a href=\"http://site.com/doc/faq/\" target=\"_blank\">http://site.com/doc/faq/</a>
  7. $this->oDb->Update();
  8. $this->oDb->Insert();
  9. $this->oDb->getRow();
  10. $this->oDb->getAll(); // caly dostpe do bazy
  11.  
  12. if($this->getIsset('test'))
  13. {
  14. echo $this->getString('test');
  15. }
  16.  
  17. $int = $this->getInt('id');
  18.  
  19. $this->forward('Index'); //header location
  20.  
  21. if($this->check())
  22. {
  23. echo formularz napisany poprawnie; // a w viewie <input error="noempty" type="text" name="test" />
  24. }
  25. }
  26. }
  27. ?>

Teraz przenieś to do swoich switchów smile.gif

EDIT:
Tak wiem, model ma dostep do Db, ale ja rozdzielilem Update, Insert do akcji a pobieranie do Modelu. Najwazniejsze to $this->check(); oraz getInts/String itd. ;]
Kocurro
Programuję w PHP'ie od 2003 roku, jeden projekt do dziś dnia u klienta aktualizuję. Błędem było napisanie go strukturalnie bo rozbudowa jego byłaby o wiele prostsza jakby był obiektowo napisany (fakt, że wtedy obiektowość w PHP kulała).

Dziś nie piszę dużo małych projektów, za to mam na utrzymaniu cztery duże i to mi wystarczy by żyć na odpowiednim poziomie i mieć sporo czasu dla siebie.

--- edit ----

Jeśli dla Ciebie kontroler to zwykły przełącznik to znaczy, że w ogóle nie potrzebujesz obiektów do niczego. U mnie kontroler robi bardzo dużo, i zapisanie tego strukturalnie było masochizmem zamierzonym
Black-Berry
Cytat(Kocurro @ 13.03.2009, 11:04:03 ) *
Jeśli dla Ciebie kontroler to zwykły przełącznik to znaczy, że w ogóle nie potrzebujesz obiektów do niczego. U mnie kontroler robi bardzo dużo, i zapisanie tego strukturalnie było masochizmem zamierzonym

Dążę do tego żeby kontroler robił jak najmniej - żeby był tą częścią aplikacji której nie da się upakować w żaden poziom abstrakcji.

@bim2 Masz chyba podobne podejście do Kocurro. Kontrolery robią u Ciebie dużo. W moim przypadku dodawaniem np usera zajmuje się model - $user->manager->addAccout($args). Nie bardzo rozumiem przykąłd jaki podałeś. Dlaczego metoda addUserForm() miałaby tworzyć url do FAQ? Jeśli formularz miałby mieć w stopce link do FAQ to moim zdaniem powinno być to zawarte w widoku. Nie wydaje mi się też aby musiały istnieć procedury generujące linki. Próbuję tak ustawić .htaccess'a aby było to zbędne.
LBO
@Black-Berry, ja Ciebie tego nie uczyłem smile.gif Skąd ty wyciągnąłeś takie brednie.
Czemu uważasz, że np. widok nie powinien być obiektem? Przecież widok też posiada swoją wewnętrzną logikę, której w funkcje nie opakujesz... musi być obiekt. Spójrz chociażby na agavi, którzy obiektowść widoku bardzo uwypuklili: Creating Actions and Views

Nie powinieneś również mylić szablonów z widokiem. To dwie różne rzeczy. Widok korzysta z szablonów i zależnie jaki to widok, to jako szablony możesz użyć plików PHP, Smarty, XSLT etc.

@kocurro, wbrew pozorom kontroler dużo robić nie powinien. Istnieje taka zasada
Kod
skinny controller, fat model

Kontroler nie znajduje się w tzw warstwie dziedziny (domain layer) i odpowiada raczej, za workflow aplikacji.

Pozdrawiam
Kocurro
LBO: A co według Ciebie jest dużo ?

Uwierzytelniania, autoryzacja, routing, ładowanie modułów, obsługa błędów, obsługa wywołania akcji, obsługa łańcucha wywołań, obsługa cache'u jeśli jest używany - to jest mało ? To są zadania kontrolera (chociaż fakt niektóre są dzielone z modelami ale to głównie kontroler musi robić).

To jest workflow aplikacji. O ile uwierzytelnianie i autoryzacji częściowo przeniesiona może być do modelu to jednak nie w całości.

Dla mnie to jest właśnie bardzo dużo roboty. Fakt jeśli wziąć w garść wszystkie modele to one wykonują o wiele więcej roboty, jeśli jeszcze dołożyć do tego widoki to okazuje się, że faktycznie kontroler robi mniej niż procent. Ale czasem dwa promile mogą przesądzić o wszystkim.

I jak chcesz to wszystko zapisać na switchach ? Bo dla mnie zapisanie tych wszystkich rzeczy, zależności tylko i wyłącznie na switchach byłoby masochizmem.

pozdr.
Łukasz
Mephistofeles
Na switchach można oprzeć projekt gdy jest mały, a poszczególne kontrolery nie są ze sobą ściśle powiązane. Sam tak robiłem, szło nieźle, ale przekonała mnie łatwość modyfikacji kodu opartego na kontrolerze obiektowym i akcjach w jego metodach, bo nie musiałem dla każdego kontrolera dodawać oddzielnych linijek kodu w switchu, a w samym kontrolerze wybierać odpowiedniej akcji, a teraz zaczynam powoli wykorzystywać inne możliwości takiego kodu smile.gif.
LBO
Może trochę inaczej.
Powszechnie za nazwa "kontroler" zamiennie używana jest z "akcją" i taką nomenklaturę przyjąłem.
Zgadzam się z tym co napisałeś, kontroler posiada pewne obowiązki, które spełniać musi (ale nie wszystkie, które wymieniłeś. O tym za chwilę). Zasada, która podałem odnosi się bardziej do operacji biznesowych, które niekiedy w całości przenoszone są do kontrolera/akcji (wystarczy przejrzeć nawet kilka postów na forum dot. ZF biggrin.gif).

Co do deto co napisałeś o uwierzytelnianiu, cache'u routingu - nie są one częścią kontrolera. Poczytaj o wzorcu Intercepting Filter lub nawet obejrzyj, chociażby w sf, albo Agavi (w Agavi implementacja jest dużo lepsza IMHO).

Pozdrawiam

P.S. Ja o żadnym switchu nie pisałem smile.gif wogóle się do Tego nie odnosiłem, bo jest śmieszne smile.gif
Black-Berry
Dzięki za wszystkie posty. Przynjamniej moje intuicyjne założenie żeby maksymalnie ograniczyć kontolery było słuszne. Nie opakowuję ich w obiekty tylko inkludowane pliki bo jest szybciej. Dzieki temu nie musze przekazywać kontekstu, pobierać go, bawić się w opakowywanie metod.

@LBO Faktycznie chyba źle rozróżniam widok od szablonu dzięki za naprostowanie.
LBO
Nadal uważam, że źle robisz.... zobaczymy jak dojdziesz do takiego etapu kariery, że będziesz musiał testować kod smile.gif
Black-Berry
Może masz rację ale bez eksperymentów nei ma postępu biggrin.gif... Liczę na to że kontrolery okroję do max 10 małych plików a wtedy może nie będzie tak źle. Obecnie mam:

RoutingController.php
PostController.php
ActionController.php
BodyController.php

Zawierają tylko switche. Z tego co zauważyłem nie zapowiada się aby było ich potrzebnych wiele więcej. Reszta to modele.
nospor
Cytat
ale bez eksperymentów nei ma postępu
nie myl eksperymetów z wymyslaniem koła na nowo.... tongue.gif
MWL
moim zdaniem controller powienien być klasą, wtedy jest łatwiej wszystkim zarządzać, mamy moduły, które mają odpowiednie akcje i wykonują odpowiednie zadania, mamy możliwość dekoracji, o stale wykonujące się zadania itp.
Black-Berry
Cytat(nospor @ 13.03.2009, 13:55:05 ) *
nie myl eksperymetów z wymyslaniem koła na nowo.... tongue.gif

No i to jest dobry cytat bo bywa tak że kontorlery pasują do obiektów jak koło od karocy do bolidu F1 biggrin.gif Zależy od frameworka.... Zrestą sam już nie wiem. Może poprostu mam mniejszą aplikację i dlatego nie mogę tego wepchnąć w klasy. Rozrośnie się albo nie sprawdzi to zmienię.

Rozumiem że nikt się nie zgadza z moją tezą smile.gif ?
MWL
nikt tongue.gif
Black-Berry
Cytat(MWL @ 13.03.2009, 14:06:02 ) *
nikt tongue.gif

I to mnie właśnie dziwnie zastanawia. Zazwyczaj było tak że jak się ktoś ze mną nie zgadzał na Forum to wiedziałem że może mieć rację bo mój kod był do bani i nie działał za dobrze. Tym razem jednak wszystko działa bardzo dobrze dlatego coś jest nie tak jak powinno:D Pewnie okaże się że za pół roku przyjdzie mi pisać wszysko od nowa...

Ale nie ma źle. Zostaną mi chociaż modele smile.gif

Dzieki za wszystkie posty i pozdrawiam.
mike
Cytat(MWL @ 13.03.2009, 14:06:02 ) *
nikt tongue.gif
Potwierdzam. Podejście do bani.
Kod nie musi się wywalać żeby był do bani. Działające rzeczy też potrafią być do bani.
MWL
życie jest do bani, o tym zapomniałeś haha.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.