kimono
@kimono
Web developer

Почему метод className() в yii2-basic не работает как надо?

Установил приложение yii2-basic с нуля. В конфиге web.php изменяю строку:
Было:
'user' => [
  'identityClass'   => 'app\models\User',
  'enableAutoLogin' => true,
],

Стало:
'user' => [
  'identityClass'   => app\models\User::className(),
  'enableAutoLogin' => true,
],

В итоге ошибка 500. В логах
PHP Fatal error:  Class 'app\\models\\User' not found in ...

Причем в yii2-advanced такое работает без танцев.
  • Вопрос задан
  • 613 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
в Yii advanced предварительно устанавливаются базовые алиасы, т.е. приблизительно схема такая:
1. Устанавливаются алиасы
2. Загружается конфигурация
3. Запускает приложение с загруженной конфигурацией

Соответственно на момент загрузки конфигурации php уже знает к какому алиасу какой путь относиться. В basic же предварительной установки алиасов не производиться, т.е. загружается конфигурация, потом запускается приложение, в процессе запуска которого происходит установка алиасов. Поэтому в момент загрузки конфига php просто еще не знает что такое app. Т.е. Вы обращаетесь к классу app\models\User::className() но php в этот момент не знает что такое app, т.к. этот алиас еще не определен.
Вы можете самостоятельно определить алиасы до момента загрузки приложения используя метод Yii::setAlias
Ответ написан
kimono
@kimono Автор вопроса
Web developer
После шатаний по коду фреймворка выяснилось, что дело, действительно, как подметил Максим Федоров, в том, что в приложении app-advanced мы до запуска приложения определяем алиас common путем подгрузки файла bootstrap, в том время как в приложении app-basic мы не определяем в процессе загрузки алиас app. В этом и отличие.
Единственное с чем я не могу согласиться - что app и common это алиасы. В действительности это, конечно же, неймспейсы. Но автолоадер фреймворка устроен так, что когда принимает неймспейс, он добавляет к нему собачку и превращает в алиас вот здесь, а уже там ищет эти классы.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Isolution666
@Isolution666
Full-Stack Developer
Здравствуйте.
--
Вас ждёт ещё один сюрприз. Дело в том что разработчики Yii2 Framework, решили вопрос с нагрузками на сайте, и им пришлось отказаться от ::className(), так как в php7 уже есть решение по обращению к классам, то вся конструкция будет заменена на ::class().

Так что, даже если вы решите вопросы с алиасами, ваши классы могут опять перестать работать. Лично я нахожу удобным такое обращение к классам, заметно сокращается код, да и по показаниям дэбагера всё гораздо лучше ))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы