В конечном итоге вы можете разместить его в любом месте, если ваш автозагрузчик достаточно настроен для его поиска. И как именно вы его используете, зависит от того, какие ресурсы и привилегии вы пытаетесь защитить.
Но подумайте, что вы путаете создание своего ACL и запросы к ACL.
Скорее всего, вы будете создавать / заполнять свой объект ACL во время начальной загрузки и сохранять его в реестре Bootstrap
или в синглтоне Zend_Registry.
Если ваши ресурсы являются контроллерами, а ваши привилегии - действиями, то обычно перехватывается цикл отправки с помощью плагина preDispatch()
, который запрашивает ваш объект ACL.
Итак, мы действительно смотрим на два разных класса / объекта:
Одним из них является сам ACL, расширяющий Zend_Acl
. Этот может быть назван Application_Model_Acl
и помещен в файл application/models/Acl.php
.
Другой - плагин фронт-контроллера. Этот может быть назван Application_Plugin_Acl
и сохранен в файле application/plugins/Acl.php
[Обратите внимание, что оба они предполагают, что мы используем пространство имен приложения Application
. Также обратите внимание, что оба они относятся к конкретному проекту.]
Конечно, описанному плагину нужно предоставить объект ACL, чтобы он мог выполнять свою работу, поэтому у вашей Bootstrap может быть такой метод:
protected _initAclPlugin()
{
$acl = new Application_Model_Acl();
$plugin = new Application_Plugin_Acl($acl);
Zend_Controller_Front::getInstance()->registerPlugin($plugin);
}
Но помните, это единственный способ использовать ваш ACL. В некоторых случаях ваш ACL может не ограничиваться только контроллерами / действиями. В этом случае вам может потребоваться передать ваш объект ACL другим моделям / службам, которые также запрашивают его. В этом случае в вашем Bootstrap
может быть отдельный метод для создания объекта ACL и его сохранения в реестре Bootstrap
. Тогда ваши контроллеры - или даже система внедрения зависимостей - могут взять их оттуда и передать всем, что может понадобиться последующим моделям / сервисам.
[Вы знаете, глядя на мой ответ, он не очень отличается от ответа @linead. Та же самая идея, разные слова, но он полностью вошел первым.]