Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MVC - kontoler
Black-Berry
post
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


W systemie MVC tylko modele powinny być obietami - do takich wniosków doszedłem. Czy słusznie ?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




skad taki wniosek?
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #3





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Nie, nie słusznie. Zazwyczaj w MVC wszystko jest oparte na klasach, popatrz choćby na Zend Framework.
Go to the top of the page
+Quote Post
Black-Berry
post
Post #4





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 13.03.2009, 10:49:08
Go to the top of the page
+Quote Post
bim2
post
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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. ?>

:]
Go to the top of the page
+Quote Post
NuLL
post
Post #6





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


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 ? (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
bim2
post
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


NuLL, piątek trzynastego, dlatego takie pechowe myslenie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Black-Berry
post
Post #8





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  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. ?>


Ten post edytował Black-Berry 13.03.2009, 10:56:57
Go to the top of the page
+Quote Post
Kocurro
post
Post #9





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Kocurro 13.03.2009, 10:57:54
Go to the top of the page
+Quote Post
Black-Berry
post
Post #10





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 13.03.2009, 11:04:35
Go to the top of the page
+Quote Post
bim2
post
Post #11





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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. ;]

Ten post edytował bim2 13.03.2009, 11:05:03
Go to the top of the page
+Quote Post
Kocurro
post
Post #12





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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

Ten post edytował Kocurro 13.03.2009, 11:06:02
Go to the top of the page
+Quote Post
Black-Berry
post
Post #13





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Black-Berry 13.03.2009, 11:21:13
Go to the top of the page
+Quote Post
LBO
post
Post #14





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@Black-Berry, ja Ciebie tego nie uczyłem (IMG:http://forum.php.pl/style_emoticons/default/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

Ten post edytował LBO 13.03.2009, 11:58:37
Go to the top of the page
+Quote Post
Kocurro
post
Post #15





Grupa: Zarejestrowani
Postów: 461
Pomógł: 32
Dołączył: 17.09.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #16





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
LBO
post
Post #17





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) wogóle się do Tego nie odnosiłem, bo jest śmieszne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Black-Berry
post
Post #18





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
LBO
post
Post #19





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Nadal uważam, że źle robisz.... zobaczymy jak dojdziesz do takiego etapu kariery, że będziesz musiał testować kod (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Black-Berry
post
Post #20





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Może masz rację ale bez eksperymentów nei ma postępu (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 04:58