【问题标题】:Should my Zend navigation menu be explicitly cached?我的 Zend 导航菜单是否应该被显式缓存?
【发布时间】:2012-10-10 18:01:14
【问题描述】:

好的,所以我使用 Zend Framework 1.12 和 Doctrine 2.2.3。 Zend_Navigation 类对我来说太简单和静态了,所以我正在实现自己的导航类。

场景如下:

我的应用程序要求导航菜单由标准(强制)项目(例如“主页”、“关于我们”等)以及用户特定项目(取决于用户角色)组成。动态菜单项存储在数据库 (MySQL) 中,我使用 Doctrine 作为我的 ORM 和 DBAL。

我正在尝试编写自己的导航类和部分视图来呈现其内容,并且在这样做时,我想知道我会遇到哪些性能问题,如果我在每次操作调用时查询数据库,然后发送菜单项返回页面?实现缓存的最佳方式是什么?我已经开始使用Zend_Registry_Namespace 来存储我的菜单类(该类还存储当前活动的菜单项,我在部分视图中使用它来将 CSS 样式附加到该项)。

请帮忙

【问题讨论】:

  • 您是否正在开发类似 CMS 的东西,用户可以在其中将自己的条目添加到菜单中?因为,如果没有,您根本不应该将这些信息存储在数据库中!
  • 您好,Markus,感谢您的回复。不,它不会反映 CMS 系统。然而,用户导航菜单将根据他/她在系统中的角色动态生成。因此管理员将获得完整的菜单,而客户端角色只能获得某些菜单项。

标签: php zend-framework caching doctrine-orm zend-navigation


【解决方案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'
    );
}

【讨论】:

  • 天啊,这是很好的反馈,谢谢。另一个问题,我使用 session 的原因是为了存储菜单状态,这有必要吗?例如,当用户导航到某个菜单项时,该项目需要更改 css 类。最好的解决方案是什么?
  • 为什么要改css类?
  • 或者更确切地说添加一个新的 css 类来显示他在那个特定的菜单上。为菜单项提供与无背景(非活动)相对的背景颜色(活动)
  • 这是一个完全不同的话题,与您如何创建菜单无关。
  • 好的,感谢您引导我朝着正确的方向前进。将其标记为已接受。看来我有点把事情复杂化了。您能否在导航菜单上指出正确的方向并使用 CSS 设置活动项目的样式?如果可能,我想远离 Zend_Navigation。
猜你喜欢
  • 2013-12-08
  • 1970-01-01
  • 2020-12-08
  • 2014-01-25
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多