Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa Router - i QUERY_STRING i PATH_INFO
jang
post
Post #1





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
envp
post
Post #2





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


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





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

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


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';

Ten post edytował jang 11.09.2007, 18:41:45
Go to the top of the page
+Quote Post
Prph
post
Post #4





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

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


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





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

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


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 ?
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Wogóle chyba najlepiej takie coś przenieść do konfiguracji w jakimś xml, albo ini, yaml etc.
Zawsze łatwiej zmienić ;]

Pozdrawiam.
Go to the top of the page
+Quote Post
jang
post
Post #7





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

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


@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
Go to the top of the page
+Quote Post
Prph
post
Post #8





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

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


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.

Ten post edytował Prph 12.09.2007, 22:55:13
Go to the top of the page
+Quote Post
jang
post
Post #9





Grupa: Zarejestrowani
Postów: 101
Pomógł: 11
Dołączył: 2.02.2005

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


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





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

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


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

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: 24.08.2025 - 14:37