Не удается получить компонент сеанса внутри конструктора AppController

Мне нужно получить роли пользователя из базы данных.
Я хочу сделать это один раз и перед всем. Поэтому я вызываю функцию из конструктора AppController, который использует компонент сеанса. Функция приведена ниже

public function getRoles() {
    if ($this->Session->check('user_name')) {
        $username = $this->Session->read('user_name');
        $userdesc = $this->Session->read('user_desc');
        if ($userdesc === 'Student') {
            $this->roles['Student'] = true;
        } elseif ($userdesc === 'Faculty') {
            $this->roles['Teacher'] = true;

            $this->loadModel('UserRole');
            $userRolesList = $this->UserRole->getUserRolesList($username);

            $this->loadModel('Role');
            $rolesList = $this->Role->getRolesList();

            foreach($userRolesList as $userRole)
            {
                $this->roles[$rolesList[$userRole['UserRole']['role_id']]] = true;
            }
        }
    }
}

Я загружаю компонент сеанса, используя массив. Но я не могу использовать $this->Session. Если я загружаю компонент на лету, функция выдает другие ошибки. Но если я вызову эту функцию из beforeFilter(), это не создаст проблем. Почему я не могу сделать это внутри конструктора?


person user2328690    schedule 28.04.2013    source источник


Ответы (2)


вы не можете использовать $this внутри конструктора, так как $this еще не создан. объясняется здесь PHP: использование $this в конструкторе

person conner    schedule 16.05.2013

Возможно, это всего лишь дикая догадка, но... Я бы не ожидал, что AppController будет работать, если вы переопределите его конструктор. Я не уверен, почему у вас не работает функция, вызываемая в beforeFilter(), но если вы настаиваете, я бы попытался сделать следующее в вашем AppController:

__construct($request = null, $response = null) {
    parent::__contruct($request, $response);
    $this->Session = $this->Components->load('Session');
    getRoles();
    ....
}
person savedario    schedule 29.04.2013