может кто-нибудь, пожалуйста, перевести это на английский для меня PHP Cakephp

#php #cakephp

#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) amp;amp; 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);
?>
  

Теперь все это работает, и я могу следить за большей частью происходящего, но
Меня смущает последняя строка в исавторизованном методе. Что
точно делает:

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

на самом деле вернуть?

Кроме того, приведенный выше код работает нормально, и когда я вхожу в систему как администратор, они могут нормально просматривать admin_dashboard, но после него кажется, что любая другая ссылка имеет префикс admin. Как мне остановить это? Я не хочу создавать метод admin_ для всего, включая домашнюю страницу !.

Ответ №1:

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

Необходимая роль пуста: empty($ neededRole) ИЛИ

роль ‘admin’ при сравнении без учета регистра: strcasecmp($ role, ‘admin’) == 0 ИЛИ

роль такая же, как и необходимая роль, при сравнении без учета регистра.

Таким образом, он возвращает true, если для этого не требуется роль, или роль admin, или роль совпадает с требуемой ролью, в противном случае false.

Ответ №2:

Чтобы ответить на первую часть вашего вопроса…

 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 .

Комментарии:

1. Привет, спасибо за ответ. В моем представлении макета по умолчанию у меня также есть: <?php echo $ html-> link(‘Home’, array (‘controller’ => ‘pages’, ‘action’ => ‘home’));?> — Когда я вхожу в систему как пользователь с ролью администратора, эта ссылка выше, кажется, указывает на admin / pages / home, а не просто на pages / home, как я хотел. Как я могу это исправить?

Ответ №3:

Из документации 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_* метод, но эти методы могут делегироваться обычному методу, где не требуется специальная логика.

Комментарии:

1. Привет, спасибо за ответ. В моем представлении макета по умолчанию у меня также есть: <?php echo $ html-> link(‘Home’, array (‘controller’ => ‘pages’, ‘action’ => ‘home’));?> — Когда я вхожу в систему как пользователь с ролью администратора, эта ссылка выше, кажется, указывает на admin / pages / home, а не просто на pages / home, как я хотел. Как я могу это исправить?

2. @sausageGobbler Я не думаю, что вы сможете, вам просто нужно будет создать эти методы во всех ваших контроллерах и делегировать их другим методам без префиксов, попробуйте просмотреть book.cakephp.org/view/950/Prefix-Routing

Ответ №4:

Код возвращает:

  • пустой ($ neededRole) (возвращает true / false)
  • strcasecmp($ role, ‘admin’) (возвращает 0, если равно)
  • strcasecmp($ role, $ neededRole) (возвращает 0, если равно)

Что касается маршрутизации АДМИНИСТРАТОРА, это не потребуется для ВСЕХ функций (включая домашнюю страницу). Только если вы хотите «скрыть» функции (предоставить функциональность только для администратора), тогда вы добавляете префикс admin. Затем вы можете заблокировать доступ ко всем функциям с префиксом ADMIN, если у них нет надлежащей авторизации. Это предотвратит несанкционированный доступ к этим методам. Когда вы добавляете префикс admin_ в начало метода, это означает, что он специфичен для роли АДМИНИСТРАТОРА. Администратор по-прежнему будет иметь доступ ко всему остальному.

Комментарии:

1. Привет, спасибо за ответ. В моем представлении макета по умолчанию у меня также есть: <?php echo $ html-> link(‘Home’, array (‘controller’ => ‘pages’, ‘action’ => ‘home’));?> — Когда я вхожу в систему как пользователь с ролью администратора, эта ссылка выше, кажется, указывает на admin / pages / home, а не просто на pages / home, как я хотел. Как я могу это исправить?

2. Попробуйте добавить 'admin' => false к ссылке (где находятся переменные контроллера и действия). Похоже, у вас где-то есть какая-то функциональность, которая переписывает URL-адреса, чтобы включить ADMIN. Если это не сработает, вы можете попробовать использовать метод URL для создания ссылки: $html->link('Home', '/'); или $html->link('Home', '/pages/home');