Откуда берётся неймспейс app и как он работает?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Откуда берётся неймспейс app и как он работает?

Сообщение i-programmer »

Я знаю в целом как работают наймспейсы, знаю как работать с composer и psr-4, знаю как работает автозагрузка. То есть заранее спасибо, пожалуйста, пожелания "почитай документацию" не пишите.

Вопрос такой: у фреймворка в composer.jsonне прописано строк в виде

Код: Выделить всё

"autoload": { "psr-4": { "app\\": "." } }


При этом PHP понимает, что все классы должны начинаться с app\. Если я создам класс /hello/test/Testy.php с неймспейсом app\hello\test и буду использовать класс в SiteController::actionIndex то всё работает нормально, а если неймспейс будет например yo\hello\test и при этом я это не пропишу в comoser.json, то получу ошибку
Class ' 'yo\hello\test\Testy'' not found
Притом что тот же PHPStorm вполне всё видит и ошибки не идентифицирует.

Подскажите, как это работает? Это на уровне фреймворка где-то идёт анализ префикса app\ и попытка сделать include файла от корня или у compser префикс вшит по дефолту?

Судя по ошибке - ошибку кидает именно php, а фреймворк просто её красиво отображает. Но я могу ошибаться
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Откуда берётся неймспейс app и как он работает?

Сообщение i-programmer »

В целом нашёл ответ подебажив.

В index.php подключается Yii.php, который загружает файлы и в том числе вызывает метод autoload базового класса BaseYii. Он выболяет такую строку:

Код: Выделить всё

 public static function autoload($className) {
       ...
            $classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false);
            if ($classFile === false || !is_file($classFile)) {
                return;
            }
     ...
    }
То есть из прилетающего пути идёт попытка связать с алиасом. И если алиас @app ведёт на $this->getBasePath(), то алиаса yo не существует и поэтому происходит ошибка. Если определить путь для такого алиаса, то всё будет работать (или же через composer.json через зык-4 autoload определять)
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Откуда берётся неймспейс app и как он работает?

Сообщение unknownby »

i-programmer писал(а): 2024.01.11, 20:54 Судя по ошибке - ошибку кидает именно php, а фреймворк просто её красиво отображает. Но я могу ошибаться
Доброго времени суток. Я бы посоветовал глянуть каким образом библиотеки с отличным нэймспейсом от app/ подключаются в Yii2, внутри vendor.
Ведь вы можете создать любой неймспейс для своей библиотеки.
Если в базовой версии идёт (или раньше шло) все от app/, то в продвинутой версии другие нэймспейсы :D
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Откуда берётся неймспейс app и как он работает?

Сообщение i-programmer »

unknownby писал(а): 2024.01.22, 23:09 Доброго времени суток. Я бы посоветовал глянуть каким образом библиотеки с отличным нэймспейсом от app/ подключаются в Yii2, внутри vendor.
Ведь вы можете создать любой неймспейс для своей библиотеки.
Если в базовой версии идёт (или раньше шло) все от app/, то в продвинутой версии другие нэймспейсы :D
Ну с вендорами всё вполне понятно. Там у них composer.json c указанием autoload/psr-4. Это на изи)) В этом был нюанс фреймворка, что у него в композере не было такого. Так или иначе я сам ответ на свой вопрос дал выше. Если интересно - прочитайте))
Ответить