我有一个页面:如果usertype
为admin
,则该页面可以查看(并搜索)所有记录,但usertype
是standard user
他/她只能查看和搜索他/她自己的记录。
将Zend Framework
建议为best practice
。我目前正在使用Zend ACL
,所以如果我分开行动,那么我必须根据actions
更改菜单以指向不同的usertype in session
。
我可以使用controller checking the usertype
中的方法并在操作和视图中进行相关更改。
最好的方法是什么?
答案 0 :(得分:2)
着名的ACL示例:
在Blog控制器中,有publishAcion(),viewAction(), editAction(),deleteAction()。
对于未注册的用户,我们限制他发布,编辑和删除帖子的权限。
因此,您的问题与此用例类似:已注册 用户可以编辑自己的帖子,而管理员可以编辑所有帖子,理想情况下使用相同的editAction()。
根据用户的角色返回不同的结果更多是您的业务逻辑。好消息是你不必写多个动作。实际上,这可能不是一个糟糕的决定,因为您将应用程序分为两个部分:前端和管理面板。这听起来很熟悉吗?
有三种方法:
控制器方法
public function viewAction(){
$record = new Model_Record();
switch (Zend_Auth::getInstance()->getIdentity()->getRole()){
case 'admin':
$recordResult = $record->getAllRecords(); break;
case 'standard user':
$recordResult = $record->getRecordsByUserId(Zend_Auth::getInstance()->getIdentity()->getId()); break;
}
通过使用基于角色的两个动作getAllRecords()和getRecordsByUserId(),这是合乎逻辑的。您可以保持模型操作的简单性。
行动助手方法
这一方法进一步扩展了上述方法。有时您必须在不同的控制器中多次使用控制器方法。要减少重复代码(始终是最好的代码),请编写控制器操作助手:http://framework.zend.com/manual/1.12/en/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown)
<强> /library/Application/Controller/Action/Helper/GetRecordsBasedOnRole.php 强>
class Application_Controller_Action_Helper_GetRecordsBasedOnRole extends Zend_Controller_Action_Helper_Abstract
{
public function direct()
{
$record = new Model_Record();
$recordResult = array();
switch (Zend_Auth::getInstance()->getIdentity()->getRole()){
case 'admin':
$recordResult = $record->getAllRecords(); break;
case 'standard user':
$recordResult = $record->getRecordsByUserId(Zend_Auth::getInstance()->getIdentity()->getId()); break;
return $recordResult;
}
}
不要忘记告诉Zend它在哪里,将此行添加到 Application.ini :
resources.frontController.actionHelperPaths.Application_Controller_Action_Helper =“Application / Controller / Action / Helper /”
然后您可以使用一行代码在每个控制器中使用它:
$recordResult = $this->_helper->getRecordsBasedOnRole();
模型方法
function getRecordsBasedOnRole(){
$select = "SELECT * FROM recordTable";
if (Zend_Auth::getInstance()->getIdentity()->getRole() != 'admin'){
$select .= " WHERE id = " . Zend_Auth::getInstance()->getIdentity()->getId();
}
...
}
通过这种方法,您将能够在所有控制器中使用getRecordsBasedOnRole()来根据用户的角色获取数据。
$record = new Model_Record();
$recordResult = $record->getRecordsBasedOnRole()
少许糖
如果您更喜欢Action Helper Approach。您可能还没有读过这篇关于动作堆栈性能问题的好文章:http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/
但是,将Zend_Auth放入模型中以检查用户的角色也不是一个好习惯,因为这会增加额外的内存使用量。
IT行业的每一项实施都是一种权衡。在这种情况下,可能没有完美的解决方案,但模型解决方案是 更好。因为现在存储很便宜。