Следует ли явно кэшировать мое навигационное меню Zend?

Итак, я использую Zend Framework 1.12 с Doctrine 2.2.3. Класс Zend_Navigation на мой вкус слишком прост и статичен, поэтому я реализую свой собственный класс навигации.

Сценарий такой:

Мое приложение требует, чтобы меню навигации состояло из стандартных (обязательных) элементов (таких как «Главная», «О нас» и других), а также элементов, специфичных для пользователя (в зависимости от роли пользователя). Пункты динамического меню хранятся в базе данных (MySQL), и я использую Doctrine в качестве ORM и DBAL.

Я пытаюсь написать свой собственный класс навигации и частичное представление, чтобы отобразить его содержимое, и при этом хотел бы знать, какие проблемы с производительностью у меня будут, если я буду запрашивать базу данных при каждом вызове действия, а затем отправлять элементы меню обратно на страницу? Как лучше всего реализовать кеширование? Я начал использовать Zend_Registry_Namespace для хранения своих классов меню (в классе также хранится текущий активный элемент меню, который я использую в своем частичном представлении для добавления стиля CSS к элементу).

Пожалуйста помоги


person Blyde    schedule 08.10.2012    source источник
comment
Вы разрабатываете что-то в стиле CMS, где пользователи могут добавлять свои собственные записи в меню? Потому что в противном случае вам вообще не следует хранить эту информацию в БД!   -  person markus    schedule 10.10.2012
comment
Привет, Маркус, спасибо за ответ. Нет, это не отразит систему CMS. Однако меню навигации пользователя будет динамически генерироваться в зависимости от его / ее роли в системе. Таким образом, администратор получит полное меню, а роль клиента - только определенные пункты меню.   -  person Blyde    schedule 10.10.2012


Ответы (1)


Итак, вы не разрабатываете CMS, где пользователи могут создавать свои собственные структуры меню и содержимое. В этом случае вам вообще не следует хранить информацию о меню в реляционной базе данных. Запросы данных из базы данных всегда связаны с большими накладными расходами по сравнению с простым чтением той же информации из массива PHP или файла конфигурации. Вам также не нужно ничего хранить в сессиях. На самом деле, это действительно простой случай. Позвольте пользователю войти в систему, определить группу пользователей / привилегии пользователя и программно собрать меню воедино.

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

Пример:

Стандартное меню, которое получают все:

$navArray = array(
    array(
        'controller' => 'index',
        'label' => 'Home',
    ),
    array(
        'controller' => 'about',
        'label' => 'About',

    )
);

Затем добавьте записи в зависимости от ролей ACL:

if ($user->getRole() == 'administrator')
{
    $navArray[] = array(
        'controller' => 'tools',
        'label' => 'Tools'
    );
}
person markus    schedule 10.10.2012
comment
Ну и дела, это отличный отзыв, спасибо. Еще вопросы, причина, по которой я использую сеанс, заключается в том, чтобы сохранить состояние меню, это необходимо? Например, когда пользователь переходит к определенному пункту меню, этот элемент должен изменить класс css. Какое было бы лучшее решение? - person Blyde; 10.10.2012
comment
Зачем менять класс css? - person markus; 10.10.2012
comment
Или, скорее, добавьте новый класс css, чтобы показать, что он находится в этом конкретном меню. Присвойте элементу меню цвет фона (активный), а не без фона (неактивный) - person Blyde; 10.10.2012
comment
Это совершенно другая тема и не имеет ничего общего с тем, как вы создаете меню. - person markus; 10.10.2012
comment
Хорошо, спасибо, что направили меня в правильном направлении. Будет отмечен как принятый. Кажется, я немного усложняю. Не могли бы вы указать мне правильное направление в меню навигации и использовании CSS для стилизации активного элемента? Я бы хотел по возможности держаться подальше от Zend_Navigation. - person Blyde; 11.10.2012
comment
Тогда просто посмотрите, как Zend_Navigation работает с активным состоянием. По сути, задача PHP - добавить активный класс css к активному значку, а задача CSS - предоставить стили для этого класса. Если вы обновляете свою страницу без обратной связи, вам нужно будет добавить класс с javascript. - person markus; 11.10.2012
comment
С другой стороны, я не понимаю, почему вы не хотите использовать Zend_Navigation. Это здорово в том смысле, что вы можете легко отображать структуры страниц, такие как меню, фрагменты, карту сайта и т. Д., И это полностью расширяемое. - person markus; 11.10.2012
comment
На самом деле я только что просматривал бесконечные руководства по Zend_Navigation. Я начинаю привыкать к нему, но, похоже, это довольно жесткий помощник. Особенно при попытке визуализировать подменю с использованием ваших собственных HTML-элементов, таких как div, и их размещения по-своему. Но я буду продолжать! - person Blyde; 11.10.2012