有人可以请把这个英文给我PHP PHP CakePHP

对不起,有点愚蠢的屁股,但我试图学习,并一直在看这几天,但我仍然不完全确定它是如何工作的。 我正在关注使用前缀的离线教程。

本教程说明了这一点:1 - 取消注释core.php中的管理路由前缀

2 - 将以下内容添加到users_controller.php:

public function dashboard() {
        $role = $this->Auth->user('role');
        if (!empty($role)) {
                $this->redirect(array($role=>true, 'action'=>'dashboard'));
        }
}

public function admin_dashboard() {
}

public function manager_dashboard() {
}

3 - 为上述创建三个视图

4 - 在app_controller中添加适当设置的授权和会话组件,然后添加:

        public function isAuthorized() {
                $role = $this->Auth->user('role');
                $neededRole = null;
                $prefix = !empty($this->params['prefix']) ? $this-
>params['prefix'] : null;

                if (!empty($prefix) && in_array($prefix,
Configure::read('Routing.prefixes'))) {
                        $neededRole = $prefix;
                }
                return (empty($neededRole) || strcasecmp($role, 'admin') == 0 ||
strcasecmp($role, $neededRole) == 0);
        }

5 - 在默认布局中:

<?php
        $dashboardUrl = array('controller'=>'users', 'action'=>'dashboard');
        if (!empty($user['role'])) {
                $dashboardUrl[$user['role']] = true;
        }
        echo $this->Html->link('My Dashboard', $dashboardUrl);
?>

现在整个事情都起作用了,我可以跟随大部分发生的事情,但我对isAuthorized方法的最后一行感到困惑。 究竟是什么:

return    (empty($neededRole)             || 
           strcasecmp($role, 'admin')== 0 ||
           strcasecmp($role, $neededRole) == 0);

实际返回?

另外,上面的代码工作正常,当我以管理员身份登录时,他们可以查看admin_dashboard,但看起来其他任何链接似乎都有管理员前缀。 我如何阻止这种情况发生? 我不想为包括主页在内的所有内容创建一个admin_方法!


empty($neededRole) || 
strcasecmp($role, 'admin') == 0 || 
strcasecmp($role, $neededRole) == 0

所需的角色是空白/空的:空($ neededRole)或
在不区分大小写的情况下比较时,角色是'admin':strcasecmp($ role,'admin')== 0或者
当以不区分大小写的方式进行比较时,角色与所需角色相同。

所以如果它不需要角色或者角色是admin,或者角色与所需角色相同,则返回true,否则返回false。


为了解决你的问题的第一部分...

return (empty($neededRole) || strcasecmp($role, 'admin') == 0 || strcasecmp($role, $neededRole) == 0);

这返回一个布尔值。 重新安排它,这样做更有意义一点:

return (
        empty($neededRole)
     || strcasecmp($role, 'admin') == 0
     || strcasecmp($role, $neededRole) == 0
);

因此,如果满足以下三个条件中的任何一个,它将返回true:

  • empty($neededRole)true
  • strcasecmp($role, 'admin')等于0
  • strcasecmp($role, $neededRole)等于0
  • 根据文件,如果两个参数相同,那么最后两个将等于零。 所以,如果出现以下情况,函数将返回true

  • 没有$neededRole值或;
  • $role与“admin”或者“
  • $role如果与$neededRole相同
  • 如果这些条件都不符合,它将返回false


    从文档http://php.net/manual/en/function.strcasecmp.php strcasecmp比较字符串忽略大小写,如果它们相同返回0,所以最后一行说:

    If the needed role is empty (you don't need a role)
        You are authorized
    OR IF your role is 'admin'
        You are authorized
    OR IF your role is the needed role 
        You are authorized
    ELSE
        You are not authorized
    

    至于你的其他问题,我不确定,但我很确定你确实需要一个admin_*方法,但是这些方法可以委托给不需要特殊逻辑的普通方法。

    链接地址: http://www.djcxy.com/p/58825.html

    上一篇: can someone please put this in english for me PHP Cakephp

    下一篇: Cakephp: Routing and default views