Отслеживание роль пользователя


Я создал этот класс, чтобы отслеживать роли пользователя:

class UserRoleHelper extends AppHelper
{
    public $helpers = array('Session');

    private $role = NULL;

    const CUSTOMER  = 'customer';
    const ASSOCIATE = 'associate';
    const MANAGER   = 'manager';
    const ADMIN     = 'admin';
    const DEVELOPER = 'developer';

    private $score = array(
        self::CUSTOMER  => 0,
        self::ASSOCIATE => 1,
        self::MANAGER   => 2,
        self::ADMIN     => 3,
        self::DEVELOPER => 4,
    );

    public function role()
    {
        if($this->role == NULL)
        {
            $this->role = strtolower($this->Session->read('Auth.User.role')) ?: 'customer';
        }
        return $this->role;
    }

    private function is($role)
    {
       return $this->score[$this->role()] >= $this->score[$role]; 
    }

    public function admin()
    {
        return $this->is(self::ADMIN);
    }

    public function manager()
    {
        return $this->is(self::MANAGER);
    }

    public function associate()
    {
        return $this->is(self::ASSOCIATE);
    }

}

Идея в том, чтобы быть в состоянии иметь такое выражение как:

if($this->UserRole->manager())
{
    //do something
}

И оценивать значение true, если вы являетесь руководителем или выше (администратор, разработчик).

Я также попытался разработать таким образом, если есть необходимость добавить уровень как GENERAL_MANGER = 3, что приведет к изменению значений админ и разработчик один, это ничего не влияет.

Я изначально имел ключи в $результат как массив строк, но это казалось лишним, когда я была уже определены константы с одинаковыми значениями. Я никогда не видел определение массив с константами для ключей в теле класса до. Я знаю, что переменные не разрешены, но это, кажется, работает с константами. До сих пор не знаю, хотя это плохо или нет.

Я что-нибудь пропустил или могу сделать, чтобы сделать это лучше?



184
3
php
задан 4 августа 2011 в 07:08 Источник Поделиться
Комментарии
2 ответа

Использовать перечислитель?

И использовать его как это:

if($this->isInRole(Roles::MANAGER)

2
ответ дан 5 августа 2011 в 02:08 Источник Поделиться

Она выглядит хорошо, внутренняя логика инкапсулируется.

Может быть, это сравнение числа на основе ролей логика не будет работать, если у вас есть VIP_CUSTOMER и VIP_MANAGER роли и VIP_MANAGER не может управлять без вип-клиентам функции и простой менеджер не диспетчере VIP_CUSTOMERs/функции. В этом случае вы можете изменить реализацию без каких-либо изменений в клиентском коде, чтобы поддержать это.

(Например забить VIP_MANAGER в 3 и результат менеджера остается 2, то каждый VIP_MANAGER бы быть менеджером. Если результат менеджера 3 и результат VIP_MANAGER является 2, то каждый менеджер будет VIP_MANAGER. Ни один из них не является хорошим, но вы можете модифицировать менеджер (и мнимой vipManager) метод, чтобы поддержать это.
)

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

0
ответ дан 3 ноября 2011 в 07:11 Источник Поделиться