2

ここで説明するようなモデルにACLをバインドするというアイデアが好きです。

しかし、これをZend Navigationとどのように組み合わせることができますか?サイトマップをレンダリングするときは、すべてのモデルをインスタンス化する必要があります。

誰かが実際に少なくとも中規模のサイトでこのアプローチを使用し、パフォーマンスの問題を解決した経験を共有できましたか?

4

2 に答える 2

3

acl インスタンスをナビゲーションに直接渡すことができます

$view->navigation ( $navContainer )
     ->setAcl ( $this->_acl )
     ->setRole ( Zend_Registry::get ( 'role' ) );

これは、boostrap initAutoload メソッドで acl を初期化する方法です

$this->_acl = new Model_LibraryAcl ();
$fc = Zend_Controller_Front::getInstance ();
$fc->registerPlugin ( new Plugin_AccessCheck ( $this->_acl ) );

ナビゲーション xml コードを使用してナビゲーションを定義します。

<all>
    <label>All</label>
    <resource>default:programme</resource>
    <module>default</module>
    <controller>programme</controller>
    <action>list</action>
    <privilege>index</privilege>
</all>

これにより、リスト アクションのリンクが定義されます。すべてのユーザーがアクセスできるので、

$this->allow('guests', 'default:programme', array('index','list'));

これは、Zend_Acl から派生した私のライブラリ acl ファイルからのものです。詳細については、このビデオ チュートリアルZend Framework 1.8 チュートリアル 8 zend_navigation および zend_acl を参照してください。

于 2011-06-12T20:51:00.367 に答える
1

少し前にこの質問をしたことは知っていますが、同じ問題に直面したので、コードを共有するのは興味深いと思いました。

基本的に、私が思いついたのは、Xml ファイルの新しい解析方法です。そのため、モデルをナビゲーション Xml 構成ファイルに直接インスタンス化できるため、権限が ACL ツリーに正しく追加されます。

まず、私の Xml メニューを見てみましょう。

<?xml version="1.0" encoding="UTF-8" ?>
<configdata>
    <nav>
        <dashboard>
            <label>Dashboard</label>
            <controller>index</controller>
            <action>index</action>
            <class>icon-dashboard</class>
                    <resource>Model_Dashboard_Dashboard</resource>
        </dashboard>
        <members>
            <label>Members</label>
            <controller>members</controller>
            <action>index</action>
                    <resource>Model_Members_Members</resource>
            <class>icon-members</class>
            <pages>
                <members-list>
                    <label>Members list</label>
                    <controller>members</controller>
                    <action>list</action>
                    <resource>Model_Members_List</resource>
                    <privilege>list</privilege>
                </members-list>
            </pages>
        </members>
        <charts>
            <label>Charts</label>
            <controller>charts</controller>
            <action>index</action>
                    <resource>Model_Charts_Charts</resource>
            <class>icon-charts</class>
        </charts>
        <documents>
            <label>Documents</label>
            <controller>documents</controller>
            <action>index</action>
                    <resource>Model_Documents_Documents</resource>
            <class>icon-documents</class>
        </documents>
    </nav>
</configdata>

ここで興味深いのは、リソース属性です。実際には、それらはすべて、私のモデルを表すクラスです。

さて、おそらく Zend のドキュメントでお気づきでしょう:

注:戻り型

Zend_Config_Xmlに読み込まれた設定データは、常に文字列として返されます。文字列から他の型へのデータの変換は、特定のニーズに合わせて開発者に任されています。

つまり、私のモデルは文字列にキャストされます...残念です! この動作を防ぐために、リソース文字列をオブジェクトに変換する次の関数を使用しました。

public static function convertNavigationAclToObject($config)
{
    foreach ($config as $key => $value) {
        if (is_string($value) AND $key === "resource") {
            $config[$key] = new $value;
            break;
        } elseif (is_array($value)) {
            $config[$key] = self::convertNavigationAclToObject($value);
        }
    }
    return $config;
}

この関数を使用すると、すべての値を再帰的にオブジェクトに変換できるため、同時に権限を設定できます (モデルで許可、拒否... setAcl())。

最後に、次の 3 つの手順でナビゲーションをインスタンス化します。

  1. XML ファイルから構成を取得する
  2. リソース文字列をオブジェクトに変換する
  3. Zend_Navigation のインスタンス化

あなたのブートストラップで:

$config = new Zend_Config_Xml(APPLICATION_PATH . /modules/default/views/navigation/navigation.xml', 'nav');
$pages = My_Utils::convertNavigationAclToObject($config->toArray());
$container = new Zend_Navigation($pages);

それが役立つことを願っています;)

于 2012-03-02T14:13:09.977 に答える