Как избежать наворотов в Zend_Navigation?

Я изучал использование Zend_Navigation в сочетании с Zend_Acl для управления навигацией и правами доступа в новом приложении, над которым я работаю.

Одна вещь, которая меня действительно беспокоит, это то, что примеры, которые я видел, заканчиваются созданием огромного XML-файла, содержащего каждый возможный элемент навигации в приложении. Загрузка этого файла при каждом запросе кажется серьезным узким местом в производительности, и должен быть лучший способ. Я понимаю, что мог бы облегчить многое с помощью memcached или другого механизма кэширования, но мне кажется, что само приложение должно быть написано наиболее оптимальным образом, и только после этого вы добавляете кэширование. Нет смысла делать что-то медленное и раздутое и полагаться на кэширование, чтобы очистить свою грязную работу.

Я использую модульную настройку в этом приложении ZF, поэтому каждый модуль имеет уникальную начальную загрузку. Я рассматривал возможность создания XML-файлов навигации для конкретных модулей и загрузки конкретного, но я не уверен, что это лучший способ.

Каков предлагаемый метод использования Zend_Navigation в большом приложении с потенциально сотнями путей навигации?


person Jeremy Harris    schedule 26.07.2012    source источник


Ответы (2)


Я бы не назвал это предложенным методом, это просто то, как я с ним работаю, когда у меня был тот же вопрос два года назад. В двух словах: у меня есть все пути в XML, которые мне нужны, на каждой странице. Все остальные пути добавляются во время выполнения. Только потом добавляю ACL.

Во-первых, имейте в виду, что ACL в Zend_Navigation управляет только представлением навигации. Он не обеспечивает и не гарантирует контроль доступа к вашему приложению. Определенная ссылка будет отсутствовать в меню, но если пользователь знает правильный путь, он все равно может получить доступ к ресурсу. Конечно, вы можете использовать информацию ACL в навигационном объекте, чтобы закрепить свое приложение, но я считаю, что есть более разумные способы, главным образом, для включения ACL непосредственно в контроллеры и модели.

Во-вторых, к вашему основному вопросу, XML-файл моей навигации содержит только самую базовую структуру до второго уровня, который представляет собой меню, которое мне всегда нужно. Это также более или менее то, для чего у меня есть контроллеры и действия. Любые пути, полученные из параметров, добавляются во время выполнения. Из-за этого я даже не включаю ACL в XML, а вставляю его во время выполнения. Просто потому, что только тогда у меня есть полная расширенная текущая ветвь со всеми ее путями.

person Adrian World    schedule 26.07.2012
comment
Это интересная мысль. На самом деле я рассматриваю возможность реализации своего собственного модуля (возможно, расширения Zend_Navigation), который будет более адаптирован для моих целей. - person Jeremy Harris; 26.07.2012
comment
@cillosis Ну, это красота ZF и то, что мне в нем нравится. Вы можете адаптировать его практически ко всему, что вам нужно для ваших целей. - person Adrian World; 27.07.2012

Я не использовал XML для создания навигации. Вы можете добавлять свои страницы во время выполнения в php, используя нотацию массива.

Используя модули, вы можете настроить объект навигации в реестре, в каждом модуле есть модель, которая добавляет свои страницы, и плагин, который вызывает модель навигации каждого модуля в preDispatch.

person Richard Parnaby-King    schedule 26.07.2012