Paramètres d'amorçage MAGE_DIRS dans CLI

10

Dans pub/index.php, le code suivant est utilisé pour définir les URL de modification des médias et des actifs statiques de manière à omettre "/ 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);

Malheureusement, dans les scripts CLI ( bin/magento), il n'y a rien de tel.

J'ai trouvé la classe Magento\Setup\Mvc\Bootstrap\InitParamListeneravec le code suivant:

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

Mais je ne comprends pas où ce Zend Service Manager récupère les données et comment il pourrait être possible de les influencer.

Mon problème concret est qu'un indexeur doit générer des URL complètes et le fait actuellement comme http://magento.local/pub/media/..., où j'en ai besoinhttp://magento.local/media/...

Comment puis-je dire à la CLI que mon hôte virtuel pointe vers pubet que "pub" ne doit pas faire partie des URL?

Idéalement, cela devrait fonctionner sans avoir à s'appuyer sur des paramètres CLI ou des variables d'environnement supplémentaires.

Fabian Schmengler
la source
2
Cela a récemment été signalé comme un bug: github.com/magento/magento2/issues/8868
Scott Buchanan
1
J'ai trouvé que vous pouvez définir cela en utilisant un argument comme --magento-init-params=MAGE_DIRS[media][uri]=media. Cela fonctionne en fait pour toutes les commandes (évident en parcourant le code), mais les commandes en dehors de l' setup:espace de noms donnent incorrectement une erreur que l'option n'existe pas.
Scott Buchanan
@ScottSB Pas exactement ce que j'espérais, mais toujours une découverte intéressante, merci pour ça!
Fabian Schmengler

Réponses:

6

Après beaucoup de travail, j'ai trouvé une solution utilisant des variables d'environnement, ce que je sais n'est pas ce que vous vouliez. Vous pouvez définir les paramètres à l'aide de variables d'environnement comme celle-ci (en les remplaçant $APP_ROOTpar votre racine Magento réelle):

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

Notez qu'il est nécessaire de spécifier le chemin de base comme ci-dessus, car lorsque vous utilisez des variables d'environnement, votre MAGE_DIRSdéfinition remplace la valeur par défaut initiale qui inclut cela. Cependant, il sera fusionné avec la configuration par défaut plus complète dans \Magento\Framework\App\Filesystem\DirectoryList.

Crédits à cette réponse de l'architecte en chef lui-même pour m'avoir mis sur l'odeur:

Comment changer le répertoire "var" de Magento à un autre endroit dans Magento 2?

Scott Buchanan
la source
Comment utilisez-vous les variables d'environnement? Ces éléments sont-ils ajoutés à VHOST comme la réponse référencée?
harri
@harri Je ne comprends pas votre question. Parce que cela parle d'une commande CLI, un vhost n'est pas pertinent, car le serveur Web n'est pas impliqué. Les variables d'environnement sont transmises directement sur la ligne de commande comme illustré (les arguments de envau format FOO=barsont définis comme variables d'environnement pour la commande à la fin, dans ce cas bin/magento).
Scott Buchanan
Ah pour moi, je reçois ce problème avec une méthode exécutée via cron, donc je ne sais pas s'il y a un moyen de le pirater avec mon cron bin / magento: exécuter dans crontab?
harri
Il suffit de prendre ce que j'ai dans la réponse et de le remplacer indexer:reindexpar cron:run(et toujours mettre à jour $ racine_app aussi bien sûr). Déposez ensuite le tout dans la crontab. Vous ne savez pas si crontab aimera les nouvelles lignes, vous pouvez donc simplement les remplacer par des espaces (en supprimant les barres obliques inverses dans ce cas).
Scott Buchanan
Je pense que la meilleure solution est ici magento.stackexchange.com/a/174503/41325
A.Maksymiuk
3

J'ai trouvé un autre moyen de définir MAGE_DIRSvia CLI, il suffit de copier

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

à

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

Et maintenant, vous pouvez changer le répertoire par défaut de tous les fichiers internes.

Joseph F.
la source
thx cela m'a aidé à changer le dossier de cache pour cli et webapp; D
ZFNerd
En fait, je pense que c'est la meilleure solution à ce problème. Le guide officiel de Magento recommande d'utiliser / lib / internal pour personnaliser le noyau. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
@ A.Maksymiuk Je crois que vous comprenez mal cette page. Il note que le code peut être utile pour les développeurs d'extensions, mais il ne recommande pas de personnaliser directement le noyau. Plus haut sur la page, il est dit: "Vous ne devez jamais modifier les fichiers Framework, bien que si vous étendez Magento, vous devez savoir comment appeler les bibliothèques Framework."
Scott Buchanan