我喜歡的結合ACL來模型的想法喜歡這裏描述:Zend的ACL在模型VS Zend的導航
但我怎麼能結合這與Zend的導航?在渲染站點地圖時,我必須實例化所有模型。
是否有人在至少中等規模的網站上實際使用了這種方法,並且可以分享他解決性能問題的經驗?
我喜歡的結合ACL來模型的想法喜歡這裏描述:Zend的ACL在模型VS Zend的導航
但我怎麼能結合這與Zend的導航?在渲染站點地圖時,我必須實例化所有模型。
是否有人在至少中等規模的網站上實際使用了這種方法,並且可以分享他解決性能問題的經驗?
你可以傳遞一個ACL實例直接到導航
$view->navigation ($navContainer)
->setAcl ($this->_acl)
->setRole (Zend_Registry::get ('role'));
這是我如何初始化的ACL在我的自舉initAutoload方法
$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 tutorial 8 zend_navigation and 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()
)。
最後,我實例化我的導航分三步:
在你的引導:
$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);
希望它能幫助;)
謝謝。這是顯而易見的部分,但是如何在導航ACL中存儲模型時添加規則? – takeshin 2011-06-12 21:21:47
看看我的編輯。 – 2011-06-13 08:05:49
感謝您的編輯,但看起來你並不完全明白我在問什麼:)我在詢問實體中的ACL,而不是ACL *作爲模型。 – takeshin 2011-06-13 18:51:11