Parametry ładowania MAGE_DIRS w interfejsie CLI

11

W: pub/index.phpnastępujący kod służy do ustawienia adresów URL zmian zasobów multimedialnych i statycznych w celu pominięcia „/ 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);

Niestety w skryptach CLI ( bin/magento) nie ma czegoś takiego.

Znalazłem klasę Magento\Setup\Mvc\Bootstrap\InitParamListenerz następującym kodem:

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

Ale nie rozumiem, skąd ten Zend Service Manager pobiera dane i jak można na nie wpłynąć.

Moim konkretnym problemem jest to, że indeksator musi generować pełne adresy URL i obecnie robi to http://magento.local/pub/media/..., tam gdzie jest to potrzebnehttp://magento.local/media/...

Jak mogę powiedzieć CLI, że mój wirtualny host wskazuje pubi „pub” nie powinien być częścią adresów URL?

Idealnie powinno to działać bez konieczności polegania na dodatkowych parametrach CLI lub zmiennych środowiskowych.

Fabian Schmengler
źródło
2
Ten niedawno opisywano jako błąd: github.com/magento/magento2/issues/8868
Scott Buchanan
1
Odkryłem, że możesz to ustawić za pomocą argumentu podobnego do --magento-init-params=MAGE_DIRS[media][uri]=media. W rzeczywistości działa to dla wszystkich poleceń (oczywiste, przechodząc przez kod), ale polecenia spoza setup:przestrzeni nazw niepoprawnie dają błąd, że opcja nie istnieje.
Scott Buchanan,
@ScottSB Niezupełnie to, na co liczyłem, ale wciąż interesujące znalezisko, dzięki za to!
Fabian Schmengler,

Odpowiedzi:

7

Po wielu trudach znalazłem rozwiązanie wykorzystujące zmienne środowiskowe, o których wiem, że nie jest to, czego chciałeś. Możesz ustawić parametry za pomocą zmiennych środowiskowych takich jak ten (zamieniając $APP_ROOTna rzeczywisty katalog główny 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

Zauważ, że konieczne jest określenie ścieżki podstawowej jak wyżej, ponieważ kiedy używasz zmiennych środowiskowych, twoja MAGE_DIRSdefinicja zastępuje początkową wartość domyślną, która ją zawiera. Zostanie on jednak scalony z pełniejszą domyślną konfiguracją w \Magento\Framework\App\Filesystem\DirectoryList.

Podziękowania dla tej odpowiedzi od samego architekta za wprowadzenie mnie w zapach:

Jak zmienić katalog „var” Magento na inne miejsce w Magento 2?

Scott Buchanan
źródło
Jak korzystasz ze zmiennych środowiskowych? Czy są one dodawane do VHOST tak jak przywoływana odpowiedź?
harri
@harri Nie rozumiem twojego pytania. Ponieważ to mówienie o poleceniu CLI, vhost nie jest istotny, ponieważ serwer WWW nie jest zaangażowany. Zmienne środowiskowe są przekazywane bezpośrednio w wierszu poleceń, jak pokazano (argumenty envw formacie FOO=barsą ustawiane jako zmienne środowiskowe dla polecenia na końcu, w tym przypadku bin/magento).
Scott Buchanan
Ach, bo dostaję ten problem z metodą uruchamianą przez crona, więc nie jestem pewien, czy istnieje sposób, aby to załatwić za pomocą mojego bin / magento cron: uruchomić w crontab?
harri
Wystarczy wziąć to, co mam w odpowiedzi i wymienić indexer:reindexz cron:run(i ciągle aktualizować $ APP_ROOT też oczywiście). Następnie upuść całą tę rzecz na crontab. Nie jestem pewien, czy crontab spodoba się nowym wierszom, więc możesz po prostu zastąpić je spacjami (w tym przypadku usuwając końcowe ukośniki odwrotne).
Scott Buchanan,
Myślę, że lepsze rozwiązanie jest tutaj magento.stackexchange.com/a/174503/41325
A.Maksymiuk
2

Znalazłem inny sposób na ustawienie MAGE_DIRSza pomocą CLI, wystarczy skopiować

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

do

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

A teraz możesz zmienić domyślny katalog wszystkich wewnętrznych plików.

Joseph F.
źródło
dzięki, pomogłem mi zmienić folder pamięci podręcznej dla cli i aplikacji internetowej; D
ZFNerd
Właściwie uważam, że to najlepsze rozwiązanie tego problemu. Oficjalny przewodnik Magento zaleca użycie / lib / internal w celu dostosowania rdzenia. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
1
@ A.Maksymiuk Uważam, że nie rozumiesz tej strony. Należy zauważyć, że kod tam może być użyteczny dla programistów rozszerzeń, ale nie zaleca dostosowywania rdzenia bezpośrednio tam. Wcześniej na stronie jest napisane: „Nigdy nie powinieneś modyfikować plików Framework, chociaż jeśli rozszerzasz Magento, musisz wiedzieć, jak wywoływać biblioteki Framework”.
Scott Buchanan,