Autoloding namespace

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Autoloding namespace

Сообщение Demon_id »

Всем привет!

Есть advanced приложение. Есть свой виджет. Лежит в frontend/widgets/mywidget/. В виджете несколько классов, лежат в разных подпапках. У всех классов один неймспейс - myname\mywidget.

Проблема в том, что когда я использую в других местах свой неймспейс, то приложение не находит его классы. они просто не автолоадятся.
Если бы мой виджет тянулся из вне композером, то композер в своём файле autoload_psr4.php сгенерил бы такое:

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

'myname\\mywidget\\' => array($vendorDir . '/mywidget'), 
но поскольку виджет не пакет, а просто лежит в проекте то такого не происходит.

как вариант, можно в composer.json в секцию autolod прописать мой неймспейс и путь к директории виджета. Но мне кажется что не правильно решать автолоад классов виджета через композер, поскольку виджет не есть пакетом и не грузится через композер вовсе. По-моему автолоад нужно решать йии автолоадером. как это сделать?
в йии 1.1 в конфигурации была секция importв которой можно было указать диреторию виджета и все классы оттуда загружались. что делать в йии 2?

Решение "вынеси виджет в отдельный репозиторий и грузи его композером" не предлагать.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Autoloding namespace

Сообщение anton44eg »

namespace должен совпадать со структурой папок
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Autoloding namespace

Сообщение Demon_id »

anton44eg писал(а):namespace должен совпадать со структурой папок
да ладно. вот к примеру пакет nested sets от креокодера. иам неймспейс везде

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

namespace creocoder\behaviors; 
а файлы находятся в диретокрии vendor/creocoder/yii2-nested-set-behavior/

и так почти везде.

так что и близко ничего там не совпадает.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Autoloding namespace

Сообщение anton44eg »

это для композера

Пожалуйста, читайте документацию http://www.yiiframework.com/doc-2.0/gui ... ading.html
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Autoloding namespace

Сообщение samdark »

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Autoloding namespace

Сообщение zelenin »

неважно композер или нет, класс должен быть в каком-то алиасе, а дальше уже структура папок, см. пример от SamDark
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Autoloding namespace

Сообщение Demon_id »

Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
спасибо. похоже это то что надо.
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Autoloding namespace

Сообщение Demon_id »

Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
и ещё вопрос. в каком месте место этой строке? в месте вызова виджета? в конфигурационном файле приложения или ещё где то?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Autoloding namespace

Сообщение zelenin »

Demon_id писал(а):
Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
 
и ещё вопрос. в каком месте место этой строке? в месте вызова виджета? в конфигурационном файле приложения или ещё где то?
в любом, но для этого иделаьно подходит bootstrap.php
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Autoloding namespace

Сообщение Demon_id »

zelenin писал(а):
Demon_id писал(а):
Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
и ещё вопрос. в каком месте место этой строке? в месте вызова виджета? в конфигурационном файле приложения или ещё где то?
в любом, но для этого иделаьно подходит bootstrap.php
там просто можно эту строчку добавить или это часть конфига и должен возвращаться массив?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Autoloding namespace

Сообщение zelenin »

Demon_id писал(а): там просто можно эту строчку добавить или это часть конфига и должен возвращаться массив?
просто добавить
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Autoloding namespace

Сообщение anton44eg »

все равно не понимаю почему не использовать загрузку по-умолчанию...
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: Autoloding namespace

Сообщение Demon_id »

Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
 
не работает такое. прописал эту строку в frontend/config/bootstrap.php

если в composer.json добавить:

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

    "autoload": {
        "psr-4": {
            "myname\\mywidget\\": "frontend/widgets/mywidget/"
        }
    }
то работает. но как я уже сказал, не хочу использовать автолоад композера.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Autoloding namespace

Сообщение zelenin »

Demon_id писал(а):
Sam Dark писал(а):

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

Yii::setAlias('@myname/mywidget', Yii::getAlias('@frontend/widgets/mywidget'));
не работает такое. прописал эту строку в frontend/config/bootstrap.php

если в composer.json добавить:

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

    "autoload": {
        "psr-4": {
            "myname\\mywidget\\": "frontend/widgets/mywidget/"
        }
    } 
то работает. но как я уже сказал, не хочу использовать автолоад композера.
должно работать
Ответить