Các tham số bootstrap MAGE_DIRS trong CLI


10

Trong pub/index.php, mã sau đây được sử dụng để đặt URL thay đổi cho phương tiện và tài sản tĩnh thành bỏ qua "/ 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);

Thật không may trong các tập lệnh CLI ( bin/magento) không có gì như thế này.

Tôi tìm thấy lớp Magento\Setup\Mvc\Bootstrap\InitParamListenervới mã sau đây:

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

Nhưng tôi không hiểu Trình quản lý dịch vụ Zend này lấy dữ liệu ở đâu và làm thế nào có thể ảnh hưởng đến nó.

Vấn đề cụ thể của tôi là một người lập chỉ mục phải tạo các URL đầy đủ và hiện tại nó thích http://magento.local/pub/media/..., nơi tôi cần nó để đượchttp://magento.local/media/...

Làm cách nào tôi có thể nói với CLI rằng máy chủ ảo của tôi trỏ đến pubvà "pub" không phải là một phần của URL?

Lý tưởng là nó sẽ hoạt động mà không cần phải dựa vào các tham số CLI hoặc biến môi trường bổ sung.


2
Điều này gần đây đã được báo cáo là một lỗi: github.com/magento/magento2/issues/8868
Scott Buchanan

1
Tôi thấy rằng bạn có thể thiết lập điều này bằng cách sử dụng một đối số như --magento-init-params=MAGE_DIRS[media][uri]=media. Điều này thực sự hoạt động cho tất cả các lệnh (hiển nhiên bằng cách chuyển qua mã), nhưng các lệnh bên ngoài setup:không gian tên không chính xác gây ra lỗi mà tùy chọn không tồn tại.
Scott Hội trưởng

@ScottSB Không chính xác những gì tôi đã hy vọng, nhưng vẫn là một phát hiện thú vị, cảm ơn vì điều đó!
Fabian Schmengler

Câu trả lời:


6

Sau nhiều chuyến đi, tôi đã tìm thấy một giải pháp sử dụng các biến môi trường, mà tôi biết đó không phải là điều bạn muốn. Bạn có thể đặt tham số bằng các biến môi trường như thế này (thay thế $APP_ROOTbằng gốc Magento thực tế của bạn):

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

Lưu ý rằng cần phải chỉ định đường dẫn cơ sở như trên vì khi bạn sử dụng biến môi trường, MAGE_DIRSđịnh nghĩa của bạn sẽ ghi đè mặc định ban đầu bao gồm điều đó. Tuy nhiên, nó sẽ được hợp nhất với cấu hình mặc định đầy đủ hơn trong \Magento\Framework\App\Filesystem\DirectoryList.

Tín dụng cho câu trả lời này từ chính kiến ​​trúc sư trưởng đã đưa tôi vào mùi hương:

Làm cách nào để thay đổi thư mục "var" của Magento sang vị trí khác trong Magento 2?


Làm thế nào để bạn sử dụng các biến môi trường? Những điều này có được thêm vào VHOST giống như câu trả lời được tham chiếu không?
harri

@harri Tôi không hiểu câu hỏi của bạn. Bởi vì điều này nói về lệnh CLI, vhost không liên quan, vì máy chủ web không liên quan. Các biến môi trường được truyền ngay trên dòng lệnh như được minh họa (các đối số envtheo định dạng FOO=barđược đặt làm biến môi trường cho lệnh ở cuối, trong trường hợp này bin/magento).
Scott Hội trưởng

À, tôi đang gặp vấn đề này với một phương thức chạy qua cron nên không chắc có cách nào để xử lý vấn đề này với cron bin / magento của tôi không: chạy trong crontab?
harri

Chỉ cần lấy những gì tôi có trong câu trả lời và thay thế indexer:reindexbằng cron:run(và vẫn cập nhật $ APP_ROOT quá tất nhiên). Sau đó thả toàn bộ điều đó vào crontab. Không chắc chắn nếu crontab sẽ thích các dòng mới, vì vậy bạn chỉ có thể thay thế chúng bằng dấu cách (loại bỏ dấu gạch chéo ngược trong trường hợp đó).
Scott Hội trưởng

Tôi nghĩ giải pháp tốt hơn là ở đây magento.stackexchange.com/a/174503/41325
A.Maksymiuk


3

Tôi tìm thấy một cách khác để thiết lập MAGE_DIRSthông qua CLI, chỉ cần sao chép

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

đến

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

Và bây giờ bạn có thể thay đổi thư mục mặc định của tất cả các tệp nội bộ.


Điều này đã giúp tôi thay đổi thư mục bộ đệm cho cli và webapp; D
ZFNerd

Thật ra tôi tin rằng đây là giải pháp tốt nhất cho vấn đề này. Hướng dẫn chính thức của Magento khuyên bạn nên sử dụng / lib / Internal để tùy chỉnh lõi. devdocs.magento.com/guides/v2.3/arch architecture / archi_perspectives / Đổi
A.Maksymiuk 23/07/19

@ A.Maksymiuk Tôi tin rằng bạn đang hiểu nhầm trang đó. Lưu ý rằng mã ở đó có thể hữu ích cho các nhà phát triển tiện ích mở rộng, nhưng nó không khuyến nghị tùy chỉnh lõi trực tiếp ở đó. Trước đó trên trang có ghi: "Bạn không bao giờ nên sửa đổi các tệp Framework, mặc dù nếu bạn đang mở rộng Magento, bạn phải biết cách gọi các thư viện Framework."
Scott Hội trưởng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.