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 |
|
|
|
![]() |
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:
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ą. |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%)
|
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. 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. |
|
|
|
markonix Uzupełnianie metod rodzica 18.06.2011, 00:03:43
skowron-line Szczerze mówiąc to nie bardzo zrozumiałem o co cho... 18.06.2011, 07:31:53
pejott Hehe, coś o czym mówisz jest błahostką np. w Symfo... 18.06.2011, 07:56:54
markonix skowron-line, proszę:
[PHP] pobierz, plaintext cl... 18.06.2011, 11:04:18
wookieb Cytat(pejott @ 18.06.2011, 08:56:54 )... 18.06.2011, 11:04:24
everth Cytatby uniknąć edytowania kodu aplikacji zacząłem... 18.06.2011, 15:39:05 ![]() ![]() |
|
Aktualny czas: 27.12.2025 - 08:27 |