Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Jednorazowe wywołanie kodu
Forum PHP.pl > Forum > PHP > Frameworki
nameuser
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)?
wookieb
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ń.
darko
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. }
nameuser
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.
darko
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.