Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> metoda wywoływana przed każdą metodą
sazian
post
Post #1





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


Witam,
wiem że temat brzmi w sposób nieco zagmatwany ale nie wiedziałem jak to inaczej nazwać.
O co chodzi postaram się wyjaśnić na przykładzie
  1. class klasa
  2. {
  3. public function before()
  4. {
  5.  
  6. }
  7. public function a()
  8. {
  9.  
  10. }
  11.  
  12. }
  13. $o = new klasa();
  14. $o->a();


czy istnieje możliwość aby przed wywołaniem metody "a" została niejawnie wywołana metoda "before" czyli kolejność wywołania wyglądała by tak before => a

idąc dalej,
  1. class klasa
  2. {
  3. public function before()
  4. {
  5.  
  6. }
  7. public function a()
  8. {
  9. $this->b();
  10. }
  11. public function b()
  12. {
  13.  
  14. }
  15.  
  16.  
  17. }
  18.  
  19. $o = new klasa();
  20. $o->a();


i tu kolejność wywołań miała by wyglądać tak before => a => before => b. A idąc jeszcze dalej, czy metoda before może być informowana jaka metoda będzie wywołana po niej?

jedyne co przychodzi mi do głowy to jakaś metoda call która przyjmie jako parametry nazwę metody i jej parametry ale takie rozwiązanie nie jest automatyczne i jeśli "się zapomni" użyć call to before nie będzie wywołany ;/

czy zrobienie czegoś takiego jest możliwe ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
sazian
post
Post #2





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


@Dipter dzięki za linki, poczytam
@adbacz tylko że w php jest dziedziczenie (IMG:style_emoticons/default/wink.gif) i wszystkie metody są pisane tylko raz, a uprawnienia mam zapisywane w tablicy w każdej klasie osobno, czyli dla każdej klasy muszę tylko zmieniać uprawnienia jeśli mają być inne niż normalnie



prosty przykład (wersja bardzo uproszczona )
  1. class Controller_c1 extends Controller
  2. {
  3. public $__ACCESS = array(
  4. '*'=>array('poziom dostępu'=>1,'kod błędu'=>1000),//uprawnienia domyślne dla wszystkich jeśli mamy poziom inny niż 1 to rzuć wyjątek o kodzie 1000
  5. 'action_f1'=>array('poziom dostępu'=>2,'kod błędu'=>1002),//uprawnienia dla metody action_f1, jeśli poziom inny niż 2 to rzuć wyjątek 1002
  6.  
  7. );
  8. public function action_f1(){}
  9. public function action_f2(){}
  10. }
  11.  
  12. class Controller_c2 extends Controller_c1
  13. {
  14. public function action_f3(){//ta metoda zostanie wywołana jeśli mamy uprawnienia na poziomie 1
  15. $this-> action_f2();
  16. }
  17. }

jedyny problem to dziedziczenie zmiennych, więc będę musiał to pewnie wydelegować do osobnej klasy.
A jeśli dobrze zrozumiałem to Twój sposób również nie rozwiąże "automatycznie" problemu przedstawionego w action_f3 - action_f3 ma inne uprawnienie niż f2 którą wywołuje


@Crozin z wynalazków wolę nie korzystać (IMG:style_emoticons/default/wink.gif) fajne że koś robi coś w tym kierunku ale chyba jednak wolę nie ryzykować (IMG:style_emoticons/default/smile.gif)

Cytat(Crozin @ 1.08.2012, 21:43:24 ) *
pod żadnym pozorem kodu sprawdzającego uprawnienia nie pchaj do klasy mającej robić główne zadanie aplikacji. Wykonaj sprawdzenie wszystkich koniecznych rzeczy przed ich wywołaniem.


chyba nie do końca rozumiałem (IMG:style_emoticons/default/sad.gif)
w dużym skrócie
mam klasę nadrzędna dla wszystkich kontrolerów

  1. abstract class Controller
  2. {
  3. public function before(){}
  4. public function _access($method){}
  5. public function after(){}
  6. public function onError($exception){}
  7. }


tych metod praktycznie nie muszę ruszać, zawszę robią to samo - no może za wyjątkiem onError.
i teraz aplikacja jest uruchamiana miej więcej tak(zaznaczam że jest to pseudo kod mający pokazać tylko schemat działania)
  1.  
  2. $obiekt->before();
  3. try{
  4. $obiekt->_access('action_nazwa_akcji');
  5. $obiekt->action_nazwa_akcji();
  6. }
  7. catch(ExceptionAccess $e)
  8. {
  9. $obiekt->onError($e);
  10.  
  11. }
  12.  
  13. $obiekt->after();
  14.  

czyli sam wyjątek jest rzucany przez klasę i przez tę samą klasę jest obsługiwany;

może dodam że wszystkie wywołania są robione na zewnątrz klasy kontrolera przy pomocy klasy ReflectionClass
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: 13.10.2025 - 17:40