我无法理解ZF中ACL的规则,文档也不清楚。我正在为所有网站使用通用的Zend库。到目前为止没有问题,但现在每个演示或示例都说您应该将ACL类(acl.php)作为插件放在libraries目录中。 Zend公司/库/我的/控制器/插件/.
我不想这样做,因为它违背了共享公共框架目录的目的。
是否有人为每个网站/网络应用程序使用单独的acl.php类文件完成或了解如何完成ACL?
由于
答案 0 :(得分:1)
您永远不应该将文件添加到Zend库目录中 - 您是否有指向教程的任何链接?这些文件应该放在应用程序命名空间下的库目录中,为您提供如下结构:
application/
library/
Zend/
(ZF files)
Foo/
Controller/
Plugin/
...
或application/plugins
,application/controller/helpers
或其他地方,具体取决于您所采取的方法。
编辑:听起来像是一个控制器插件就是教程推荐的内容,在这种情况下你需要一个像Yourapp_Plugin_Acl
这样的类(用你的应用程序命名空间替换'Yourapp')它将生活在application/plugins/Acl.php
。
答案 1 :(得分:1)
您不必将库中的acl.php作为插件放置。自动加载器会很好地加载类,Zend_Acl的技巧就是用你的角色和资源来启动类的实例。
自从我接触Zend Framwork以来已经有一段时间了,但我会试着引导你朝着正确的方向前进。
在引导程序中,创建Zend_Acl对象
$ acl = new Zend_Acl(); //查看有关如何添加角色和资源的文档
现在在Controller目录中创建一个Plugin文件夹,这将允许您使用您的acl进行身份验证。
在里面创建一个扩展Zend_Controller_Plugin_Abstract的新类,为它自动加载器提取正确的类名。
将您创建的acl存储在注册表中并在插件中覆盖preDispatch方法,从这里您可以访问请求,并且您可以根据需要验证acl(来自zend注册表)。 (有些人将控制器/动作作为其他模型的资源。它非常自由。
使用前端控制器注册插件。
$ frontController-> registerPlugin(new My_Controller_Plugin_Acl());
这可能是其他教程的建议(或其变体),有时可能会有点混乱。
答案 2 :(得分:1)
最终,只要您的自动加载器配置足以找到它,您就可以将它放在任何您想要的位置。确切地说,如何使用它取决于您试图保护的资源和特权。
但是您认为您在实例化ACL和查询ACL时感到困惑。
您很可能在引导期间实例化/填充ACL对象,并将其存储在Bootstrap
注册表或Zend_Registry单例中。
如果您的资源是控制器而您的权限是操作,则通常使用查询ACL对象的preDispatch()
插件拦截调度周期。
所以,我们真的在看两个不同的类/对象:
一个是ACL本身,扩展了Zend_Acl
。这个可以命名为Application_Model_Acl
并放在文件application/models/Acl.php
。
另一个是前端控制器插件。这个可以命名为Application_Plugin_Acl
并存储在文件application/plugins/Acl.php
[请注意,这两个都假定我们正在使用应用程序命名空间Application
。另请注意,这些都是特定于项目的。]
当然,所描述的插件需要被赋予ACL对象才能完成它的工作,所以你的Bootstrap可能有这样的方法:
protected _initAclPlugin()
{
$acl = new Application_Model_Acl();
$plugin = new Application_Plugin_Acl($acl);
Zend_Controller_Front::getInstance()->registerPlugin($plugin);
}
但请记住,这只是使用ACL的一种方法。在某些情况下,您的ACL可能不仅限于控制器/操作。在这种情况下,您可能还需要将ACL对象传递给查询它的其他模型/服务。在这种情况下,您可能在Bootstrap
中使用单独的方法来创建ACL对象并将其存储在Bootstrap
注册表中。然后你的控制器 - 甚至依赖注入系统 - 可以从那里获取它并将其传递给可能需要它的任何下游模型/服务。
[你知道,看看我的回答,它与@linead没有什么不同。同样的想法,不同的话,但他完全进入了。]