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

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

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

Сообщение denis909 » 2016.01.25, 23:26

Во второй версии фреймворка мне очень нехватало автозагрузки классов. Очень напрягало постоянно подключать каждый класс. Для решения этой проблемы я написал расширение ядра фреймворка (класса Application), которое позволяет загружать контроллеры в глобальном пространстве имен (без namespace), как это было в первой версии, а также интегрировал автозагрузчик классов из Yii 1.X.

Скачать расширение можно тут:
https://github.com/denis909/yii2-autoload-classes/

Но удобнее подключить через composer:

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

  "require": {
        "php": ">=5.4.0",
        "yiisoft/yii2": ">=2.0.5",
        "denis909/yii2-autoload-classes": "dev-master"
    }
Создайте приложение от класса Yii_Application (new Yii_Application($config))->run();

Для автозагрузки классов, нужно добавить в конфигурацию директиву import, как это было в первой версии фреймворка.

Чтобы работать в глобальном пространстве имен в контроллере, нужно не писать namespace app/contollers, т.е. опять же просто делать контроллер как раньше.

Более подробная инструкция есть у меня на сайте:
http://denis909.spb.ru/yii2-autoload-classes

Расширение сделано на основе оригинального кода Yii 1.X

UPD: По результатам обсуждения, я понял что из первоначального описания не совсем ясно что делает расширение, и какая его главная цель, исправляюсь:

Yii 2 в начале каждого класса контроллера обязывает писать так:

namespace app\controllers;

А написав так, все что внутри файла уже находится в локальном пространстве имен контроллеров, и ни один класс в таком контроллере нельзя использовать без его предварительно объявления через use, или без символа \ перед названием класса.

Расширение исправляет это, и позволяет работать с классами в контроллере без их предварительного объявления, т.к. с ним становится необязательно делать контроллеры в app\controllers, а можно работать в глобальном пространстве имен, как это было в первой версии.

Изначально, расширение было задумано для быстрого перевода проектов с первой на вторую версию фреймворка, чтобы избавить разработчика от необходимости в каждом контроллере выискивать вручную какие классы используются в контроллере и подключать их вручную. Однако, такой подход мне показался достаточно удобным, и я для себя допускаю делать так и новых проектах.
Последний раз редактировалось denis909 2016.01.27, 18:19, всего редактировалось 2 раза.

Аватара пользователя
KiTE
Сообщения: 112
Зарегистрирован: 2012.04.12, 14:47

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

Сообщение KiTE » 2016.01.25, 23:37

А чем не устроил автолоадер через неймспейсы от composer?

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

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

Сообщение denis909 » 2016.01.25, 23:45

Свое виденье неймспейсов я описывал, как раз недавно, у себя на сайте
http://denis909.spb.ru/yii2-namespaces
Если вкратце, то мне неудобно размещать классы своего приложения в пространствах имен, другое дело что в composer есть и автозагрузка без неймспейсов, но она не решает того что в Yii 2 контроллеры обязаны находится в неймспейсе, а расширение это исправляет - это его основная задача, а сама автозагрузка классов из Yii 1.X бонусом.

Аватара пользователя
ElisDN
Сообщения: 5415
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN » 2016.01.26, 00:12

Что только не сделают, лишь бы IDE не использовать...

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo » 2016.01.26, 00:26

denis909 VS технический прогресс:

Изображение

К чёрту неймспейсы! :mrgreen:
Неудобно же :mrgreen:

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

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

Сообщение denis909 » 2016.01.26, 00:41

Технический прогресс - это хорошо, главное, чтобы он не становился таким.

Изображение

Тогда, действительно, не всем удобно.

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo » 2016.01.26, 00:55

Не пробовали разобраться, зачем нужны неймспейсы, и почему их ввели в Yii2 вместо префикса C (СComponent, CApplication, etc.)?

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

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

Сообщение denis909 » 2016.01.26, 01:01

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

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin » 2016.01.26, 01:56

denis909 прикрутил к yii2 автолоадер "по старинке".
Изображение


ребят, я не верю в то, что вижу. Думаю, я через пару часов проснусь, и через минут 5 уже не вспомню об этом дурацком сне.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin » 2016.01.26, 01:58

denis909 писал(а):Я знаю зачем их ввели в Yii, в классы фреймворка, и ничего не имею против этого.
Мне не нравиться что фреймворк навязывает мне то что я свои классы, классы приложения, обязан тоже помещать в пространства имен.
Мне это не нужно для классов приложения, а библиотеки и фреймворки, конечно же, пусть находятся там.
это не фреймворк навязывает, а развитие php. Нет ни одного современного приложения, работающего без неймспейсов. Ни одного.

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole » 2016.01.26, 08:24

Бред. А с модулями как работать?

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole » 2016.01.26, 08:25

Да и вообще... "Мне нравится москвич 401, и по-этому я переставал его двигатель в свой mercedes clk"

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

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

Сообщение denis909 » 2016.01.26, 10:28

Onotole писал(а):Бред. А с модулями как работать?
Те, кто работал с Yii 1.X знает, а если вы начали свое знакомство со фреймворком только со второй версии, то особого смысла для вас реально разбираться в этом вопросе, нет.

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

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

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

Сообщение denis909 » 2016.01.26, 10:33

Onotole писал(а):Да и вообще... "Мне нравится москвич 401, и по-этому я переставал его двигатель в свой mercedes clk"
Может быть это не очевидно.., но расширение не навязывает вам какой подход использовать, и обычные контроллеры с неймспейсами продолжают замечательно работать, но у разработчика появляется выбор!
Поэтому, никаких новых двигателей, ни одна часть вашего мерседеса не пострадала.

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

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

Сообщение denis909 » 2016.01.26, 10:45

zelenin писал(а):Думаю, я через пару часов проснусь, и через минут 5 уже не вспомню об этом дурацком сне.
Думаю, нет. Спите дальше. Приятных снов.

Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

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

Сообщение Onotole » 2016.01.26, 16:31

Зачем в таком случае вообще исползовать фреймворк? Зачем использовать РНР? Пишите на асме. А-то, видишь-ли, "понапридумывали кучу всего ненужного и суют тут всем разрабам, а я не хочу так"

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

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

Сообщение denis909 » 2016.01.26, 16:46

Буду писать на чем сочту нужным.
И использовать из этого то, что сочту нужным, так, как считаю нужным, а то что не сочту нужным, использовать не буду.

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

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

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo » 2016.01.26, 17:02

denis909, вы фактически неймспейсы заменили их искусственной реализацией из первой версии:

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

"application.components.*",
"webroot.classes.*",
"application.test.TestComponent.php"
Я понимаю, в чём профит для вас - не приходится в клиентском коде для всех своих классов прописывать:

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

use ...;
Но неужели это так страшно? Может быть дело в неудобной IDE?

Для меня большей проблемой было бы вручную объявлять это:

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

"application.components.*",
"webroot.classes.*",
"application.test.TestComponent.php"
Потому что IDE это автоматом не делает.

Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

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

Сообщение rugabarbo » 2016.01.26, 17:04

К тому же для сторонних библиотек вам всё равно приходится прописывать use ... - ведь от чужих неймспейсов никуда не денешься. Выходит достаточно неконсистентный код: свои классы вы импортируете механизмом 1.0, а внешние за счёт неймспейсов. Так?

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

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

Сообщение denis909 » 2016.01.26, 17:26

rugabarbo, да в целом всё верно описали!

Но для меня не проблема добавить components.* и models.* в IDE, вручную, в настройки проекта (кстати в некоторых IDE даже добавлять не надо, классы внутри файлов прекрасно находятся), а для контроллеров автокомплит мне не нужен, т.к. они не вызываются в приложении другими его частями.

Вообще, изначально цель была как можно меньшими усилиями использовать некоторый код из Yii 1.X в Yii 2.X, но то что получилось мне понравилось, очень удобно, поэтому и для новых приложений такой подход имеет место быть.
Мне нравится не столько то что идет экономия на лишних символах, а то что код получается "чистый", и если переопределить файлы фреймворка то можно не запоминать пути, ну удобно же.

А куда-то деваться от чужих неймспейсов цели у меня не было. Они прекрасно живут рядом с моими классами в глобальном пространстве имен.

Ответить