Ошибка при входе в систему с использованием компонента аутентификации CakePHP

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

Ошибка: вызов неопределенного метода Security::getDataSource()
Файл: C:\xampp\htdocs\ips-mvc\lib\Cake\Model\Datasource\DboSource.php
Строка: 1063

Есть идеи, что это значит?

Для справки: у меня в приложении есть модель под названием Security. Я не знал о каких-либо зарезервированных именах моделей в Cake, но есть ли шанс, что мой Security mdoel конфликтует с компонентом Cake? Эта ошибка все еще может возникать, когда модель Security не используется, хотя она появляется довольно спорадически — иногда обновление страницы приводит к тому, что все работает нормально.

Любые идеи?


person harryg    schedule 05.11.2013    source источник
comment
Я пошел дальше и изменил свою модель Security на другое имя, и теперь проблема, похоже, решена сама собой, но объяснение все равно будет оценено.   -  person harryg    schedule 05.11.2013


Ответы (1)


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

Модели и компоненты не могут иметь одинаковые имена.

Проблема не связана с повторяющимися именами классов, поскольку у моделей нет суффикса имени класса, а у компонентов есть.

Однако, например, в контроллере следующий синтаксис:

$this->{$alias}

Используется для доступа оба к компоненту (имя класса {$alias}Component) или к модели (имя класса $alias).

Таким образом, наличие модели с тем же именем, что и у компонента, делает тот или иной компонент недоступным.

Отравление кеша

Однако проблема не останавливается на достигнутом. Объекты хранятся в реестре классов используя псевдоним в качестве ключа:

Например, в Model:

 ClassRegistry::addObject($this->alias, $this);

Если используется тот же псевдоним (Модель безопасности, SecurityComponent) — объект, занимающий ключ Security, просто добавляется в реестр первым — все последующие запросы на Security будут возвращать этот объект.

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

person AD7six    schedule 05.11.2013