Автозагрузка классов в Yii 2.X как в Yii 1.X

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.04, 16:23PSR-4 популярен, но он ещё не везде.
да везде. просто открываем гитхаб и смотрим. Нет, понятно, что есть всегда какие-то разработчики навсегда остановившиеся в развитии на уровне джуниора 2010 года, но это все маргинально.
denis909 писал(а): 2017.02.04, 16:23И как раз чтобы подключать классы где его нет, и требуется автозагрузчик
и кто использует yii2 без композера? серьезно, таких людей больше 1%?
denis909 писал(а): 2017.02.04, 16:23Когда вы будете правы в этом, и действительно 100% кода будет PSR-4, то конечно же никакие автозагрузчики не понадобяться, ведь будет прочто нечего загружать.
вот пожалуйста найдите мне yii2-расширение на гитхабе с 2+ звезд, которое написано без поддержки psr-4. Ну или вообще любую либу, созданную в последние два года.
denis909 писал(а): 2017.02.04, 16:23Про composer я сразу ответил, что при модульной архитектуре приложения, это не лучшее решение. Модуль не может влиять на composer.json приложения. И после установки модуля придется composer.json менять, это неудобно. Гораздо удобнее использовать мое расширение для этой задачи! Конечно, если у вас есть такая задача.
эм. что такое установка модуля по вашему? распаковать архив? и кто так делает, если есть composer?

погодите, вы допускаете, что люди не пользуются композером?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

вообще, все ваши доводы имеют хоть какое-то здравое зерно, только если мы говорим про проекты, в которых не используется композер.
Я не допускаю такого для любых более-менее свежих проектов, и обвиняю программистов таких проектов в профессиональной некомпетентности.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

Каждый модуль для yii фреймворка - это расширение доступное в формате composer, по вашему? Это еще более далеко от истины, чем то что все используют PSR-4 и никак иначе. Конечно если мы оба понимаем разницу между модулем приложения и библиотекой для фреймворка.

Но в целом, я понял что вы расширение даже не смотрели. Если бы смотрели, то увидели что оно доступно в виде расширения для composer, что автоматически отвечает на вопрос использую ли я его или нет.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение Loveorigami »

zelenin писал(а): 2017.02.04, 16:33
погодите, вы допускаете, что люди не пользуются композером?
То-то и оно...
1. Поставить yii2 через композер, чтоб потом не использовать композер. Расширение то под yii2.

2. Создать модуль через gii, выпилить все namespace, переименовать классы (чтоб не было совпадений). Был page\BlockController - стал PageBlockController. Значит надо переименовывать папки с видами... Затем править события, если модули между собой "общаются"
И это все ради того, чтобы не использовать namespace...
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение Loveorigami »

denis909 писал(а): 2017.02.04, 16:45 Конечно если мы оба понимаем разницу между модулем приложения и библиотекой для фреймворка.
То вы пишите про модули, теперь про библиотеку...

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

Если библиотека (или модуль) ваши из старых проектов - в чем сложность добавить namespace?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.04, 16:45 Каждый модуль для yii фреймворка - это расширение доступное в формате composer, по вашему?
конечно нет. поэтому я и спрашиваю что вы имеете в виду под модулем. ок, я понял что логическую единицу функционала приложения.
denis909 писал(а): 2017.02.04, 16:45Это еще более далеко от истины, чем то что все используют PSR-4 и никак иначе
нет, это утверждение, основанное на опыте.
denis909 писал(а): 2017.02.04, 16:45Но в целом, я понял что вы расширение даже не смотрели. Если бы смотрели, то увидели что оно доступно в виде расширения для composer, что автоматически отвечает на вопрос использую ли я его или нет.
конечно смотрел. вы просто невнимательны к сути вопроса. я спрашиваю о другом - допускаете ли вы, что кто-то устанавливает расширения без композера, в т.ч. и ваше?
хорошо, я так понимаю, что вы за композер.
тогда зачем мне вот это:

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

    'components' => [
        'import' => [
            'class' => '\denis909\yii\ImportComponent',
            'config' => [
                "application.components.*",
                "webroot.classes.*",
                "application.test.TestComponent.php"
            ]
        ]
    ],
если есть вот это:

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

    "autoload": {
        "psr-4": {
            "": [
                "app/components",
                "app/classes"
            ]
        },
        "files": ["app/test/TestComponent.php"]
    }
то есть первый вариант нужен только тогда, когда в проекте не используется композер. Я спрашиваю: вы допускаете, что в современном проекте не используется композер?
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

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

Достаточно продолжительное время, работал над проектом, суть которого была в работе с платежными системами.
Архитектура системы была модульная, на каждую ПС в папке app\modules был отдельный модуль.
Практически каждый модуль содержал папку classes в которой был сервисный слой для работы с ПС, который чаще всего писали авторы ПС, некие библиотеки для работы с данной ПС.
Было подключено десятки платежных систем, и ни в одной из них библиотеки предоставляемые разработчиком не были ни в каких NS.

Какие могут быть способы решения этой задачи, пойдем по пунктам:

1. Вы советуете вообще не использовать классы без NS, а если такие есть, то добалять в них NS самому.
В этом случае при каждом обновлении библиотек автором, мне пришлось бы снова выполнять эту работу.
И если кого-то не смущает постоянно что-то ковырять ради светлого и великого, то ни один вменяемый работодатель таких регулярных ковыряний ни оценит, т.к. он за это платит.

Подчеркну ещё раз, ни одна из ПС не предоставила библиотеки в неймспейсах, ни одна...

2. Раз уж от классов без NS не уйти, то вы советуете подключать их через composer утверждая что это так-же удобно как и через расширение.
Архитектура системы модульная, это значит что в определенной копии системы может быть разное количество модулей, подключение и отключение которых должно быть максимально
комфортна для владельца конечной копии системы. При этом мы имеем дело не с опен соурс, который можно на гитхаб залить, а с приватной корпоративной системой.
Вообщем, если подключать классы через composer то получится что:

1. При каждой установке нового модуля придется пересобирать библиотеки приложения.

2. Установка модуля будет в 2х местах, надо прописать что-то в конфиг фреймворка, и в настройки composer.

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

Composer в принципе может решить эту задачу, но сделает это не так хорошо, а при модульной архитектуре совсем не хорошо.

Я не призываю вас повсеместно использовать классы без NS, но если вам все-таки придется это делать, то для Yii 2, более удобного способа сделать это, чем через мое расширение, не существует.

https://github.com/denis909/yii2-autoload-classes
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение Onotole »

Рекомендую написать статью на хабре по этому вопросу. Аргументов у Вас достаточно. Может, действительно, мы чего-то не понимаем и нужно делать именно так?
В packagist полно библиотек для работы со всеми известными ПС. Прописали в composer.json и используй как душе угодно
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.05, 12:00 Раз уж мои теоретические аргументы не находят никакой поддержки
я вам задаю наводящие вопросы - вы на них не отвечаете. это все, что я вижу.
denis909 писал(а): 2017.02.05, 12:00Достаточно продолжительное время, работал над проектом, суть которого была в работе с платежными системами.
Архитектура системы была модульная, на каждую ПС в папке app\modules был отдельный модуль.
Практически каждый модуль содержал папку classes в которой был сервисный слой для работы с ПС, который чаще всего писали авторы ПС, некие библиотеки для работы с данной ПС.
Было подключено десятки платежных систем, и ни в одной из них библиотеки предоставляемые разработчиком не были ни в каких NS.
хороший кейс
denis909 писал(а): 2017.02.05, 12:001. Вы советуете вообще не использовать классы без NS, а если такие есть, то добалять в них NS самому.
В этом случае при каждом обновлении библиотек автором, мне пришлось бы снова выполнять эту работу.
И если кого-то не смущает постоянно что-то ковырять ради светлого и великого, то ни один вменяемый работодатель таких регулярных ковыряний ни оценит, т.к. он за это платит.
никто не советует "не использовать" - советуют "не писать самому". Сторонние либы на то и сторонние.
denis909 писал(а): 2017.02.05, 12:002. Раз уж от классов без NS не уйти, то вы советуете подключать их через composer утверждая что это так-же удобно как и через расширение.
Архитектура системы модульная, это значит что в определенной копии системы может быть разное количество модулей, подключение и отключение которых должно быть максимально
комфортна для владельца конечной копии системы. При этом мы имеем дело не с опен соурс, который можно на гитхаб залить, а с приватной корпоративной системой.
Вообщем, если подключать классы через composer то получится что:

1. При каждой установке нового модуля придется пересобирать библиотеки приложения.

2. Установка модуля будет в 2х местах, надо прописать что-то в конфиг фреймворка, и в настройки composer.
вы все еще не поняли. composer предоставляет вам готовый автозагрузчик для всех кейсов. Вместо установки своего расширения для автозагрузки и прописывания своих кейсов в конфиге расширения, вы можете НЕ устанавливать свое расширение и прописывать свои кейсы в composer.json своего проекта. в конце запустить composer dump-autoload (по памяти вспоминаю) и автозагрузчик создан.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.05, 12:00Я не призываю вас повсеместно использовать классы без NS, но если вам все-таки придется это делать, то для Yii 2, более удобного способа сделать это, чем через мое расширение, не существует.
это ложь. самый удобный и стандартный способ для любой библиотеки - это composer. Это один способ, который надо знать для всех кейсов.
Возможно вы так и не понимаете, что composer - не только тулза для установки сторонних либ, но и тулза для управления автозагрузчиком классов вашего проекта.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

Onotole писал(а): 2017.02.05, 12:10 Рекомендую написать статью на хабре по этому вопросу. Аргументов у Вас достаточно. Может, действительно, мы чего-то не понимаем и нужно делать именно так?
нет ни одного аргумента. на все аргументы можно ответить, что это есть в composer. Соответственно мой вопрос и звучит как "вы это создали для проекта без композера"? но расширение устанавливается через композер. тогда непонятно зачем оно вообще нужно, если композер выполняет задачу расширения.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

поймите, я позитивно к вам настроен и не хочу вас гнобить. но вы не даете аргументов, на которые нельзя ответить "есть композер" и пишете, что ваших доводов не понимают. Давайте разбираться. Давайте ваши аргументы без участия композера. На данный момент я вижу, что причина создания вашего расширения ложна.
Последний раз редактировалось zelenin 2017.02.05, 12:24, всего редактировалось 1 раз.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

Onotole писал(а): 2017.02.05, 12:10 Рекомендую написать статью на хабре по этому вопросу. Аргументов у Вас достаточно. Может, действительно, мы чего-то не понимаем и нужно делать именно так?
В packagist полно библиотек для работы со всеми известными ПС. Прописали в composer.json и используй как душе угодно
Чтобы еще один поток говна разгребать? Я позиционирую себя не теоретиком, а ремесленником.
Есть задача - есть решение.
Решением доволен, поделился с другими.
Всё.

По поводу packagist. Почти каждый банк имеет свое АПИ, которого нет в открытом доступе, и документация высылается только разработчикам. Выкладывание кода на packagist нарушит лицензию по работе с ПС, таких библиотек даже близко там нет и никогда скорее всего не будет. Я написал конкретно, код от автора ПС без NS. Это факт. Я вам также могу сказать, зачем вы пишете то что пишете, скачайте это на гитхабе, там куча хороших проектов.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.05, 12:23Чтобы еще один поток говна разгребать? Я позиционирую себя не теоретиком, а ремесленником.
Есть задача - есть решение.
Решением доволен, поделился с другими.
Всё.
но все пользуются для этой цели композером. нет смысла вторую сущность вводить для обработки автозагрузки таких классов. Даже в yii1 можно для этой цели композером пользоваться.
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение Onotole »

zelenin писал(а): 2017.02.05, 12:19
Onotole писал(а): 2017.02.05, 12:10 Рекомендую написать статью на хабре по этому вопросу. Аргументов у Вас достаточно. Может, действительно, мы чего-то не понимаем и нужно делать именно так?
нет ни одного аргумента. на все аргументы можно ответить, что это есть в composer. Соответственно мой вопрос и звучит как "вы это создали для проекта без композера"? но расширение устанавливается через композер. тогда непонятно зачем оно вообще нужно, если композер выполняет задачу расширения.
Я имел ввиду "аргументы"
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение ElisDN »

denis909 писал(а): 2017.02.05, 12:23 Выкладывание кода на packagist нарушит лицензию по работе с ПС, таких библиотек даже близко там нет и никогда скорее всего не будет. Я написал конкретно, код от автора ПС без NS. Это факт.
Мы Вам говорим только про секцию autoload, а не про загрузку с packagist.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

zelenin писал(а): 2017.02.05, 12:13 вы можете НЕ устанавливать свое расширение и прописывать свои кейсы в composer.json своего проекта. в конце запустить composer dump-autoload (по памяти вспоминаю) и автозагрузчик создан.
Я привел конкретный пример модульной архитектуры.
Конечный пользователь системы не я, и я не могу что-то прописать в его composer.
Разработчик должен предоставить zip файл с модулем и инструкцию по установке модуля.
В вашем случае эта инструкция будет содержать задачу для клиента помимо всего прочего еще и отредактировать composer.json файл и запустить пересборку библиотек.

Задача изначально была сделать установку модулей в систему простой и надежной. Редактирование composer.json и пересборка библиотек таковой не является.

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

И если вы критикуете мой вариант, то не будьте голословны, и предложите уже свой вариант, как для конечного пользователя организовать дистрибьюцию модулей, динамически расширяющих функционал системы и содержащие классы без НС. У меня для вас нету больше аргументов. Знаете как лучше, предложите, мы сравним у кого более удачно. Сравним со стороны программиста, заказчика системы котороый финансирует разработку, и со стороны конечного пользователя.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

ElisDN писал(а): 2017.02.05, 12:45
denis909 писал(а): 2017.02.05, 12:23 Выкладывание кода на packagist нарушит лицензию по работе с ПС, таких библиотек даже близко там нет и никогда скорее всего не будет. Я написал конкретно, код от автора ПС без NS. Это факт.
Мы Вам говорим только про секцию autoload, а не про загрузку с packagist.
Вашу идею про autoload я сразу понял. Но тот комментарий на который был ответ:

В packagist полно библиотек для работы со всеми известными ПС. Прописали в composer.json и используй как душе угодно

Его я понял как призыв не использовать библиотеки банков, а скачать их с packagist. На что ответил что там таких нет.
Аватара пользователя
denis909
Сообщения: 103
Зарегистрирован: 2009.04.02, 16:04
Откуда: Санкт-Петербург
Контактная информация:

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение denis909 »

ElisDN писал(а): 2017.02.05, 12:45 Мы Вам говорим только про секцию autoload, а не про загрузку с packagist.
Я привел конкретный пример модульной архитектуры.
Конечный пользователь системы не я, и я не могу что-то прописать в его composer.
Разработчик должен предоставить zip файл с модулем и инструкцию по установке модуля.
В вашем случае эта инструкция будет содержать задачу для клиента помимо всего прочего еще и отредактировать composer.json файл и запустить пересборку библиотек.

Задача изначально была сделать установку модулей в систему простой и надежной. Редактирование composer.json и пересборка библиотек таковой не является.

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

И если вы критикуете мой вариант, то не будьте голословны, и предложите уже свой вариант, как для конечного пользователя организовать дистрибьюцию модулей, динамически расширяющих функционал системы и содержащие классы без НС. У меня для вас нету больше аргументов. Знаете как лучше, предложите, мы сравним у кого более удачно. Сравним со стороны программиста, заказчика системы котороый финансирует разработку, и со стороны конечного пользователя.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Автозагрузка классов в Yii 2.X как в Yii 1.X

Сообщение zelenin »

denis909 писал(а): 2017.02.05, 12:47В вашем случае эта инструкция будет содержать задачу для клиента помимо всего прочего еще и отредактировать composer.json файл и запустить пересборку библиотек.
и не будет содержать инструкцию установки вашего расширения и редактирования конфига вашего расширения.
denis909 писал(а): 2017.02.05, 12:47Задача изначально была сделать установку модулей в систему простой и надежной. Редактирование composer.json и пересборка библиотек таковой не является.
наоборот же.
denis909 писал(а): 2017.02.05, 12:47Ваши аргументы все крутятся вокруг статичксих библиотек проекта, а не модулей динамически расширяющих функционал системы.
мои аргументы крутятся вокруг любых библиотек. Композер работает с библиотеками, не опираясь на философские парадигмы. Добавили в проект библиотеку - добавили в композер. Ваше разделение на статические и динамические либы мне не яснО.
denis909 писал(а): 2017.02.05, 12:47И если вы критикуете мой вариант, то не будьте голословны, и предложите уже свой вариант, как для конечного пользователя организовать дистрибьюцию модулей, динамически расширяющих функционал системы и содержащие классы без НС. У меня для вас нету больше аргументов. Знаете как лучше, предложите, мы сравним у кого более удачно. Сравним со стороны программиста, заказчика системы котороый финансирует разработку, и со стороны конечного пользователя.
я уже предложил - разархивировали архив с модулем, прописали в composer.json, перегенерили автозагрузчик - так делается везде, где есть вручную устанавливаемые либы. Устанавливает либу программист, поэтому ему не составит труда следовать инструкции модуля. Это не сложнее чем устанавливать через ваше расширение, зато стабильнее и стандартнее.
Ответить