Parâmetros de inicialização MAGE_DIRS na CLI

10

Em pub/index.php, o código a seguir é usado para definir URLs de alteração para mídia e ativos 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);

Infelizmente nos scripts CLI ( bin/magento) não há nada como isso.

Encontrei a classe Magento\Setup\Mvc\Bootstrap\InitParamListenercom o seguinte código:

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

Mas não entendo onde esse Zend Service Manager recupera os dados e como pode ser possível influenciá-los.

Meu problema concreto é que um indexador precisa gerar URLs completos e atualmente gosta http://magento.local/pub/media/..., onde eu precisohttp://magento.local/media/...

Como posso dizer à CLI que meu host virtual aponta para pub"pub" e não deve fazer parte dos URLs?

Idealmente, isso deve funcionar sem ter que confiar em parâmetros adicionais da CLI ou variáveis ​​de ambiente.

Fabian Schmengler
fonte
2
Isso foi relatado recentemente como um bug: github.com/magento/magento2/issues/8868
Scott Buchanan
1
Eu achei que você pode definir isso usando um argumento como --magento-init-params=MAGE_DIRS[media][uri]=media. Na verdade, isso funciona para todos os comandos (evidente ao percorrer o código), mas comandos fora do setup:espaço para nome incorretamente dão um erro de que a opção não existe.
Scott Buchanan
@ ScottSB Não é exatamente o que eu estava esperando, mas ainda assim é uma descoberta interessante, obrigado por isso!
Fabian Schmengler

Respostas:

6

Depois de muito trabalho, encontrei uma solução usando variáveis ​​de ambiente, que sei que não é o que você queria. Você pode definir os parâmetros usando variáveis ​​de ambiente como esta (substituindo $APP_ROOTpela sua raiz Magento atual):

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

Observe que é necessário especificar o caminho base como acima, porque quando você usa variáveis ​​de ambiente, sua MAGE_DIRSdefinição substitui o padrão inicial que inclui isso. No entanto, ele será mesclado com a configuração padrão completa \Magento\Framework\App\Filesystem\DirectoryList.

Agradeço a esta resposta do arquiteto-chefe por me colocar no perfume:

Como mudar o diretório "var" do Magento para outro local no Magento 2?

Scott Buchanan
fonte
Como você usa variáveis ​​de ambiente? Eles estão sendo adicionados ao VHOST como a resposta mencionada?
harri
@harri Eu não entendo sua pergunta. Como se trata de um comando da CLI, um vhost não é relevante, pois o servidor da web não está envolvido. As variáveis ​​de ambiente são passadas diretamente na linha de comando, conforme ilustrado (argumentos envno formato FOO=barsão definidos como variáveis ​​de ambiente para o comando no final, neste caso bin/magento).
22418 Scott Schanan
Ah, para o meu eu estou recebendo esse problema com um método executado via cron, portanto não tenho certeza se existe uma maneira de fazer isso com meu cron bin / magento: run no crontab?
harri
Pegue o que tenho na resposta e substitua indexer:reindexpor cron:run(e ainda atualize $ APP_ROOT, é claro). Em seguida, solte tudo no crontab. Não tenho certeza se o crontab vai gostar das novas linhas, então você pode substituí-las por espaços (removendo as barras invertidas finais nesse caso).
22418 Scott Schanan
Acho melhor solução está aqui magento.stackexchange.com/a/174503/41325
A.Maksymiuk
3

Encontrei outra maneira de configurar MAGE_DIRSvia CLI, basta copiar

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

para

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

E agora você pode alterar o diretório padrão de todos os arquivos internos.

Joseph F.
fonte
thx isso me ajudou a alterar a pasta de cache para cli e webapp; D
ZFNerd
Na verdade, acredito que esta é a melhor solução para esse problema. O guia oficial do Magento recomenda o uso de / lib / internal para personalizar o núcleo. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
@ A.Maksymiuk Eu acredito que você está entendendo mal essa página. É observando que o código pode ser útil para desenvolvedores de extensão, mas é não recomendando núcleo personalização diretamente para lá. No início da página, diz: "Você nunca deve modificar arquivos do Framework, embora se estiver estendendo o Magento, você deve saber como chamar as bibliotecas do Framework".
23919 Scott Scott Buchanan