MAGE_DIRS parameter bootstrap di CLI

10

Dalam pub/index.php, kode berikut digunakan untuk mengatur perubahan URL untuk media dan aset statis untuk menghilangkan "/ 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);

Sayangnya dalam skrip CLI ( bin/magento) tidak ada yang seperti ini.

Saya menemukan kelas Magento\Setup\Mvc\Bootstrap\InitParamListenerdengan kode berikut:

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

Tapi saya tidak mengerti di mana Manajer Layanan Zend ini mengambil data dan bagaimana mungkin untuk memengaruhinya.

Masalah konkret saya adalah bahwa pengindeks harus menghasilkan URL lengkap dan saat ini menyukainya http://magento.local/pub/media/..., di mana saya membutuhkannyahttp://magento.local/media/...

Bagaimana saya bisa memberi tahu CLI bahwa host virtual saya arahkan ke pubdan "pub" tidak boleh menjadi bagian dari URL?

Idealnya ini harus bekerja tanpa harus bergantung pada parameter CLI tambahan atau variabel lingkungan.

Fabian Schmengler
sumber
2
Ini baru-baru ini dilaporkan sebagai bug: github.com/magento/magento2/issues/8868
Scott Buchanan
1
Saya menemukan bahwa Anda dapat mengatur ini menggunakan argumen seperti --magento-init-params=MAGE_DIRS[media][uri]=media. Ini benar-benar bekerja untuk semua perintah (terbukti dengan melangkah melalui kode), tetapi perintah di luar setup:namespace salah memberikan kesalahan bahwa opsi tidak ada.
Scott Buchanan
@ScottSB Bukan apa yang saya harapkan, tetapi masih merupakan penemuan yang menarik, terima kasih untuk itu!
Fabian Schmengler

Jawaban:

6

Setelah banyak kesulitan, saya menemukan solusi menggunakan variabel lingkungan, yang saya tahu bukan yang Anda inginkan. Anda dapat mengatur parameter menggunakan variabel lingkungan seperti ini (mengganti $APP_ROOTdengan root Magento Anda yang sebenarnya):

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

Perhatikan bahwa perlu untuk menentukan path dasar seperti di atas karena ketika Anda menggunakan variabel lingkungan, MAGE_DIRSdefinisi Anda menimpa default awal yang mencakup itu. Akan tetapi, ini akan digabung dengan konfigurasi default yang lebih lengkap \Magento\Framework\App\Filesystem\DirectoryList.

Penghargaan atas jawaban ini dari kepala arsitek sendiri karena telah menempatkan saya pada aroma:

Bagaimana cara mengubah direktori "var" Magento ke tempat lain di Magento 2?

Scott Buchanan
sumber
Bagaimana Anda menggunakan variabel lingkungan? Apakah ini ditambahkan ke VHOST seperti jawaban yang dirujuk?
harri
@ Harri Saya tidak mengerti pertanyaan Anda. Karena ini berbicara tentang perintah CLI, vhost tidak relevan, karena server web tidak terlibat. Variabel lingkungan diteruskan langsung pada baris perintah seperti yang diilustrasikan (argumen envdalam format FOO=bardiatur sebagai variabel lingkungan untuk perintah di akhir, dalam kasus ini bin/magento).
Scott Buchanan
Ah untuk saya, saya mendapatkan masalah ini dengan metode yang dijalankan melalui cron jadi tidak yakin apakah ada cara untuk meretas ini dengan bin / magento cron saya: jalankan di crontab?
harri
Ambil saja apa yang ada dalam jawaban saya dan gantikan indexer:reindexdengan cron:run(dan masih memperbarui $ APP_ROOT juga tentunya). Lalu masukkan semua itu ke crontab. Tidak yakin apakah crontab akan menyukai baris baru, jadi Anda bisa menggantinya dengan spasi (menghapus garis miring terbalik dalam kasus itu).
Scott Buchanan
Saya pikir solusi yang lebih baik ada di sini magento.stackexchange.com/a/174503/41325
A.Maksymiuk
3

Saya menemukan cara lain untuk mengatur MAGE_DIRSmelalui CLI, cukup salin

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

untuk

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

Dan sekarang Anda dapat mengubah direktori default semua file internal.

Joseph F.
sumber
thx ini membantu saya untuk mengubah folder cache untuk cli dan webapp; D
ZFNerd
Sebenarnya saya percaya ini adalah solusi terbaik dari masalah ini. Panduan Magento resmi merekomendasikan untuk menggunakan / lib / internal untuk menyesuaikan inti. devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…
A.Maksymiuk
@ A.Maksymiuk Saya yakin Anda salah memahami halaman itu. Perlu dicatat bahwa kode di sana mungkin berguna untuk pengembang ekstensi, tetapi tidak merekomendasikan kustomisasi inti secara langsung di sana. Sebelumnya pada halaman itu tertulis: "Anda seharusnya tidak pernah memodifikasi file Framework, meskipun jika Anda memperluas Magento, Anda harus tahu cara memanggil library Framework."
Scott Buchanan