Zend framework2 Zend ACL在不存在的资源上引发异常

Zend framework2 Zend ACL在不存在的资源上引发异常,zend-framework2,acl,Zend Framework2,Acl,我正在尝试启动并运行Zend ACL,但似乎遇到了以下问题: PHP Fatal error: Uncaught exception 'Zend\Permissions\Acl\Exception\InvalidArgumentException' with message 'Resource 'article-2' not found' in vendor/zendframework/zend-permissions-acl/Zend/Permissions/Acl/Acl.php:292

我正在尝试启动并运行Zend ACL,但似乎遇到了以下问题:

PHP Fatal error:  Uncaught exception 'Zend\Permissions\Acl\Exception\InvalidArgumentException' with message 'Resource 'article-2' not found' in vendor/zendframework/zend-permissions-acl/Zend/Permissions/Acl/Acl.php:292
我的印象是,当资源未添加到资源列表时,Zend ACL会引发异常。举个例子:

$user1 = 'user-1';
$user2 = 'user-2';

$article1 = 'article-1';
$article2 = 'article-2';

$acl = new Acl();

$acl->addRole( new Role('user') );
$acl->addRole( new Role('user-1'), 'user' );
$acl->addRole( new Role('user-2'), 'user' );

$acl->addResource( $article1 );

$acl->allow( $user1, $article1 );

echo $acl->isAllowed( $user1, $article2 ) ? 'allowed' : 'denied';
如您所见,我创建了3个角色,一个通用用户角色和两个特定于用户的角色。然后我创建了两篇文章,并允许用户1访问文章1。但是,当我现在测试用户1是否可以访问第2条时,砰,异常

“isAllowed”显然应该返回false,而不是抛出异常。假设我有1000个用户和1000篇文章,这意味着除了指定哪些用户可以访问哪些文章外,我还需要指定每个用户不能访问哪些文章。这显然会导致荒谬的长ACL和内存消耗,最重要的是,文章不是我唯一的资源类型


除了允许将
包装成
try/catch
(这显然很笨重),处理这种奇怪行为的最佳方法是什么?

我不确定你的命令是否意味着你已经没事了。 无论如何,在这种情况下,在检查是否允许某些行为之前,您可以做的只是:

 if(!$acl ->hasResource($resource))
                $acl -> addResource(new \Zend\Permissions\Acl\Resource\GenericResource($resource));

或者甚至花时间扩展默认ACL类,因此
是允许的
方法,首先包括上面的代码。这将是一个简单的实践,并将允许您在必须创建资源的地方维护原始模型,同时促进在常见或大多数用例中的易用性

深入研究这一点,我现在似乎明白了为什么会发生这种情况。上面的示例是一个硬编码示例,在动态情况下,要测试的资源将始终添加到ACL资源列表中。这意味着上面的抛出和异常的示例是正确的。谢谢你的回复。你说得对。我无法理解为什么会抛出异常,但后来我理解了为什么该行为实际上是正确的。ACL需要一个角色和一个资源。在我的问题这样的硬编码场景中,它们都应该存在。在动态场景中,您可以动态创建ACL,这两种ACL都可以随时使用。但是,您的子类解决方案可能会提供一种优雅地处理这种情况的方法,以防万一……是的,这可能很难开发,但这是可能的,因此如果将来您对ACL应该如何满足业务规则有一个很好的了解,并且您可以找出如何自动化某些方面,您可以尝试创建自己的子类。事实上,我有自己的自定义ACL,它允许我直接在路由器配置中创建访问级别等规则,这非常方便),而且它的工作非常出色。如果你想去…准备好找点乐子吧!