1

Zend_Navigationを正しく機能させることができません。

AUth / Doctrineを使用してユーザーにログインするとき、多対多のテーブルからユーザーに割り当てられた役割(通常はそれらのいくつか)を引き出します。

次に、bootstrap.phpの行で次のようにします。$ view-> Navigation($ navContainer)-> setAcl($ this-> _ acl)-> setRole($ this-> _ role);

エラーが発生します:'$ roleは文字列、null、またはZend_Acl_Role_Interfaceのインスタンスである必要があります。与えられた配列'

ただし、foreachを使用してロールをループすると、前のロールが次のロールに上書きされ、最後のロールのナビゲーションのみが取得されます。

誰かがこれに対する論理的な解決策を持っていますか?

本当に感謝します、アダム

4

2 に答える 2

1

私は同じ問題を抱えていましたが、少し異なる角度から解決策に取り組みました。Zend_Navigation2 つ以上のロールを受け入れるようにオブジェクトを変更する代わりにZend_Acl、メソッドを拡張および変更して、isAllowed()それらすべてのロールをチェックするようにしました。Zend_Navigationオブジェクトはメソッドを使用するためisAllowed()、これをオーバーライドすると問題が解決しました。

My_Acl.php

<pre><code>
class My_Acl extends Zend_Acl
{
    public function isAllowed($role = null, $resource = null, $privilege = null)
    {
        // Get all the roles to check against
        $userRoles = Zend_Registry::get('aclUserRoles');
        $isAllowed = false;

        // Loop through them one by one and check if they're allowed
        foreach ($userRoles as $role)
        {
            // Using the actual ACL isAllowed method here
            if (parent::isAllowed($role->code, $resource))
            {
                $isAllowed = true;
            }
        }

        return $isAllowed;
    }
}
</code></pre>

次に、 のインスタンスを作成する代わりにZend_Acl、 を使用My_Aclして、それをナビゲーション オブジェクトに渡すと、動作するはずです。

于 2013-03-22T08:17:05.560 に答える
0

isAllowed() を絶対にオーバーライドしてはいけません。解決策はあります。Zend_Acl_Role_Interface を実装するクラスを作成し、メモリが機能する場合は getRole() メソッドを 1 つ定義する必要があります。実際、これはユーザーを認証するために使用するモデルになり、そのクラスがロールの決定を処理できるようになります。ユーザーは 1 つのロールのみを持つ必要があります。リソースへのアクセスを複数のロールのユーザーに許可する必要があるが、特定の条件下でのみ許可する必要がある場合は、アサーションを使用する必要があります。

于 2013-08-15T21:32:58.350 に答える