Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Plugin front controllera i przekazanie argumentu
Forum PHP.pl > Forum > PHP > Frameworki
agmakonts
Witam

Jestem w trakcie przepisywania Acl tak by plugin w preDispach tylko sprawdzał uprawnienia a lista była trzymana w configach.
Wszytsko pięknie, stworzyłem plik acl.php w katalogu configs, przypisałem go do zmiennej w _initAcl w bottstrapie ale nie moge go przekazac w argumencie konstruktora do pluginu.

  1. protected function _initAcl()
  2. {
  3. $this->_acl = require APPLICATION_PATH . '/configs/acl.php';
  4. $fc = Zend_Controller_Front::getInstance();
  5. $fc ->registerPlugin(new My_Plugin_Acl($this->_acl));
  6. }


var_dump zmiennej z acl pokazuje prawidłowo że jest to obiekt Zend_Acl ale gdy odpalam stronę dostaje błąd że do konstruktora Pluginu nie został żaden parametr przekazany sad.gif.

/configs/acl.php

  1. <?php
  2. $acl = new Zend_Acl;
  3.  
  4.  
  5. $acl -> addRole(new Zend_Acl_Role('guest'));
  6. $acl -> addRole(new Zend_Acl_Role('user'),'guest');
  7. $acl -> addRole(new Zend_Acl_Role('admin'));
  8.  
  9.  
  10. $acl -> addResource('index');
  11. $acl -> addResource('auth');
  12. $acl -> addResource('quiz');
  13. $acl -> addResource('error');
  14.  
  15.  
  16. $acl -> allow('guest', 'index');
  17. $acl -> allow('guest','auth','login');
  18. $acl -> allow('guest','error');
  19. $acl -> allow('user', 'quiz');
  20. $acl -> allow('user','auth','logout');
  21. $acl -> allow('admin',NULL);
  22.  
  23. return $acl;
  24.  
  25.  
  26. ?>
  27.  


Plugin

  1.  
  2. <?php
  3. class My_Plugin_Acl extends Zend_Controller_Plugin_Abstract
  4. {
  5. private $_acl = NULL;
  6.  
  7. public function __construct(Zend_Acl $acl) {
  8. $this->_acl = $acl;
  9. }
  10.  
  11. public function preDispatch(Zend_Controller_Request_Abstract $request) {
  12.  
  13.  
  14.  
  15.  
  16. $auth = Zend_Auth::getInstance();
  17. if($auth->hasIdentity())
  18. {
  19. $identity = $auth->getIdentity();
  20. $role = $identity->role;
  21. } else {
  22. $role = 'guest';
  23. }
  24.  
  25. $controller = $request->controller;
  26. $action = $request->action;
  27. if(!$this->_acl->isAllowed($role, $controller, $action))
  28. {
  29. if($role=='guest')
  30. {
  31. $request->setControllerName('auth');
  32. $request->setActionName('login');
  33. } else {
  34. $request->setControllerName('index');
  35. $request->setActionName('index');
  36. }
  37.  
  38. }
  39.  
  40.  
  41.  
  42. }
  43. }
  44. ?>
  45.  
  46.  
Deallas
Include nie require:

Kod
$this->_acl = include APPLICATION_PATH . '/configs/acl.php';
agmakonts
To nic nie zmienia przecież, cały plik jest poprawnie ładowany do $_acl, problem w tym że konstruktor pluginu go kompletnie ignoruje
Deallas
Racja:/ Zawsze odczytywanie zmiennych z pliku robiłem przez include i szczerze powiedziawszy nie wiedziałem, że da się tak samo zrobić przez require:P. Także nie czytając nawet dokładnie Twojego postu to pierwsze co wpadło mi do głowy. Poza tym require w Twoim kodzie nie zauważyłem nic dziwnego/niepoprawnego. Przetestowałem go nawet u siebie i wszystko działa w porządku. To musi być jakiś głupi błąd, którego po prostu nie widzimy;)
Polecam zapoznać się z:
- forum polskiej społeczności ZF - http://zend-framework.pl/forum/viewtopic.php?pid=7719
- wideo blogiem z gotowymi przykładami do pobrania - http://alex-tech-adventures.com/developmen...th-zendacl.html

P.S Wywala Ci taki błąd:
Kod
Catchable fatal error: Argument 1 passed to My_Plugin_Acl::__construct() must be an instance of Zend_Acl, null given, called in...

?
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.