Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Uzupełnianie metod rodzica
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Mam cudzą aplikację, oparta jest o MVC.
Do dwóch metod w kontrolerze chciałem dodać małą akcję (statystyki).

Aby uniknąć edytowania kodu aplikacji zacząłem pisać klasę rozszerzającą te dwie metody.
Klasę by wystarczyło zaicludować w pliku głównym (brak autoloadera) i tyle.
W funkcji zawarłem mój kod + ::parent(funkcja).
No ale chwila.. To nie działa w tą stronę..
Metoda pokazStroneX wywoływana jest na obiekcie rodzica, a nie dziecka tak więc to co napisałem nie ma prawa działać.
Działałoby gdyby metoda była wywoływana na obiekcie klasy rozszerzającej, ale to znów by wymagało ingerencji w kod aplikacji.

Tutaj się zastanawiam jak uniknąć ingerowania w kod kontrolera jeżeli w systemie tym, nie ma żadnego systemu pluginów czy API?
Są jakieś metody? Jakieś koncepcje?

Ten post edytował markonix 18.06.2011, 00:04:24
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Twój problem wynika z tego, że gdzieś tam w aplikacji w końcu robione jest mniej-więcej coś takiego:
  1. $obj = new Rodzic();
  2. $obj->metodaX();
Ty musiałbyś jakoś doprowadzić do tego by tworzony był obiekt typu Dziecko, zamiast Rodzic. Bez tego nic Ci po dziedziczeniu. Być może w jakimś pliku konfiguracyjnym jest możliwość określenia jaki obiekt dla danego typu żądania ma być tworzony?

Być może system obsługuje jakiś system zdarzeń i jest możliwość podpięcia własnego kodu? Wtedy wystarczyłoby dodać jakiś warunek sprawdzający czy zdarzenie zostało wywołane w kontekście Rodzic::metodaX() i dodać swój kod.

Generalnie jeżeli system nie został przygotowany do możliwości jego nieinwazyjnego rozszerzenia to wiele nie zrobisz. W ostateczności (jeżeli koszt mieszania w oryginalnym kodzie będzie rzeczywiście za wysoki) możesz pokusić się o lekturę tej strony i zawartych w niej sugestii: http://stackoverflow.com/questions/137006/...ethods-or-class - ale takich zabiegów trzeba używać naprawdę z głową.
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Cytat(Crozin @ 18.06.2011, 15:20:45 ) *
Generalnie jeżeli system nie został przygotowany do możliwości jego nieinwazyjnego rozszerzenia to wiele nie zrobisz. W ostateczności (jeżeli koszt mieszania w oryginalnym kodzie będzie rzeczywiście za wysoki) możesz pokusić się o lekturę tej strony i zawartych w niej sugestii: http://stackoverflow.com/questions/137006/...ethods-or-class - ale takich zabiegów trzeba używać naprawdę z głową.


Nie ma żadnych kosztów, bardziej to problem koncepcyjny, aniżeli coś czego nie da się przeskoczyć.
Argumentem dlaczego tak chce robić jest głównie zabezpieczenie moich poprawek przez upgrade'm oprogramowania.

Cytat(Crozin @ 18.06.2011, 15:20:45 ) *
Być może system obsługuje jakiś system zdarzeń i jest możliwość podpięcia własnego kodu? Wtedy wystarczyłoby dodać jakiś warunek sprawdzający czy zdarzenie zostało wywołane w kontekście Rodzic::metodaX() i dodać swój kod.


Najbliższe temu jest inny pomysł aby tylko w pliku głównym (tym co łączy M,V i C) dołączyć jakby drugi kontroler.
Akcje, które chce zliczać, są wywołane urlem (klasa/funkcja/argumenty).
Mógłbym przetworzyć url ponownie w moim kontrolerze i gdy zostanie wywołana funkcja, którą chciałem rozszerzać to po prostu wywołam skrypt licznika.
Rozwiązanie te wymaga wgrania jednego pliku i jednego prostego include w pliku głównym za głównym kontrolerem.

Go to the top of the page
+Quote Post

Posty w temacie


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: 27.12.2025 - 08:27