ここで説明するようなモデルにACLをバインドするというアイデアが好きです。
しかし、これをZend Navigationとどのように組み合わせることができますか?サイトマップをレンダリングするときは、すべてのモデルをインスタンス化する必要があります。
誰かが実際に少なくとも中規模のサイトでこのアプローチを使用し、パフォーマンスの問題を解決した経験を共有できましたか?
ここで説明するようなモデルにACLをバインドするというアイデアが好きです。
しかし、これをZend Navigationとどのように組み合わせることができますか?サイトマップをレンダリングするときは、すべてのモデルをインスタンス化する必要があります。
誰かが実際に少なくとも中規模のサイトでこのアプローチを使用し、パフォーマンスの問題を解決した経験を共有できましたか?
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 を参照してください。
少し前にこの質問をしたことは知っていますが、同じ問題に直面したので、コードを共有するのは興味深いと思いました。
基本的に、私が思いついたのは、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 つの手順でナビゲーションをインスタンス化します。
あなたのブートストラップで:
$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);
それが役立つことを願っています;)