Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dostęp widoku do routera
Forum PHP.pl > Forum > PHP > Object-oriented programming
zaksmok
Witam. Tworzę sobie mały projekt w OOP i spotkałem się z problemem, którego nie potrafię logicznie rozwiązać.

Schemat systemy jest najstępujący:

1. Odpalam Router
2. przekazuje go do dispatchera
3. Dispatcher ładuje odpowiedni kontroler i wrzuca do niego router.
4. W kontrolerze za pomocą klasy View tworzę widok (podział www na kilka szablonów)
5. Dispatcher renderuje i wysyła całość.

---

Problemem jest dostanie się z widoku do routera. Po co? Mam przykładowo menu i chciałbym, aby menu prowadzące do aktualnie otwartego działu dostało atrybut klasy "active". Z poziomu widoku chciałbym odczytać $router->getModule i porownać go.

Jak rozwiązalibyście taki problem?
LBO
Zwracasz widok z kontrolera?

edit:

Tak, na logikę, obiekt Request powinien trzymać przetłumaczone info z Routera tj. moduł, akcja, etc.
zaksmok
Cytat
Zwracasz widok z kontrolera?

Tak, ale akurat menu jest wczytywane w widoku main.html jako <?=$this->include('menu');?>, który tworzy nowy widok i wszczepia go.
W tym przypadku menu znajduje się u góry strony i jest wczytywane przez main.html, ale może się zdarzyć tak, że menu będzie w innym miejscu i będzie wszczepiane w pliku footer.html. Dodatkowo na niektórych podstronach będzie submenu, które będzie musiało czytać z $router->action i też chciałbym tam dorzucić klasę "active" do hovera. Chciałbym aby kod był jak najoptymalniejszy, ale uniwesalny w przypadku zmiany widoku (mam system templatów).

Cytat
Tak, na logikę, obiekt Request powinien trzymać przetłumaczone info z Routera tj. moduł, akcja, etc.

Ja to zrobiłem bezpośrednio w routerze, aby ograniczyć ilość klas w projekcie.


Dodam tylko, że myślałem nad takimi rozwiązaniami:
1. zastosowanie Jquery do podmiany klas (nie będę musiał wtedy męczyć frameworka)
2. utworzenie nowej klasy do budowy menu
3. stały dostęp widoku do klasy request/router

Nie wiem co będzie najlepsze...
LBO
wszystko sprowadza się do przekazania Routera do widoku, a tego dalej do szablonu. Masz 2 wyjścia (no dobra, nie tylko 2 ale te będą najłatwiejsze do uzyskania):

1. Dodanie routera do widoku w dispatcherze:

  1.  
  2. //uzyskujesz moduł , kontroler i akcję z routera i dalej...
  3.  
  4. $view = $controller->$action(); // zwracasz widok z akcji
  5.  
  6. $view->setRouter($router); // obsługę przekazywania Routera do szablonu zaimplementuj w głównej klasie widoku
  7.  
  8. // dalsza logika dispatchera np uruchomienie widoku i wyplucie outputu


2. Tworzysz fabrykę widoku bezpośrednio w głównej klasie kontrolera

  1.  
  2. // możesz też oprzeć to tylko na interfejsie, wtedy będzie to "Design by contract"
  3. abstract class View
  4. {
  5. protected $router;
  6.  
  7. public function __construct(Router $router)
  8. {
  9. $this->router = $router;
  10. }
  11.  
  12. // reszta logiki
  13. }
  14.  
  15. abstract class Controller
  16. {
  17. private $router;
  18.  
  19. public function __construct(Router $router)
  20. {
  21. $this->router = $router;
  22. }
  23.  
  24. protected function createView()
  25. {
  26. // metoda może pobierać jakiś rodzaj konfiguracji i
  27. // na jej podstawie wywoływać odpowiedni obiekt widoku
  28. return new View($this->router);
  29. }
  30. }
  31.  
  32.  
  33. // i później w akcji
  34.  
  35. public function index()
  36. {
  37. $view = $this->createView();
  38. return $view;
  39. }
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.