Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

9 Stron V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> [MVC] Pytań kilka...
Vengeance
post
Post #101





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


ee ale to w sumie jest dowolne! nie przesadzajmy ze jesli hawk powie to i to to jest to wlasnie MVC a cala reszta nie.

MVC takze nic nie mowi o akcjach przeciez! ich nawet nie musi byc.
Pozatym wzroce sa po to takze aby je naginac (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif) (czesto tak powstaja nowe wzroce) hehe ;]
Go to the top of the page
+Quote Post
hawk
post
Post #102





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Żeby wyjaśnić rozbieżności:

Diagram to nie implementacja. Jeżeli kontroler ma uruchomić po prostu widok, i nie ma żadnej modyfikacji (czyli nie potrzeba do tego specjalnej akcji), to jak to zrobić? Można sobie wyobrazić taką implementację, gdzie bezpośrednio wykonywany jest widok (np. phiend), lub taką, gdzie potrzebna jest jakaś minimalna akcja, która odpali ten widok (tak ma większość). To kwestia tego, jak sie napisze framework. Ale idea jest ta sama - nie ma żadnej modyfikacji, chcemy wyświetlić widok jak najmniejszym kosztem.
Go to the top of the page
+Quote Post
bregovic
post
Post #103





Grupa: Zarejestrowani
Postów: 562
Pomógł: 15
Dołączył: 8.08.2003
Skąd: Denmark/Odense

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


Hmm... Hawk, podsumowywując - nie ma znaczenia czy nazwiemy to akcją, czy widokiem, czy czymkolwiek - to musi być jakaś klasa, która coś wyświetli. W przypadku phienda, są to klasy z funkcją display - które ewentualnie łączą się z modelem i wyświetlają output (np. przy pomocy smarty).
Innym rozwiązaniem (które tak na prawdę jest dokładnie tym samym - z tymże z innymi nazwami) jest stworzenie akcji - które nie robią nic innego jak wyciągnięcie danych z bazy i wyświetlenie ich.

Różnica, z tego co widzę polega na ilości kontroli jaką przekażemy widokowi. Mnie, wydaje się że widok jako taki nie powinien mieć dostępu do modelu - bo zbyt komplikuje to implementację. Wydaje mi się że to kontroler (więc i akcje) powinien pracować na api modelu - a widok powinien zająć się wcale niełatwą sprawą wyświetlania danych...

Czy się mylę?
Go to the top of the page
+Quote Post
Vengeance
post
Post #104





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


@bregovic: krotka mowiac myslisz o tworzeniu widoku przez akcje
i przekazywaniu mu jakos (glownie przez parametry w konstruktorze)
jedynie wyniku jakis tam operacji na modelu (pobierania danych).

Z tego co widze bo roznych przygladach wiele skryptow przekazuje do
widoku instancje modelu aby ten zrobil sobie "co potrzebuje". Jednak moze zrobic takze cos wiecej. A w przypadku rozwiazania podanego powyzej mialby dostepdo tego co naprawde jest mu koniecznie.
Czy tak?
Go to the top of the page
+Quote Post
DaNTe
post
Post #105





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 7.01.2004
Skąd: Katowice

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


Podłącze się pod temat, żeby nie zakładać nowego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Jestem na etapie budowania aplikacji w oparciu o phiend (co prawda to tylko podstawa, którą trzeba dosć mocno rozbudować, ale zawsze).

Z tego co zdążyłem się zorientować, nie ma tutaj matod dających dostęp to parametrów POST, GET itp, a jako, że nie bardzo chcę operować na nich bezpośrednio - muszę sobie taki kawałek kodu dopisać.

Problem jest właśnie z parametrami GET (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) bo prawdopodobnie czasami na wywołania nałożony będzie mod_rewrite, zresztą ze standardową postacia index.php/moja/akcja/ też nie ładnie wyglądały parametry get przekazane po znaku zapytania.

I tu właściwe pytanie - jak radzicie sobie z wywolaniami w stylu /artykul/15/strona/6 ?

Jakieś idee poza ręczną analizą REQUESTED_URI - którą defacto powinien odwalić rontroler ?
Go to the top of the page
+Quote Post
hawk
post
Post #106





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Jeżeli chodzi o index/nazwa/akcji, to na pewno możesz to zrobić za pomocą standardowego phienda. Tak działa np. strona projektu.

Jeżeli chodzi o artykuł/16/strona/5, to istotnie kontroler powinien takie coś odwalić. Ale sam framework nie, bo nie wie nic o artykułach. W zależności od tego, ile akcji potrzebuje takich danych, można wydziedziczyć wszystkie/niektóre akcje z abstrakcyjnej klasy, która parsuje takie coś i wyciąga to co potrzeba.

Można też przyjąć, że url zawsze ma postać cośtam/nazwa/wartość/nazwa2/wartość2 itd. Tego phiend automatycznie nie parsuje, i wtedy najlepiej chyba byłoby zrobić klasę bazową dla wszystkich akcji.
Go to the top of the page
+Quote Post
aleksander
post
Post #107





Grupa: Przyjaciele php.pl
Postów: 742
Pomógł: 0
Dołączył: 14.12.2003
Skąd: Gdańsk, Trójmiasto

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


ok no więc ja poruszę troche inny temat MVC. Jest to własciwie tylko małe uniedogodnienie, ale czasem może wkurzyć. Być może ja coś źle robię.

mam akcję showcomments. W tej akcji są wyświetlane komentarze i formularz do wstawienia nowego komentarza. Gdy kliknę na przycisk dodaj komentarz, przejdę do akcji addcomment. Ta akcja zwróci nazwę widoku showcomments, wieć znowu zobaczę komentarze, ale w pasku adresu będzie nadal addcomments i gdy użytkownik niechący lub chcący kliknie F5 to do bazy znowu doda się identyczny komentarz (pomijam, że przeglądarka ostrzega przed tym).

Można by w akcji addcomment zrobic header( 'Location'); do akcji showcomments i po problemie, ale to z kolei odbiera od zasady MVC. Co Państwo o tym myślą?

pozdrawiam
Go to the top of the page
+Quote Post
dag
post
Post #108





Grupa: Zarejestrowani
Postów: 180
Pomógł: 0
Dołączył: 24.12.2003

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


Można zwrócić widok z tekstem "komentarz został dodany..<a>zobacz komentarze</a>"
Go to the top of the page
+Quote Post
sobstel
post
Post #109





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


albo po prostu uneimożliwić dodanie takiego samego komentarza, poprzez sprawdzeni przy dodawaniu do bazy czy nie istnieje juz dokladnie taki sam rekord (pomijając czas oczywiście, no i trzeba uważać żeby przy okazji nie zablokować użytkownikowi możliwości wielokrotnego postowania popoularnych fraz np. "ok")

nawiasem mówiąc, przy okazji implementujemy mały mechanizm anty-floodowy.
Go to the top of the page
+Quote Post
marcin96
post
Post #110





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 21.08.2003
Skąd: Będzin

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


Cytat
Można by w akcji addcomment zrobic header( 'Location'); do akcji showcomments i po problemie, ale to z kolei odbiera od zasady MVC. Co Państwo o tym myślą?


Czemu odbiega? Zrobić widok wykonywany po wykonaniu akcji dodania komentarza do bazy. Widok ten wysyła do użytkownika właśnie header("Location: ..."); i tyle...

Ten post edytował marcin96 10.02.2005, 15:06:23
Go to the top of the page
+Quote Post
hawk
post
Post #111





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

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


Fakt, nie odbiega. Patrz np. phrame.

A generalnie to po prostu potrzebna jest kontrola postback. A przekierowanie jest właśnie jedną z takich metod.

Zresztą można nawet puścić header już w początkowej akcji. Redirect i tak jest tylko wewnętrznym trikiem, a nie widokiem.
Go to the top of the page
+Quote Post
squid
post
Post #112





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


czy mozna laczyc MVC z innymi wzorcami, ktos juz tak probowal?
Go to the top of the page
+Quote Post
M4chu
post
Post #113





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

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


Mozna? Nawet trzeba! Np Dao, Intercepting Filter, Decorator (do widoku).
Btw sam MVC jest zbudowany na Composite, Observer, Strategy i pewnie jeszcze kilku (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
UFO
post
Post #114





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 10.08.2005

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


Witam!
I ja pozwolę sobie dołączyć się do dyskusji (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Zacząłem właśnie pisać własny framework. Początkowo miał to być CMS, ale stopniowo ewoluowało do frameworka. Planuję wykorzystać model MVC, jednak męczy mnie parę kwestii...

Po pierwsze:
We wprowadzeniu do MVC wyczytałem że powinien być tylko jeden kontroler. Co w sumie logiczne jest jeśli system ma być elastyczny i łatwo się dopasowywać poprzez wyedytowanie configa. Jednak problem pojawia się jeśli chcemy zastosować do tego czegoś subdomeny. Mamy dany kontroler kontroler.php. I teraz w zależności od parametrów przekazanych do niego chcemy wyświetlić dział newsy albo czat. Czyli kontroler.php?dzial=newsy kontroler.php?dzial=czat I wszystko ładnie i pięknie do czasu aż wprowadzimy subdomeny. newsy.domena.pl czat.domena.pl I co się wtedy dzieje? Wychodzi na to że trzeba zastosować kilka kontrolerów. Chyba że... wykorzystać mod_rewrite, ale ten nie zawsze jest dostępny. Można też teoretycznie wykorzystać stronę błędu 404 do "emulacji" mod_rewrite ale to rozwiązanie mało eleganckie. A jeśli podzielimy kontroler to znowu stracimy możliwość łatwej konfiguracji i system w ten sposób będzie mało elastyczny (właściwie przypisany do jednego konkretnetego rozwiązania - czyli przestanie być frameworkiem). Może więc w każdej subdomenie dać plik index.php, w którym wysyłać header Location, przekierowujący do kontrolera i przekazujący mu wszystkie parametry? To też rozwiązanie mało eleganckie i rozwiązujące problem tylko częściowo. A może są jeszcze jakieś ciekawe rozwiązania tego problemu?

Druga sprawa:
Druga? W trakcie pisania tego postu przyszło mi do głowy kilka pomysłów na rozwiązanie pozostałych problemów (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
Ociu
post
Post #115





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Ja mam coś takiego: localhost/język/content(lub forum, chat)/moduł/opcja/id/

przykładowo: localhost/pl/content/articles/show/1/

Do subdomen, można by rzeczywiście użyć mod_rewrite... jaki w tym problem ?

Ten post edytował Ociu 11.08.2005, 09:51:41
Go to the top of the page
+Quote Post
Vengeance
post
Post #116





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


przecież każda subdomena może wskazywać na ten sam katalog, z tym samym index.php i kontrolerem, a kontroler sprawdzi poprawność $_SERVER[HOST].

Jeżeli stwierdzi, że ma doczynienia z odwołaniem z subdomeny, ustala np. katalog z którego ma brać akcje np. /actions/chat/*

Pozatym do tego służy także wzorzec FrontControllera pozwalający utworzyć "jeden spójny punkt wejścia" do aplikacji.
Go to the top of the page
+Quote Post
max_catch
post
Post #117





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 16.10.2004
Skąd: Szczecin

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


Mam pytanie z nieco innego obszaru. Nie dysponuję gotowym kodem, rozważam jedynie teoretycznie, ale postaram się przedstawić moje wątpliwości w miarę zrozumiale.

Rozpatrując modularyzację aplikacji wygodna jest możłiwość wykonywania sekwencji akcji (czy też łańcuchów akcji; być może mylę pojęcia) przy czym akcje te mogą być dynamicznie kolejkowane w trakcie wykonywania dowolnej akcji.

Przykład: stronę tworzą takie komponenty: drzewiaste menu (np: katalog produktów w e-sklepie - kategorie), lista produktów (główna treść), pole wskazujące w jakim miejscu strony jest użytkownik. Aby wygodnie rozdzielić zadania i ułatwić edycję, każdy z wymienionych komponentów strony może być realizowany oddzielną akcją i wywoływany w zbiorczej akcji, choćby tak:

  1. <?php
  2.  
  3. class Store extends Action {
  4. public function perform(httpRequest $request, httpResponse $response) {
  5. // kolejkowanie potrzebnych elementów, czyli tworzenie omawianej sekwencji akcji
  6. Controller::getInstance()->enqueue('displayCatalog');
  7. Controller::getInstance()->enqueue('displayLocation');
  8. Controller::getInstance()->enqueue('displayProducts');
  9. }
  10. }
  11.  
  12. ?>


w takiej sytuacji kontroller otrzymawszy żądanie 'www.test.com/go/Store' podczas inicjalizacji wprowadza do swojej wewnętrznej listy akcji nazwę akcji do wykonania (tutaj 'Store', nie jest uzasadnione wprowadzanie na listę gotowego obiektu). Kontroler startuje; podczas wykonania Store zakolejkowane zostają 3 kolejne akcje i pętla wykonawcza sunie dalej.

A teraz sedno sprawy. (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)

Na platformie MVC potrzebujemy także filtrów. Moje pytania dotyczą wzajemnych relacji między akcjami a filtrami.

1. Czy wykonanie łańcucha akcji powierzać samemu kontrolerowi, czy może kontroler powinien wykonywać jedynie szereg filtrów, z których ostatni będzie filtrem ExecutionFilter i jemu przekazywać kontrolę nad sekwencją akcji? Jakie są korzyści zastosowania każdego z rozwiązań?

2. Czy wykonanie akcji w sekwencji wiązałoby się z wykonaniem osobnego szeregu filtrów dla każdej akcji? Czyli czy łańcuch filtrów to pomysł, który powinno się stosować przed wykonaniem łańcucha akcji, czy też dla każdej akcji w łańcuchu indywidualnie?

Podsumowując, chciałbym abyście podzielili się swoimi pomysłami na rozwiązanie problemu "interakcji łańcucha filtrów z łańcuchem akcji" i sprecyzowali miejsca obu wymienionych części we frameworku MVC.
Go to the top of the page
+Quote Post
pies
post
Post #118





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 9.09.2005
Skąd: Sopot, Polska

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


Jakiś czas temu razem z paroma osobami ze świata napisaliśmy (a oni dalej rozwijają) framework MVC -- Cake php (www.cakephp.org). Rozwiązanie problemu URLi ściągnęliśmy z RoR (www.rubyonrails.org).

Pomysł opiera się na przypisaniu adresów do konkretnych klas i metod, tak, że np. adres:

www.example.com/blog/view/55

odpowiada klasie BlogController (Controller to "C" w "MVC") i metodzie view() w tej klasie, a "55" przekazywane jest jako parametr do wywołania metody, czyli powyższe wywołanie przekształcane jest w:

Kod
print BlogController->view(55);


Reguły przypisania określane są przez mechanizm Router. Można dzięki niemu zmienić rozumienie wywołań w dość dowolny sposób:

Kod
$Router->connect('/', array('controller'=>'Pages', 'action'=>'view', 'home'));


...oznacza, że wywołanie strony głównej (/) uruchamia PagesController->view('home').

Kod
$Router->connect('/kupuj/:action/*', array('controller'=>'Shop', 'action'=>'kategoria'));


...oznacza, że wywołania adresów typu /kupuj, /kupuj/koszyk, /kupuj/kategoria/5, /kupuj/produkt/234/czerwony przekształcane są w wywołania, odpowiednio:

Kod
print ShopController->kategoria();
print ShopController->koszyk();
print ShopController->kategoria(5);
print ShopController->produkt(234, 'czerwony');


Jest do tego manual (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował pies 9.09.2005, 09:27:31
Go to the top of the page
+Quote Post
Ociu
post
Post #119





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




pies: czyli dla każdego modułu musisz tworzyć nowy Controller ? Nie widze najmniejszego sensu.

Mam link w takiej postaci:
/pl/content/home/ - dla strony głównej portalu. Jeśli chce uruchomić np. blog to daje.
/pl/blog/home/

opcjonalnie mam link z parametrem /pl/blog/entry/view,13/ (przykład).

Request: (cząstka)
  1. <?php
  2. public function SimpleVirtualURL() {
  3. $iURL = (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : THRORIN_LINK);
  4. $this->iURL = explode('/', $iURL);
  5. }
  6. ?>


Czyli rozbija adres do tablicy. w Routerze jest analizowanie tej tablicy:
  1. <?php
  2. public function Analyse() {
  3. $this->request->SimpleVirtualURL();
  4. $this->lang = (empty($this->request->iURL[1]) ? THRORIN_LANG : $this->request->iURL[1]);
  5. $this->system=(empty($this->request->iURL[2]) ? 'content' : $this->request->iURL[2]);
  6. $this->module=(empty($this->request->iURL[3]) ? 'home' : $this->request->iURL[3]);
  7.  
  8.  
  9. if(!isset($this->request->iURL[4])) exit();
  10.  
  11. $url = explode(',', $this->request->iURL[4]);
  12.  
  13. # czyszczenie tablicy iURL
  14. $this->request->iURL = array();
  15.  
  16. $this->option=$url[0];
  17. $this->id=$url[1];
  18. }
  19. ?>


Później Controller wywołuje odpowiednią akcję.
I tak dzięki 4 plikom (+view) mam uniwersalny silnik (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
pies
post
Post #120





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 9.09.2005
Skąd: Sopot, Polska

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


Cytat
pies: czyli dla każdego modułu musisz tworzyć nowy Controller ? Nie widze najmniejszego sensu.


Nie bardzo rozumiem co masz na myśli. Jeżeli moduł to pojedyncza funkcjonalność serwisu (np. newsy albo obsługa formularza) to w moim modelu moduł nazywa właśnie controller.

Cytat
Później Controller wywołuje odpowiednią akcję.
I tak dzięki 4 plikom (+view) mam uniwersalny silnik (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


Mój mechanizm działa bardzo podobnie, tylko dodatkowo jest konfigurowalny i ma obsługę błędów (zakładam, że Twój też). Nie wiem z ilu plików się składa, bo jest częścią frameworku i ma trochę zależności (m.in. logowanie błędów), ale ogólnie rzecz biorąc mam klasy Router (konfiguracja URLi) i Dispatcher (odczytuje konfigurację, ładuje potrzebne klasy, tworzy obiekt controllera i uruchamia go).

Konfigurowalność pozwala na dodanie m.in. krótkiego aliasu do jakiejś strony, na przykład
Kod
www.audi.com/a4
które działa tak jak
Kod
www.audi.com/products/view/a4
.

Robi się to tak:
  1. <?php
  2. $Router->connect('/a4', array('controller'=>'Product', 'action'=>'view', 'a4');
  3. ?>


Wywołana będzie metoda ProductController->view('a4').
Go to the top of the page
+Quote Post

9 Stron V  « < 4 5 6 7 8 > » 
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: 4.12.2025 - 11:36