Php 如何避免Zend_导航中的膨胀?

Php 如何避免Zend_导航中的膨胀?,php,zend-framework,zend-navigation,zend-acl,Php,Zend Framework,Zend Navigation,Zend Acl,我一直在研究使用Zend_Navigation和Zend_Acl来管理我正在开发的新应用程序中的导航和访问权限 真正困扰我的是,我看到的示例最终生成了一个庞大的XML文件,其中包含应用程序中所有可能的导航项。在每个请求上加载此文件似乎是主要的性能瓶颈,必须有更好的方法。我意识到我可以通过使用memcached或其他缓存机制来缓解这一问题,但我觉得应用程序本身应该以最优化的方式编写,只有这样,才能添加缓存。让事情变得缓慢而臃肿并依靠缓存来清理我的脏活是没有意义的 我在这个ZF应用程序中使用模块化设

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

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

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


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

我不会将此称为建议的方法。这只是我两年前基本上遇到相同问题时的工作方式。简而言之:我在每个页面上都有XML中所需的所有路径。所有其他路径都是在运行时添加的。只有这样,我才能添加ACL

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


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

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


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

这是一个有趣的想法。我实际上正在考虑可能实现我自己的模块(可能扩展Zend_Navigation),该模块将更适合我的目的。@Cilloss很好,这就是ZF的优点,也是我喜欢它的地方。您可以根据自己的目的对其进行定制。