Использование/подключение расширений БЕЗ composer

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

1. в конфиг прописываем

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

'extensions' => require_once Yii::getAlias('@common/config/extensions.php'),
2. в папке конфига создаем extensions.php:

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

<?php

use yii\helpers\ArrayHelper;

$extensionsDir = Yii::getAlias('@root/extensions');

$extensions = [
    'zelenin/yii2-log-module' => [
        'name' => 'zelenin/yii2-log-module',
        'version' => '9999999-dev',
        'alias' => [
            '@Zelenin/yii/modules/Log' => $extensionsDir . '/zelenin/yii2-log-module',
        ],
        'bootstrap' => 'Zelenin\\yii\\modules\\Log\\Bootstrap'
    ]
];

foreach ($extensions as $extension) {
    if (isset($extension['alias'])) {
        foreach ($extension['alias'] as $alias => $path) {
            Yii::setAlias($alias, $path);
        }
    }
}

return ArrayHelper::merge(
    $extensions,
    require_once Yii::getAlias('@root/vendor/yiisoft/extensions.php')
);
3. В папке extensions создаем и редактируем наши расширения. Они абсолютно адекватно будут оттуда работать.

Это подойдет не только для разработки расширения, но и для ручной установки его.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Использование/подключение расширений БЕЗ composer

Сообщение Nerf »

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

foreach ($extensions as $extension) {
    if (isset($extension['alias'])) {
        foreach ($extension['alias'] as $alias => $path) {
            Yii::setAlias($alias, $path);
        }
    }
} 
Это лишнее, скорее всего.
В Application::bootstrap() то же самое по 2 разу делается.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

Nerf писал(а):

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

foreach ($extensions as $extension) {
    if (isset($extension['alias'])) {
        foreach ($extension['alias'] as $alias => $path) {
            Yii::setAlias($alias, $path);
        }
    }
} 
Это лишнее, скорее всего.
В Application::bootstrap() то же самое по 2 разу делается.
неймспейсы, установленных через композер, расширений через композер же и ресолвятся. А подключенных без композера не ресолвятся без регистрации алиаса. Это нужно, например, если есть прямые обращения к классу - 'class' => \MyNamespace\Module::className(). Стадия бутстрапа выполняется после передачи конфига в аппликейшн, но передать мы не сможем, т.к. будут ошибки не найденных классов.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Использование/подключение расширений БЕЗ composer

Сообщение Nerf »

Судя по коду, проблемы могут возникнуть с Request и ErrorHandler. По идее ничего больше не вызывается до этого момента.
'class' => \MyNamespace\Module::className()
Если в конфиге в том же? Тогда лучше в начале в самом указывать 'exyensions', если я правильно понял.

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

Re: Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

Nerf писал(а):Судя по коду, проблемы могут возникнуть с Request и ErrorHandler. По идее ничего больше не вызывается до этого момента.
'class' => \MyNamespace\Module::className()
Если в конфиге в том же? Тогда лучше в начале в самом указывать 'exyensions', если я правильно понял.
мы не можем вызвать класс \MyNamespace\Module::className(), потому что класса \MyNamespace\Module нет в автолоадере. setAlias именно прописывает неймспейс в yii-шный автолоад. Т.е. мы тупо даже массив конфига прочитать не можем в конструкторе Application (или где он там парситься начинает). Поэтому еще до передачи в конструктор надо засеттить алиасы.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Использование/подключение расширений БЕЗ composer

Сообщение Nerf »

Я вас понял. По этому и написал, что лучше в начале конфига указывать, если использовать далее className(). Верно?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

Nerf писал(а):Я вас понял. По этому и написал, что лучше в начале конфига указывать, если использовать далее className(). Верно?
не очень понимаю. без разницы где вызывать. суть в том, что после передачи готового конфига в аппликейшн, аппликешн начнет обращаться к классам, прописанным в конфиге, поэтому setAlias уже должен быть вызван. В любом месте ДО передачи конфига в конструктор приложения.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Использование/подключение расширений БЕЗ composer

Сообщение Nerf »

не очень понимаю. без разницы где вызывать. суть в том, что после передачи готового конфига в аппликейшн
При require конфига все класса с className() должны быть разрешены. Т.е. по любому до или после передачи в конструктор. Если указать до описания компонентов, например, то автолод нормально подхватит конфигурации этих расширений через className(). Проще строкой прописать...
А если не переопределять request и errorHandler, то, по идее, все само разрешится без setAlias в конфиге.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

Nerf писал(а):
не очень понимаю. без разницы где вызывать. суть в том, что после передачи готового конфига в аппликейшн
При require конфига все класса с className() должны быть разрешены. Т.е. по любому до или после передачи в конструктор.
все require произойдут ДО конструктора. В конструктор уже будет передан конфиг без className().
Nerf писал(а):Если указать до описания компонентов, например, то автолод нормально подхватит конфигурации этих расширений через className().
не вижу связи между порядком и автолоадингом.
Nerf писал(а):Проще строкой прописать...
здесь покрыты оба кейса - и строкой и исполняемым методом, поскольку два лучше чем один.

Хотя сейчас (сниппет выше был написан год назад) я выбираю третий вариант - все на откуп композеру.

Опять же накину на велосипедистость yii: когда в других фреймворках приложение размещают в src, прописывая в composer.json

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

    "autoload": {
        "psr-4": {
            "": "src"
        }
    },
 
в yii гемороят разработчиками алиасами, controllerNamespace'ами и прочей петушней, хотя казалось бы посмотри на другие решения и сделай также.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Использование/подключение расширений БЕЗ composer

Сообщение Nerf »

не вижу связи между порядком и автолоадингом.
Я про это:

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

return [
    // 'extensions' => require('/path'), // <-- будет работать
    'components' => [
        'extension' => [
            'class' => \some\class\from\Extensions::className()
        ],
    ],
    'extensions' => require('/path'), // <-- load error
];
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Использование/подключение расширений БЕЗ composer

Сообщение zelenin »

Nerf писал(а):
не вижу связи между порядком и автолоадингом.
Я про это:

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

return [
    // 'extensions' => require('/path'), // <-- будет работать
    'components' => [
        'extension' => [
            'class' => \some\class\from\Extensions::className()
        ],
    ],
    'extensions' => require('/path'), // <-- load error
]; 
да, думаю, вы правы.
Ответить