如何避免Zend_Navigation中的膨胀?

时间:2012-07-26 12:17:31

标签: php zend-framework zend-navigation zend-acl

我一直在研究使用Zend_Navigation与Zend_Acl结合来管理我正在开发的新应用中的导航和访问权限。

真正困扰我的一件事是,我看到的示例最终会生成一个巨大的XML文件,其中包含应用程序中每个可能的导航项。在每个请求上加载此文件似乎是主要的性能瓶颈,必须有更好的方法。我意识到我可以通过使用memcached或其他缓存机制来缓解大部分问题,但我觉得应用程序本身应该以最佳方式编写,只有这样,你才能添加缓存。让一些东西变得缓慢和臃肿并依靠缓存来清理我的肮脏工作是没有意义的。

我在这个ZF应用程序中使用模块化设置,因此每个模块都有一个独特的引导程序。我考虑过创建模块特定的导航XML文件并加载特定的文件,但我不确定这是否也是最佳方式。

在具有数百条导航路径的大型应用程序中使用Zend_Navigation的建议方法是什么?

2 个答案:

答案 0 :(得分:1)

我不会称之为建议的方法,这就是我在两年前基本上遇到同样的问题时如何使用它。简而言之:我在每个页面上都需要XML中的所有路径。所有其他路径都在运行时添加。只有这样我才添加ACL。

首先,请注意Zend_Navigation中的ACL仅管理导航的显示。它不提供或更好地保证对您的应用程序的访问控制。菜单中将缺少某个链接,但如果用户知道正确的路径,则他/她可以访问该资源。当然,您可以使用导航对象中的ACL信息来固定应用程序,但我相信有更聪明的方法主要是将ACL直接合并到控制器和模型中。

其次,对于你的主要问题,我的导航的XML文件只包含最基本的结构,直到第二级,这是我一直需要的菜单。它也或多或少都是我拥有的控制器和动作。在运行时添加由params产生的任何路径。因此我甚至不将ACL包含在XML中,而是在运行时注入它。只是因为只有这样我才能拥有完整的扩展当前分支及其所有路径。

答案 1 :(得分:0)

我没有使用XML来生成导航。可以使用数组表示法在php中在运行时添加页面。

使用模块,您可以在注册表中设置导航对象,在每个模块中都有一个添加其页面的模型,以及一个在preDispatch上调用每个模块的导航模型的插件。