Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa Router - i QUERY_STRING i PATH_INFO
Forum PHP.pl > Forum > PHP > Object-oriented programming
jang
Witam

Chciałbym zapytać jakie Waszym zdaniem rozwiązanie byłoby najlepsze :

1. klasa FrontController sprawdza $_SERVER['QUERY_STRING'] i $_SERVER['PATH_INFO'] i w zależności od tego które wywołanie wystąpiło tworzy obiekt jednej z klas -> RouterStandard lub RouterNice
2. Klasa Request zajmie się "rozpoznaniem" a FrontController pobierze sobie nazwę -> $this->request->getRouterClassName();
3. Stworzyć jedną klasę Router (niczym w CodeIgniter) która sama sobie sprawdzi i uruchomi jedną ze swoich metod (albo do standarowych urli albo do nice)
4. Utworzyć klasę Router która tylko sprawdzi $_SERVER['QUERY_STRING'] i $_SERVER['PATH_INFO'] i utworzy obiekt bądż RouterStandard bądź RouterNice.
5. Może jeszcze inne rozwiązanie ?

Z góry dziękuję za wszelkie odpowiedzi.
Pozdrawiam
envp
najlepszym rozwiązaniem jest ustawianie samemu ktory router ma sie ładować - w index.php po dopaleniu frontcontrolera załadować mu routera z którego ma korzystać...
jang
Szczerze powiedziawszy w index.php, jeśli chodzi o tworzenie obiektów chciałbym mieć tylko
  1. <?php
  2. require ('CCC.php');
  3. CCC::loadClass('CCC_FrontController');
  4.  
  5. $objFront = new CCC_FrontController;
  6. $objFront->dispatch();
  7. ?>
a reszta niech się "robi" niejako sama.
Jeśli chodzi o Twoją propozycję to może by tak w pliku config.php utworzyć $config['router'] = 'Nice';
Prph
Dlaczego potrzebujesz miec jak najmniejszy index.php? Wydaje mi sie, ze dobrze jest to rozwiazac tak:

1. Uruchamiasz Front_Controllera -> on tworzy sobie obeikt routera.
2. Mozesz ustawic nowy router przed odpaleniem Front_Controllera, np:

$oFC->setRouter(new Moj_Nowy_Router);

Oczywiscie mozna to zrobic za po moca konfigow, ale po co? Wiekszy narzut, bo kontroler zawsze sprawdza, jaki ma wlaczyc router. Akurat router jest jeden przez caly zywot aplikacji i proawdopodobienstwo, ze kiedys odpalisz konfiguracje i zmienisz router na inny jest znikome. Wiec daj na starcie inny router front kontrolerowi i niech sie o routing juz nie martwi.
NuLL
A nie lepiej jeden elastyczny router z definiowaniem routow ? Frameworki piszemy aby jak najszybciej rozwijac aplikacje - przewaznie jest to adekwatne do pisania odpowiednio malej ilosci kodu PHP. Tak wiec nasuwa sie pytanie - po co robic wiele klas skoro mozna to zrobic w
jednej konfigurowalnej ?
Cysiaczek
Wogóle chyba najlepiej takie coś przenieść do konfiguracji w jakimś xml, albo ini, yaml etc.
Zawsze łatwiej zmienić ;]

Pozdrawiam.
jang
@Prph
Im mniej wszelakiego kodu tym lepiej (mniejsza możliwość pomyłki) a poza tym nie zamierzam pisać instrukcji obsługi własnego frameworka(?) - patrz ZEND FW. Jeśli chodzi o pkt 1. i 2. to poniżej kawałek kodu z mojego FrontController'a
  1. <?php
  2. public function dispatch()
  3. {
  4. if(null === ($request = $this->getRequest()))
  5. {
  6. $request = new CCC_Request;
  7. $this->setRequest($request);
  8. }
  9. }
  10. public function setRequest($request, $name = 'request')
  11. {
  12. if (is_string($request))
  13. {
  14. CCC::loadClass($request);
  15. $request = new $request();
  16. }
  17. $this->request = $request;
  18. $this->registerObject($name, $request);
  19. }
  20. /*
  21.  * Zwraca obiekt klasy CCC_Request
  22.  */
  23. public function getRequest()
  24. {
  25. return $this->request;
  26. }
  27. ?>
Natomiast jeśli chodzi o plik config.php (tablica) to i tak klasa Config z niego korzysta a jedno pole więcej czy mniej do odczytu to przecież żadna różnica.

@NULL a więc proponujesz mieszankę CodeIgnitera i Zenda ?

Pozdrawiam
Prph
To my rozmawiamy o Routerze, czy o Request?

Cytat
Router - nie zawsze występuje we frameworku, ponieważ nie jest on niezbędny. Jego zadanie polega na przyjęciu żądania i wyznaczenie na jego podstawie nazwy docelowego modułu. Np. dla adresu www.example.com/user/delete router może wyznaczyć kontroler User i akcję Delete. Routery najczęściej stosuje się w celu przyjaznych URLi.


Cytat
Request - obiekt będący otoczką na dane wejściowe do aplikacji - GET, POST, COOKIE itp. Dobrze napisany request wyręcza programistę i w dużej mierze dba o bezpieczeństwo aplikacji. Np. request może automatycznie usuwać białe znaki z początku i końca danych i dodawać slashe (addslashes()).


Jezeli we front kontrolerze rejestrujesz request, to troche mija sie to z celem. Request operuje na tablicach globalnych, wiec nawet singletone nie jest potrzebny. Gdzie potrzebujesz robisz "new Request;".

A co do duzych i malych index.php - dodatkowe 5 linii chyba nie jest przestepstwem.
jang
Cytat
To my rozmawiamy o Routerze, czy o Request?
Oczywiście o Routerze, przepraszam ale tak mi się wstawiło, metoda setRouter wygląda tak samo.

Cytat
Jezeli we front kontrolerze rejestrujesz request, to troche mija sie to z celem.
Gdzie potrzebujesz robisz "new Request;".
Przepraszam ale nie rozumiem o co Ci chodzi ?

Czyżbym tworzył obiekty -> Request, Response, Router w nie właściwym miejscu ? FrontController nie jest od tego ?

Poniżej kawałek z Zend_Controller_Front
  1. <?php
  2. /**
  3.  * Dispatch an HTTP request to a controller/action.
  4.  *
  5.  * @param Zend_Controller_Request_Abstract|null $request
  6.  * @param Zend_Controller_Response_Abstract|null $response
  7.  * @return void|Zend_Controller_Response_Abstract Returns response object if ret
    urnResponse() is true
  8.  */
  9. public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)
  10. {
  11.  
  12. /**
  13.  * Instantiate default request object (HTTP version) if none provided
  14.  */
  15. if (null !== $request) {
  16. $this->setRequest($request);
  17. } elseif ((null === $request) && (null === ($request = $this->getRequest()))) {
  18. require_once 'Zend/Controller/Request/Http.php';
  19. $request = new Zend_Controller_Request_Http();
  20. $this->setRequest($request);
  21. }
  22. ?>

Właśnie we FrontControllerze tworzą obiekty tych klas.

Pozdrawiam
Prph
Cytat(jang @ 12.09.2007, 22:18:31 ) *
Czyżbym tworzył obiekty -> Request, Response, Router w nie właściwym miejscu ? FrontController nie jest od tego ?


Jest, chociaz jak kto woli winksmiley.jpg Chodzilo mi o to, ze skoro Request operuje na $_POST, $_GET itd, to nie trzeba na dzien dobry tworzyc jego obiektu we front kontrolerze i trzymac go na wszelki wypadek. Rownie dobrze mozesz utworzyc obiekt requesta w akcji, kiedy bedzie Ci tak na prawde potrzebny. Z kolei router mozesz utworzyc i trzymac we front kontrolerze, bo zawsze zostaje uruchamiany, a czasem zachodzi potrzeba skorzystania z niego w dalszej czesci aplikacji (np do wygenerowania adresu url).
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.