Saya telah bekerja dalam sebuah proyek dengan beberapa kode khusus... ini adalah proyek Magento 2 pertama kami, jadi (seperti semua orang di sini saya pikir) setiap hari kami mempelajari hal-hal baru, dan kami harus mengubah cara untuk menangani versi Magento baru ini.
Alasan untuk pertanyaan ini adalah menanyakan tentang perintah setup:di:compile
Saya sudah menggunakannya sejak hari pertama dengan Magento 2, karena bin/magento memintanya setelah setiap setup:upgrade
, dengan pesan "Please re-run Magento compile command"
Nah... Saya menemukan bahwa mengeksekusi setup:di:compile
merusak halaman tampilan produk di proyek ini, dengan Fatal Error yang benar-benar ambigu. Saya telah menghabiskan seluruh hari kerja mencoba untuk men-debug dan menguji dengan perubahan kode dengan hasil nol
Hari ini, saya telah menemukan bahwa jika saya menghilangkan perintah itu maka semua bekerja seperti pesona, bahkan dalam mode produksi
Jadi, pertanyaannya adalah... apa sebenarnya perintah setup:di:compile
itu? Apakah diperlukan? Hanya direkomendasikan? Atau itu adalah perintah yang sudah usang, yang tidak perlu dieksekusi?
UPDATE
Seperti yang diminta oleh beberapa pengguna, ini adalah Fatal Error yang saya maksudkan
Kesalahan fatal PHP: Tidak dapat menginstansiasi kelas abstrak Magento\Catalog\\Block\Product\View\AbstractView in ***/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php pada baris 93
Saya telah mencari blok kustom apa pun yang menggunakan Magento\Catalog\Block\Product\View\AbstractView tetapi saya hanya menemukannya di file tata letak, tidak ada di konstruktor kelas blok mana pun
Apa yang saya tidak mengerti adalah: mengapa Magento melempar Kesalahan Fatal ini dengan kode yang dikompilasi, tetapi berfungsi seperti pesona tanpa kode yang dikompilasi
Perintah setup:di:compile
menghasilkan isi folder var/di
di Magento <2.2 dan generated
untuk Magento >= 2.2
Menurut Magento, hal ini memiliki tujuan sebagai berikut:
Sumber (http://devdocs.magento.com/guides/v2.0/config-guide/cli/config-cli-subcommands-compiler.html)
Namun, ketika Anda menempatkan Magento dalam mode produksi, tanpa kompilasi memang masih berfungsi. Jadi menurut dokumen Magento ini lebih merupakan langkah optimasi (yaitu, pembuatan kode interceptor yang dioptimalkan)
Ketika kita memiliki kesalahan dalam perintah setup:di:compile
, ini sebagian besar karena kesalahan di salah satu konstruktor kelas php kustom.
Tidak wajib menjalankan perintah setup:di:compile
setiap saat tetapi jika Anda telah melakukan perubahan kode apa pun khususnya dengan metode pabrik, proxy, menambahkan plugin atau kompilasi kode apa pun maka Anda harus menjalankan perintah ini.
Lebih Detail
magento setup:di:compile
untuk menghasilkan file yang diperlukan. Kedua opsi tersebut berakhir dengan menghasilkan kelas-kelas di direktori MAGENTO_ROOT/var/generation
(atau /generated
jika Magento 2.2+).
**Kelas apa yang dihasilkan?
Pabrik
Pabrik digunakan untuk menginstansiasi objek yang tidak dapat diinjeksi secara otomatis. Misalnya, objek produk harus dimuat dari database, tetapi kontainer injeksi ketergantungan tidak memiliki informasi yang cukup untuk membuat objek ini. Itulah mengapa kita menggunakan factories.
Proxy
Magento 2 menggunakan injeksi konstruktor di mana semua dependensi diperlukan. Anda tidak dapat menginstansiasi objek tanpa melewatkan semua dependensi. Bagaimana jika Anda ingin memiliki dependensi opsional? Itulah mengapa proxy ada.
Plugin (Pencegat)
Sederhananya, plugin adalah mekanisme kustomisasi utama untuk Magento 2. Tidak ada lagi penulisan ulang kelas. Ini memungkinkan Anda untuk mengaitkan dan melakukan sesuatu sebelum, setelah atau di sekitar metode publik aplikasi apa pun.
ketika Anda menjalankan perintah setup:di:compile, ia melakukan hal-hal di bawah ini
Kompilasi kode terdiri dari semua hal berikut tanpa urutan tertentu:
Pembuatan kode aplikasi (pabrik, proxy, dan sebagainya)
Agregasi konfigurasi area (yaitu, konfigurasi injeksi ketergantungan yang dioptimalkan per area) konfigurasi injeksi ketergantungan yang dioptimalkan per area)
Pembuatan interceptor (yaitu, pembuatan kode yang dioptimalkan dari interceptor)
Pembuatan cache intersepsi Pembuatan kode repositori (yaitu, kode yang dihasilkan untuk API)
Pembuatan atribut data layanan (yaitu, ekstensi yang dihasilkan kelas ekstensi yang dihasilkan untuk objek data)
Rujuk jawaban ini untuk mengetahui kapan kita harus menjalankan perintah yang mana: https://magento.stackexchange.com/a/184927/35758
Magento akan tetap berjalan dalam produksi dan dev tanpa perintah di:compile. Ini akan benar-benar mengkompilasi Interceptors sesuai kebutuhan dan menyimpannya di folder generated
.
Bahkan jika berhasil, itu tidak berarti Anda harus melewatkan langkah ini! Bahkan, ketika ini dijalankan, magento juga memeriksa duplikasi injeksi, loop ketergantungan, dan langkah-langkah mendasar lainnya yang akan membuat situs Anda lebih stabil dan kecil kemungkinannya untuk crash dan mati.
Saya sangat yakin bahwa kesalahan itu disebabkan oleh penggunaan kelas yang tidak dapat dikompilasi oleh Magento karena beberapa argumen konstruktor yang salah.
Error yang Anda posting cukup samar-samar, tetapi saya yakin Anda memiliki kelas yang memperluas kelas AbstractView
, 99% itu adalah blok di suatu tempat di modul kustom Anda yang tidak meneruskan argumen yang benar ke metode parent::__construct()
. Oleh karena itu ketika diinstansiasi gagal.
Perhatikan bahwa semua blok memperluas kelas AbstractView sehingga Anda harus menjalankan perintah kompilasi dengan xdebug
aktif dan mengatur log untuk melihat jejak tumpukan untuk melihat kelas apa yang disebut terakhir sebelum gagal.
Fakta bahwa situs berjalan tanpa kesalahan itu berarti bahwa Anda tidak benar-benar menggunakan blok yang terganggu di mana saja di halaman Anda, tetapi Magento masih akan mencoba mengkompilasinya ketika menjalankan perintah compile
, sehingga gagal.