Parámetros de arranque MAGE_DIRS en CLI

10

En pub/index.php, el siguiente código se utiliza para establecer las URL de cambio para medios y activos estáticos para omitir "/ 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);

Desafortunadamente, en los scripts CLI ( bin/magento) no hay nada como esto.

Encontré la clase Magento\Setup\Mvc\Bootstrap\InitParamListenercon el siguiente código:

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

Pero no entiendo dónde este administrador de servicios de Zend recupera los datos y cómo podría ser posible influir en ellos.

Mi problema concreto es que un indexador tiene que generar URL completos y actualmente lo hace http://magento.local/pub/media/..., donde necesito que estéhttp://magento.local/media/...

¿Cómo puedo decirle a la CLI que mi host virtual apunta puby que "pub" no debe formar parte de las URL?

Idealmente, esto debería funcionar sin tener que depender de parámetros adicionales de CLI o variables de entorno.

Fabian Schmengler
fuente
2
Esto se ha informado recientemente como un error: github.com/magento/magento2/issues/8868
Scott Buchanan
1
Descubrí que puedes configurar esto usando un argumento como --magento-init-params=MAGE_DIRS[media][uri]=media. En realidad, esto funciona para todos los comandos (evidente al recorrer el código), pero los comandos fuera del setup:espacio de nombres incorrectamente dan un error de que la opción no existe.
Scott Buchanan
@ScottSB No es exactamente lo que esperaba, pero sigue siendo un hallazgo interesante, ¡gracias por eso!
Fabian Schmengler

Respuestas:

6

Después de mucho trabajo, encontré una solución usando variables de entorno, que sé que no es lo que querías. Puede configurar los parámetros utilizando variables de entorno como esta (reemplazando $APP_ROOTcon su raíz Magento real):

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

Tenga en cuenta que es necesario especificar la ruta base como se indicó anteriormente porque cuando usa variables de entorno, su MAGE_DIRSdefinición sobrescribe el valor predeterminado inicial que incluye eso. Sin embargo, se fusionará con la configuración predeterminada más completa en \Magento\Framework\App\Filesystem\DirectoryList.

Agradezco esta respuesta del propio arquitecto jefe por ponerme en la esencia:

¿Cómo cambiar el directorio "var" de Magento a otro lugar en Magento 2?

Scott Buchanan
fuente
¿Cómo se usan las variables de entorno? ¿Se están agregando a VHOST como la respuesta referenciada?
harri
@harri No entiendo tu pregunta. Como se trata de un comando CLI, un vhost no es relevante, ya que el servidor web no está involucrado. Las variables de entorno se pasan directamente a la línea de comando como se ilustra (los argumentos enven el formato FOO=barse configuran como variables de entorno para el comando al final, en este caso bin/magento).
Scott Buchanan
Ah, para mí, estoy teniendo este problema con un método ejecutado a través de cron, así que no estoy seguro de si hay una manera de solucionar esto con mi cron bin / magento: ¿ejecutar en crontab?
harri
Simplemente tome lo que tengo en la respuesta y reemplácelo indexer:reindexcon cron:run(y aún actualice $ APP_ROOT también, por supuesto). Luego suelte todo eso en el crontab. No estoy seguro de si a crontab le gustarán las nuevas líneas, por lo que podría reemplazarlas con espacios (eliminando las barras diagonales posteriores en ese caso).
Scott Buchanan
Creo que la mejor solución está aquí magento.stackexchange.com/a/174503/41325
A.Maksymiuk
3

Encontré otra forma de configurar a MAGE_DIRStravés de CLI, solo copie

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

a

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

Y ahora puede cambiar el directorio predeterminado de todos los archivos internos.

Joseph F.
fuente
Gracias a esto, esto me ayudó a cambiar la carpeta de caché para cli y webapp; D
ZFNerd
De hecho, creo que esta es la mejor solución para este problema. La guía oficial de Magento recomienda usar / lib / internal para personalizar el núcleo. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
@ A.Maksymiuk Creo que está malinterpretando esa página. Señala que el código allí puede ser útil para los desarrolladores de extensiones, pero no recomienda personalizar el núcleo directamente allí. Anteriormente en la página dice: "Nunca debe modificar los archivos de Framework, aunque si está extendiendo Magento, debe saber cómo llamar a las bibliotecas de Framework".
Scott Buchanan