Параметры начальной загрузки MAGE_DIRS в CLI

10

В pub/index.phpследующем коде используется для установки URL изменений для медиа и статических ресурсов, чтобы опустить "/ pub":

$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);

К сожалению, в CLI scripts ( bin/magento) нет ничего подобного.

Я нашел класс Magento\Setup\Mvc\Bootstrap\InitParamListenerсо следующим кодом:

$initParams = $application->getServiceManager()->get(self::BOOTSTRAP_PARAM);
$directoryList = $this->createDirectoryList($initParams);

Но я не понимаю, откуда этот Zend Service Manager извлекает данные и как можно повлиять на них.

Моя конкретная проблема заключается в том, что индексатор должен генерировать полные URL-адреса и в настоящее время делает это так http://magento.local/pub/media/..., как мне нужно, чтобы это былоhttp://magento.local/media/...

Как я могу сказать CLI, что мой виртуальный хост указывает на то, что pub«pub» не должно быть частью URL?

В идеале это должно работать без необходимости полагаться на дополнительные параметры CLI или переменные среды.

Фабиан Шменглер
источник
2
Недавно об этом сообщили как об ошибке: github.com/magento/magento2/issues/8868
Скотт Бьюкенен,
1
Я обнаружил, что вы можете установить это с помощью аргумента, как --magento-init-params=MAGE_DIRS[media][uri]=media. Это на самом деле работает для всех команд (очевидно, шагая по коду), но команды вне setup:пространства имен неправильно выдают ошибку, что опция не существует.
Скотт Бьюкенен
@ScottSB Не совсем то, на что я надеялся, но все же интересная находка, спасибо за это!
Фабиан Шменглер

Ответы:

6

После долгих испытаний я нашел решение с использованием переменных среды, которые, как я знаю, не то, что вы хотели. Вы можете установить параметры, используя переменные окружения, как это (заменив их $APP_ROOTфактическим корнем Magento):

env \
    "MAGE_DIRS[base][path]=$APP_ROOT" \
    "MAGE_DIRS[pub][uri]=" \
    "MAGE_DIRS[media][uri]=media" \
    "MAGE_DIRS[static][uri]=static" \
    "MAGE_DIRS[upload][uri]=media/upload" \
    bin/magento indexer:reindex

Обратите внимание, что необходимо указать базовый путь, как указано выше, потому что, когда вы используете переменные среды, ваше MAGE_DIRSопределение перезаписывает исходное значение по умолчанию, которое включает это. Однако он будет объединен с более полной конфигурацией по умолчанию в \Magento\Framework\App\Filesystem\DirectoryList.

Отдайте должное этому ответу самого главного архитектора, который поставил меня на запах

Как изменить каталог "var" в Magento на другое место в Magento 2?

Скотт Бьюкенен
источник
Как вы используете переменные среды? Они добавляются в VHOST как ссылочный ответ?
Харри
@ Харри, я не понимаю твой вопрос. Поскольку речь идет о команде CLI, vhost не имеет значения, поскольку веб-сервер не задействован. Переменные среды передаются прямо в командной строке, как показано на рисунке (в этом случае аргументы envв формате FOO=barустанавливаются как переменные среды для команды в конце bin/magento).
Скотт Бьюкенен
Ах, для меня, я получаю эту проблему с методом, запускаемым через cron, поэтому не уверен, есть ли способ исправить это с моим bin / magento cron: запустить в crontab?
Харри
Просто то , что я в ответ и заменить indexer:reindexс cron:run(и до сих пор обновлять $ APP_ROOT тоже конечно). Тогда бросьте все это в crontab. Не уверен, что crontab понравятся символы новой строки, так что вы можете просто заменить их пробелами (в этом случае удаляете обратную косую черту).
Скотт Бьюкенен
Я думаю, что лучшее решение здесь magento.stackexchange.com/a/174503/41325
А.Максымюк
5

Другой, более простой вариант - просто жестко закодировать путь мультимедиа в конфигурации магазина в разделе «Магазины»> «Конфигурация»> «Интернет», чтобы:

{{unsecure_base_url}}media/

а также

{{secure_base_url}}media/

Нужно отдать должное https://github.com/magento/magento2/issues/9111#issuecomment-292002922

Скотт Бьюкенен
источник
3

Я нашел другой способ установить MAGE_DIRSчерез CLI, просто скопируйте

/vendor/magento/framework/App/Filesystem/DirectoryList.php

в

/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php 

И теперь вы можете изменить каталог по умолчанию для всех внутренних файлов.

Джозеф Ф.
источник
THX это помогло мне изменить папку кеша для Cli и WebApp; D
ZFNerd
На самом деле я верю, что это лучшее решение этой проблемы. Официальное руководство по Magento рекомендует использовать / lib / internal для настройки ядра. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
@ A.Maksymiuk Я полагаю, вы неправильно понимаете эту страницу. Следует отметить, что код может быть полезен для разработчиков расширений, но он не рекомендует настраивать ядро ​​непосредственно там. Ранее на странице было написано: «Вы никогда не должны изменять файлы Framework, хотя, если вы расширяете Magento, вы должны знать, как вызывать библиотеки Framework».
Скотт Бьюкенен