3

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

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

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

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

4

2 回答 2

1

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

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

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

于 2012-07-26T14:33:40.320 回答
0

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

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

于 2012-07-26T15:00:19.187 回答