Переменная CakePHP, установленная в AppController, видна в одном контроллере и не видна в другом

В cakephp 2.0 я пытаюсь установить переменную в AppController, чтобы она была доступна в любых подклассах и представлениях следующим образом:

function beforeFilter() {       
    $this->set('lang', self::getCurrentLanguage()); // set to access it also from Views
    $this->set('conf', self::getConfig());          // set to access it also from Views     
    $this->lang = self::getCurrentLanguage();   // set to access it also from Controllers
    $this->conf = self::getConfig();            // set to access it also from Controllers
    $this->set('user', $this->Session->read('User'));
    $this->user = $this->Session->read('User');     
}

Все работает гладко, когда я использую echo $lang; в представлении и повторите $this->lang в любых контроллерах, кроме одного с соответствующим представлением:

echo $conf;
echo $lang;
---
Notice (8): Undefined variable: conf [APP\views\admin\products.ctp, line 7]
Notice (8): Undefined variable: lang [APP\views\admin\products.ctp, line 8]

Поскольку класс AdminController расширяет AppController, я ожидаю такого же поведения, как и любой другой подкласс AppController. Уже потратил полдня на то, чтобы найти, где может быть проблема. Где находится отправная точка расследования? Что я должен проверить в первую очередь?

Что не так с AdminController, поскольку он не «видит» эти переменные, но у других классов нет этой проблемы? Это единственный обходной путь, который работает для этого конкретного класса:

$this->set('conf', parent::getConfig());

person djtester    schedule 12.12.2015    source источник
comment
Обновление: я попытался поместить exit() в AppController. Похоже, что AdminController не реагирует ни на какие изменения в AppController, поэтому не видит не только установленных в нем переменных, но и не видит весь контроллер!   -  person djtester    schedule 12.12.2015


Ответы (1)


Проверьте, не определили ли вы AdminController::beforeFilter() и забыли вызвать AppController::beforeFilter().

In AdminController:

public function beforeFilter() {
    parent::beforeFilter();
}

Об этом предупреждает раздел App Controller в Cookbook. :

Также не забудьте вызывать обратные вызовы AppController внутри обратных вызовов дочернего контроллера для достижения наилучших результатов:

person Inigo Flores    schedule 12.12.2015
comment
Отлично подмечено! Ни один из других контроллеров, кроме AdminController, не был определен перед фильтром! Поэтому добавление parent::beforeFilter(); конечно, решил переменную видимость в AdminController и спас мой день ;) Спасибо! - person djtester; 12.12.2015
comment
@djtester Мы все были там хотя бы раз :) - person Inigo Flores; 12.12.2015