我正在 ZF 上开发一个应用程序。
我遇到了一个巨大的无法解决的问题 - ZEND_Acl
这对我来说是无法解决的,因为我发现的每篇文章都与基于 MODULE 的应用程序无关。
最近我发现了描述在模型中使用 ACL 的packtpub 文章
但它看起来很复杂,很复杂,而不是我一直在寻找的那个。
它有 StoreFront - 一切都在那里,就我而言,我将所有东西都分成模块。
我在许多其他来源以及文档中看到了 ACL 实现技术。
我不知道如何解决以及从哪里开始(实际上是如何)开发/构建我的 ACL 实现。
我的应用程序如下所示:
application/
configs/
layouts/
master.phtml
admin.phtml
modules/
users/
controllers/
adminController
indexContoller
models/
views/
blog/
controllers/
adminController
indexController
models/
views/
orders/
controllers/
adminController
indexController
models/
views/
如您所见,我在 adminControllers 中有管理功能,在 indexControllers 中有前端功能。
在模块内部拥有 adminControllers 和视图的想法是拥有分散的模块架构,而不是为管理员创建单独的模块。
现在我想为我的应用程序实现 ACL。
通常我会有管理员——超级管理员、编辑、发布者——管理员将访问除adminControllers
每个管理员之外的所有管理员,action
并且确保用户无法访问管理员控制器。
和用户 - 访客、注册、付费,因此层次结构看起来像这样:
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('visitor'));
$acl->addRole(new Zend_Acl_Role('registered'), 'visitor');
$acl->addRole(new Zend_Acl_Role('paid'), 'registered');
$acl->addRole(new Zend_Acl_Role('publisher'), 'paid');
$acl->addRole(new Zend_Acl_Role('editor'), 'publisher');
$acl->addRole(new Zend_Acl_Role('superadmin'), 'editor');
此层次结构将可跨应用程序使用。
目标是在每个模块中写入写入权限和资源,这样当特定项目不存在某些模块时,我可以避免在我的 ACL 文档中出现垃圾。
我还没有在 YouTube 上测试 Alexander Romanenko 的教程的方法,但是在开发 ACL 时,他从 FrontController 插件加载 ACL - 我的情况是什么方法?
在实现 ACL 时,我必须考虑到 ACL 动态断言,以备将来使用。而像“VISITORS”这样的时刻不能发表评论,注册用户也不能在博客中看到付费文章。
也许您可以帮助我将 ACL 集成到我的项目中,也许您知道在哪里可以找到 HOW TO 并按照说明进行操作的好资源。
编辑
将具有 ACL 的 preDispatch() 的控制器插件将用于每个模块(在本例中为用户)(对吗?)
我试图在模块的(用户)引导程序中自动加载插件:
$plugin = Zend_Controller_Front::getInstance();
$plugin->registerPlugin(new Users_Plugin_AccessCheck());
但似乎整个应用程序都需要这个插件并给出错误:
Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Session must be started before any output has been sent to the browser; output started in H:\Server\xampp\htdocs\c2g\application\modules\users\plugins\AccessCheck.php/6' in H:\Server\xampp\htdocs\c2g\library\Zend\Session.php:451 Stack trace: #0 ... So on
我认为这是因为插件加载了两次。但是除了模块(USERS)本身之外,这种情况在每个页面上都会发生。