如何避免Zend_Navigation中的膨胀



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

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

我在这个ZF应用程序中使用了模块化设置,所以每个模块都有一个独特的引导程序。我已经考虑过创建特定于模块的nav XML文件并加载特定的文件,但我也不确定这是否是最好的方法。

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

我不会把它称为建议的方法——这只是我两年前遇到同样问题时的处理方式。简而言之:我在每一个页面上都有我需要的XML中的所有路径。所有其他路径都是在运行时添加的。只有这样我才能添加ACL。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新