MAGE_DIRS-Bootstrap-Parameter in der CLI


10

In pub/index.phpwird der folgende Code verwendet, um Änderungs-URLs für Medien und statische Assets so festzulegen, dass "/ pub" weggelassen wird:

$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);

Leider gibt es in CLI-Skripten ( bin/magento) nichts Vergleichbares.

Ich habe die Klasse Magento\Setup\Mvc\Bootstrap\InitParamListenermit folgendem Code gefunden:

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

Ich verstehe jedoch nicht, wo dieser Zend Service Manager die Daten abruft und wie sie möglicherweise beeinflusst werden können.

Mein konkretes Problem ist, dass ein Indexer vollständige URLs generieren muss und dies derzeit dort tut http://magento.local/pub/media/..., wo ich es brauchehttp://magento.local/media/...

Wie kann ich der CLI mitteilen, dass mein virtueller Host auf pubURLs verweist und "Pub" nicht Teil von URLs sein sollte?

Im Idealfall sollte dies funktionieren, ohne dass zusätzliche CLI-Parameter oder Umgebungsvariablen erforderlich sind.


2
Dies wurde kürzlich als Fehler gemeldet: github.com/magento/magento2/issues/8868
Scott Buchanan

1
Ich habe festgestellt, dass Sie dies mit einem Argument wie einstellen können --magento-init-params=MAGE_DIRS[media][uri]=media. Dies funktioniert tatsächlich für alle Befehle (offensichtlich durch Durchlaufen des Codes), aber Befehle außerhalb des setup:Namespace geben fälschlicherweise den Fehler aus, dass die Option nicht vorhanden ist.
Scott Buchanan

@ScottSB Nicht genau das, was ich mir erhofft hatte, aber immer noch ein interessanter Fund, danke dafür!
Fabian Schmengler

Antworten:


6

Nach langem Hin und Her habe ich eine Lösung mit Umgebungsvariablen gefunden, von der ich weiß, dass sie nicht Ihren Wünschen entspricht. Sie können die Parameter mithilfe folgender Umgebungsvariablen festlegen (durch $APP_ROOTIhre eigentliche Magento-Wurzel ersetzen ):

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

Beachten Sie, dass der Basispfad wie oben angegeben werden muss, da Ihre MAGE_DIRSDefinition bei Verwendung von Umgebungsvariablen den anfänglichen Standard überschreibt, der diesen enthält. Es wird jedoch mit der vollständigeren Standardkonfiguration in zusammengeführt \Magento\Framework\App\Filesystem\DirectoryList.

Wir danken dieser Antwort des Chefarchitekten selbst dafür, dass er mich auf den Duft gebracht hat:

Wie ändere ich das "var" -Verzeichnis von Magento an einen anderen Ort in Magento 2?


Wie verwenden Sie Umgebungsvariablen? Werden diese wie die angegebene Antwort in VHOST hinzugefügt?
Harris

@harri Ich verstehe deine Frage nicht. Da es sich um einen CLI-Befehl handelt, ist ein vhost nicht relevant, da der Webserver nicht beteiligt ist. Die Umgebungsvariablen werden wie abgebildet direkt in der Befehlszeile übergeben (Argumente envim Format werden FOO=barin diesem Fall am Ende als Umgebungsvariablen für den Befehl festgelegt bin/magento).
Scott Buchanan

Ah, ich bekomme dieses Problem mit einer Methode, die über cron ausgeführt wird. Sie sind sich also nicht sicher, ob es eine Möglichkeit gibt, dies mit meinem bin / magento cron zu tun: in crontab ausführen?
Harris

Nehmen Sie einfach das, was ich in der Antwort habe, und ersetzen Sie es indexer:reindexdurch cron:run(und aktualisieren Sie natürlich auch $ APP_ROOT). Dann lassen Sie das Ganze in die Crontab fallen. Sie sind sich nicht sicher, ob crontab die Zeilenumbrüche mag, daher können Sie sie einfach durch Leerzeichen ersetzen (in diesem Fall entfernen Sie die nachgestellten Backslashes).
Scott Buchanan

Ich denke, bessere Lösung ist hier magento.stackexchange.com/a/174503/41325
A.Maksymiuk


3

Ich habe einen anderen Weg gefunden, um MAGE_DIRSüber CLI einzustellen , einfach kopieren

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

zu

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

Und jetzt können Sie das Standardverzeichnis aller internen Dateien ändern.


Dies half mir, den Cache-Ordner für CLI und WebApp zu ändern; D
ZFNerd

Eigentlich glaube ich, dass dies die beste Lösung für dieses Problem ist. Der offizielle Magento-Leitfaden empfiehlt die Verwendung von / lib / internal, um den Kern anzupassen. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk

@ A.Maksymiuk Ich glaube, Sie verstehen diese Seite falsch. Es wird darauf hingewiesen, dass der dortige Code für Erweiterungsentwickler nützlich sein kann, es wird jedoch nicht empfohlen, den Kern direkt dort anzupassen. Weiter oben auf der Seite heißt es: "Sie sollten niemals Framework-Dateien ändern. Wenn Sie jedoch Magento erweitern, müssen Sie wissen, wie man Framework-Bibliotheken aufruft."
Scott Buchanan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.