我想在新的CakePHP 3.0中创建一个菜单,我发现使用cells可能是一个好方法。所以我要说我创建了 UserMenuCell
class UserMenuCell extends Cell {
protected $_validCellOptions = [];
public function display() {
$menu = [];
$menu[] = $this ->menu( __('Dashboard'), array( 'controller' => 'Users', 'action' => 'dashboard' ), 'fa-dashboard', [] );
if( $this -> Auth -> isAuthorized(null, ??? ))
$menu[] = $this ->menu( __('Barcodes'), array( 'controller' => 'Barcodes', 'action' => 'index' ), 'fa-table', [] );
$this -> set ( 'menu', $menu );
}
private function menu( $title, $url = [], $icon, $submenu = [] ) {
return ['title' => $title, 'url' => $url, 'icon' => $icon, 'submenu' => $submenu]; }
}
但我只想在当前用户有权管理条形码时显示条形码项。我该怎么做?我甚至无法访问$ this - >验证以获取当前用户。
在我的手机模板中,一切正常。我只需要为菜单创建这个嵌套数组。
答案 0 :(得分:1)
根据Cookbook的说法,会议可以从细胞内获得。
class UsermenuCell extends Cell
{
public function display()
{
var_dump($this->request->session()->read('Auth'));
}
}
像这样,您可以在单元格显示功能中阅读所需的信息。
答案 1 :(得分:0)
如果你传递会话变量?
<?= $this->cell('userMenu', $this->Session->read('Auth')); ?>
答案 2 :(得分:0)
我可以使控制器具有静态方法,例如静态公共函数_isAuthorized($user, $request)
,它将处理授权逻辑(因此每个控制器只控制它自己的权限)。
然后我可以从任何地方拨打电话,例如PostsController::_isAuthorized($user, ['action' => 'add'])
。这应该解决我猜的所有问题。
同样好的一点是将$this -> Auth -> user()
传递到视图中,因此可以在单元格中使用(通过参数)。
<强> SRC /控制器/ AppController.php 强>
public function beforeFilter(Event $event) {
$this -> set('user', $this -> Auth -> user());
}
<强>的src /查看/小区/ MenuCell.php 强>
use App\Controller\PostsController; // Don't forget to use namespace of your Controller
class MenuCell extends Cell {
public function display($user) {
$menu = [];
if (PostsController::_isAuthorized($user, ['action' => 'add'])) // In that method you must handle authorization
$menu[] = ['title' => 'Add post', 'url' => array('controller' => 'Posts', 'action' => 'add')];
$this -> set ('menu', $menu); // Handle this in Template/Cell/Menu/display.ctp
}
}
src / Template / Cell / Menu / display.ctp - 只是为了展示如何渲染菜单
<ul>
<?php foreach($menu as $item) {
echo '<li>' . $this -> Html -> link ($item['title'], $item['url']);
} ?>
</ul>
src / Template / Layout / default.ctp - 主要布局中的渲染菜单
<?= $this -> cell('Menu', array($user)) /* This is the user passed from beforeFilter */ ?>
然后您可以使用isAuthorized
方法。例如,您可以修改AppController
。总是当 CakePHP 调用isAuthorized
函数时,它将被重定向到YourNameController::_isAuthorized()
静态方法(如果存在)。
<强> SRC /控制器/ AppController.php 强>
public function isAuthorized( $user ) {
$childClass = get_called_class();
if(method_exists($childClass, '_isAuthorized'))
return $childClass::_isAuthorized($user, $this -> request);
return static::_isAuthorized($user, $request);
}
static public function _isAuthorized($user, $request)
{
if ($user['role'] == 'admin')
return true;
return false; // By default deny any unwanted access
}
这是您的控制器的一个示例。您只能指定静态_isAuthorized($user, $request)
方法,因为出于 CakePHP 默认行为的目的,它将从AppController::isAuthorized
调用(参见上面的代码)。
<强> SRC /控制器/ PostController.php 强>
static public function _isAuthorized($user, $request)
{
$action = ($request instanceof Cake\Network\Request) ? $request -> action : $request['action'];
if($action == 'add' && $user['role'] == 'CanAddPosts')
return true;
return parent::_isAuthorized($user, $request);
}
正如您所见,我发出$ request请求接受数组或 Cake \ Network \ Request 对象。那是因为 CakePHP 用 Request 对象调用它,但是当我调用它时我不需要创建这个对象,因为我的参数很简单(参见上面的代码 MenuCell.php )。
当然,您现在可以执行更复杂的逻辑,例如用户可以用逗号分隔更多角色,您可以explode这个并检查用户是否有in_array的权限。 现在它取决于你的权限背后的逻辑是什么。每个控制器都可以处理它自己的权限管理,同时您可以随时访问每个用户和每个页面请求的这些权限。