Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> 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
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Szczerze mówiąc to nie bardzo zrozumiałem o co chodzi, może pokaż jakiś kawałek kodu lub to co napisałeś, powiedz jaki jest typ dostępu do metod do których chcesz się odwołać.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
pejott
post
Post #3





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Hehe, coś o czym mówisz jest błahostką np. w Symfony2. Kontrollery masz zdefiniowane jako "services" w pliku konfiguracyjnym.
Zmieniasz tylko parametr zawierający nazwę klasy i gotowe. Większość bundli udostępnia też zmianę klasy w pliku konfiguracyjnym samej aplikacji.

Pozdrawiam.
Go to the top of the page
+Quote Post
markonix
post
Post #4





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

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


skowron-line, proszę:

  1. class rodzic {
  2. function metodaX() {
  3. echo 'bu';
  4. }
  5. }
  6.  
  7. // Koniec kodu aplikacji właściwej
  8.  
  9. class rozszerzajaca extends rodzic {
  10. function metodaX() {
  11. // akcja niezależnego licznika
  12. parent::metodaX();
  13. }
  14. }
  15.  
  16. $rozszerzajaca = new rozszerzajaca;


Aplikacja działa na obiekcie rodzic.
Aby wywołała mi się moja metodaX jestem zmuszony w ingerencje kodu (wywołanie metody metodaX na obiekcie $rozszerzajaca czego po prostu chciałbym uniknąć, aby to było elastyczne rozszerzenie aplikacji). Zresztą modyfikacja pliku głównego już w sumie była by gorsza od modyfikacji ręcznej tej metody. Po prostu czy mogę "ładnie" jakoś uzupełnić aplikacje, gdy nie ma ona przewidzianej pluginizacji, zawsze miałem przekonanie że dziedziczenie na to pozwoli, dziś chciałem tego użyć i myśl "przecież to tak nie działa, nie w tę stronę".

Ten post edytował markonix 18.06.2011, 14:05:25


--------------------
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(pejott @ 18.06.2011, 08:56:54 ) *
Hehe, coś o czym mówisz jest błahostką np. w Symfony2. Kontrollery masz zdefiniowane jako "services" w pliku konfiguracyjnym.
Zmieniasz tylko parametr zawierający nazwę klasy i gotowe. Większość bundli udostępnia też zmianę klasy w pliku konfiguracyjnym samej aplikacji.

Pozdrawiam.

Jaki to ma związek z tematem?


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #6





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 #7





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
everth
post
Post #8





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


Cytat
by 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.

Stwórz dekorator klasy rodzica i załącz go zamiast dekorowanej klasy. Raczej ekonomiczniejsze rozwiązanie niż obchodzenie zawiłości hierarchii dziedziczenia.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 13:20