Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework] Jednorazowe wywołanie kodu
nameuser
post 20.04.2011, 00:11:58
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 11.03.2011

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


Tak jak w temacie. Używam frameworka Zend'a i poznaję go już coraz bardziej. Zastanawiam się, czy jest możliwe jednorazowe wykonanie pewnego kodu. Spróbuję to jakoś przedstawić.
W pliku Bootstrap.php w katalogu scripts mam np. taki kod
  1. $acl = new Zend_Acl();
  2. $acl->addRole('guest')
  3. ->addRole('user');
  4. $acl->add(new Zend_Acl_Resource('index'))
  5. ->add(new Zend_Acl_Resource('logowanie'))
  6. ->add(new Zend_Acl_Resource('uzytkownicy'));
  7. $acl->allow('guest', 'index')
  8. ->allow('user', 'logowanie');
  9. Zend_Registry::set('acl', $acl);

Teraz po pierwszym wejściu na jakąś stronę np /public/logowanie ten kod wykona się jeden raz. Po przejściu na /public/rejestracja wykona się już po raz drugi.
Chodzi mi właśnie o to, żeby ten kod wykonywał się tylko raz np. po pierwszym wejściu na jakąś podstronę ->
Wchodzę na /public/logowanie (pierwsze wejście), kod się wykona -> potem wchodzę na /public/rejestracja (drugie wejście) i ten kod już się nie wykona. Czy to jest jakoś możliwe? Jeżeli tak, to w jaki sposób to można zrealizować (oprócz sprawdzania np. ifem)?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
wookieb
post 20.04.2011, 05:49:44
Post #2





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




Acl się serializuje serialize i zapisuje w jakimś cache albo pliku. Przy następnym otwarciu strony po prostu pobierz go stamtąd gdzie został zapisany i deserializujesz unserialize.
Niestety zendowski ACL jest strasznie słaby (a niechże urośni Ci lista zasobów + ról to powstanie Ci niezła kupa w pamięci do wykonania "jednej" operacji) aczkolwiek jeżeli nie wymyślisz nic lepszego to już przy nim zostań.


--------------------
Go to the top of the page
+Quote Post
darko
post 21.04.2011, 16:03:18
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Alternatywnie możesz sprawdzać czy w rejestrze jest już ustawiona wartość klucza 'acl' i tylko w przypadku, jeśli nie jest, to wykonujesz przedstawiony przez Ciebie kod. Pamiętaj jednak, żeby przy wylogowaniu użytkownika usunąć tę wartość z rejestru. Mam na myśli coś takiego:
  1. if(!isset(Zend_Registry::get('acl') || is_null(Zend_Registry::get('acl')))
  2. {
  3. $acl = new Zend_Acl();
  4. $acl ->addRole('guest')
  5. ->addRole('user');
  6. $acl->add(new Zend_Acl_Resource('index'))
  7. ->add(new Zend_Acl_Resource('logowanie'))
  8. ->add(new Zend_Acl_Resource('uzytkownicy'));
  9. $acl->allow('guest', 'index')
  10. ->allow('user', 'logowanie');
  11.  
  12. Zend_Registry::set('acl', $acl);
  13. }


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
nameuser
post 22.04.2011, 14:42:10
Post #4





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 11.03.2011

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


Z tym ACL to był tylko przykład. Chodzi mi właśnie o to, żeby tego ACL'a i innych rzeczy nie ładować za każdym razem (rzeczy które są w Bootstrapie.php). Czyli żeby np. tego też nie ładować za każdym razem (chyba, że trzeba?):
  1. $autoLoader = Zend_Loader_Autoloader::getInstance();
  2. $autoLoader->registerNamespace('DB_');
  3. $front = Zend_Controller_Front::getInstance();
  4. $front->setControllerDirectory(APPLICATION_PATH . '/controllers')
  5. ->setRouter(new Zend_Controller_Router_Rewrite())
  6. ->registerPlugin(new Plugins_Plugin1());
darko - właśnie myślałem nad tym pomysłem, tylko jak będę więcej rzeczy tutaj ładował to potem będzie sporo ifów i nie wiem jak to bardzo wpłynie na wydajność wszystkiego. Dlatego na razie szukam jakiegoś innego sposobu.
Go to the top of the page
+Quote Post
darko
post 22.04.2011, 15:14:57
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Przeczytaj początek tego tekstu, to jest oficjalna dokumentacja, z której możemy przeczytać, że obsługa przechowywania "list dostępu" należy do dewelopera, a obiekt Zend_Acl umożliwia serializowanie (jak już wspomniał wookieb) i przechowywanie w dowolnej postaci czy to w bazie czy w pliku czy w cacheu. Osobiście nie przejmowałbym się problemem narzutu czasowego na każdym żądaniu; danych dużo nie ma, a sam mechanizm powinien działać właśnie tak, że przy każdej próbie dostępu danej roli do określonego na liście zasobu następuje sprawdzenie czy ta rola ma uprawnienia czy ich nie ma.


--------------------
Nie pomagam na pw, tylko forum.
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:34