Cytat
Ogólnie: kontroler powinien zapytać model czy dany użytkownik może wykonać jakąś operację.
Czyli trochę przez analogię powinienem zapytać miotłę zanim ją użyję czy mogę ja użyć? To nie model miotły ale jakiejś zmutowanej super miotły.
Ja myślałem zrobić to trochę inaczej
class DocumentOwnerAsseration implements toCoTrzeba {
private $_request;
public function __construct(Zend_Request_Abstract $request) {
$this->_request = $request;
}
public function assert(Zend_Acl
$acl, Zend_Acl_Role_Interface
$role = null, Zend_Acl_Resource_Interface
$resource = null, $privilege = null) { $document = Doctrine::getTable('Documents')->find($this->_request->getParam('doc_id'));
if ($document->Company->isWorker(XX_Auth::getInstance()->getUser()))
return true;
// tu jakis ladne info do flash messengera dlaczego cos jest zle
return false;
}
}
class AclPlugin extends Zend_Plugin_Abstract {
public function routeStartup() {
//tutaj cala zabawa z inicjacja acla
$alc->allow(rola, resource, action, new DocumentOwnerAsseration($this->getRequest()));
if ($alc->isAllow())
return true;
throw new Exception();
}
}
Wszystko (nie jest to jakaś strasznie skomplikowana logika) odbywa się w pluginie, żaden controller nie musi być odpalony.
Kwestia roli (księgowa, sprzątaczka, etc) jest zabezpieczona przez regułki ACLa, dodatkowy assert tylko sprawdza czy dokument należy do firmy usera.
//Dellas
Dzięki za linka - trochę podobne do tego co napisałem powyżej.
Tak kilka uwag na szybko.
1. Definicja formularza w zend_form od 1.8 ma być nie w konstruktorze, ale w init()
2. Zend_Auth w metodzie authenticate()
posiada juz kod
$this->getStorage()->write($result->getIdentity());
więc powtarzanie go w AuthenticationControllerze jest niepotrzebne.
3. Nie bardzo rozumiem jak ustawiany jest "$comment" przekazywany do CommentAssertion.php ani Id ani modelu tego obieku w kodzie nie widze ;( Tobie udało sie to rozgryźć?