Saya telah bekerja dalam sebuah proyek dengan beberapa kode khusus ... ini adalah proyek "medium" Magento 2 pertama kami, jadi (karena semua orang di sini saya pikir) setiap hari kami mempelajari hal-hal baru, dan kami harus mengubah cara untuk menangani dengan versi Magento baru ini
Alasan untuk pertanyaan ini adalah menanyakan tentang perintah setup:di:compile
Saya telah menggunakannya sejak hari pertama dengan Magento 2, karena bin / magento memintanya setelah setiap setup:upgrade
, dengan pesan "Silakan jalankan kembali perintah kompilasi Magento"
Yah ... Saya telah menemukan mengeksekusi setup:di:compile
halaman istirahat tampilan produk dalam proyek ini, dengan Kesalahan Fatal yang sepenuhnya ambigu. Saya telah menghabiskan seluruh hari kerja untuk mencoba debug dan menguji dengan perubahan kode tanpa hasil
Hari ini, saya telah menemukan bahwa jika saya menghilangkan perintah itu maka semua berfungsi seperti pesona, bahkan dalam mode produksi
Jadi, pertanyaannya adalah ... apa tepatnya setup:di:compile
perintah itu? Apakah itu wajib? Baru saja direkomendasikan? Atau itu adalah perintah yang sudah usang, yang tidak perlu dieksekusi?
MEMPERBARUI
Seperti yang diperlukan beberapa pengguna, ini adalah Kesalahan Fatal yang saya maksudkan
Kesalahan fatal PHP: Tidak dapat membuat instance kelas abstrak Magento \ Catalog \ Block \ Product \ View \ AbstractView in *** / vendor / magento / framework / ObjectManager / Factory / AbstractFactory.php on line 93
Saya telah mencari setiap blok khusus menggunakan Magento \ Catalog \ Block \ Product \ View \ AbstractView tetapi saya menemukannya hanya di file tata letak, tidak ada di konstruktor kelas blok mana pun
Yang tidak bisa saya pahami adalah: mengapa Magento melempar Kesalahan Fatal ini dengan kode terkompilasi, tetapi ia berfungsi seperti pesona tanpa kode terkompilasi
sumber
Jawaban:
Perintah
setup:di:compile
perintah menghasilkan kontenvar/di
folder di Magento <2.2 dangenerated
untuk Magento> = 2.2Menurut Magento, ini melayani tujuan 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 itu memang masih berfungsi. Jadi menurut dokumen Magento, ini lebih merupakan langkah pengoptimalan (yaitu, pembuatan kode interseptor yang dioptimalkan)
Ketika kami memiliki kesalahan dalam
setup:di:compile
perintah, ini sebagian besar karena kesalahan di salah satu konstruktor dari kelas php kustom.sumber
Ini tidak wajib untuk menjalankan
setup:di:compile
perintah setiap kali tetapi jika Anda telah melakukan perubahan kode khusus dengan metode pabrik, proksi, tambahkan plugin atau kompilasi kode apa pun maka Anda harus menjalankan perintah ini.magento setup:di:compile
untuk menghasilkan file yang diperlukan. Kedua opsi berakhir dengan menghasilkan kelas diMAGENTO_ROOT/var/generation directory
(atau/generated
jika Magento 2.2+).Kelas apa yang dihasilkan?
Pabrik
Pabrik digunakan untuk instantiate objek yang tidak dapat disuntikkan secara otomatis. Misalnya, objek produk harus dimuat dari database, tetapi wadah injeksi ketergantungan tidak memiliki informasi yang cukup untuk membuat objek ini. Itu sebabnya kami menggunakan pabrik.
Proksi
Magento 2 menggunakan injeksi konstruktor di mana semua dependensi diperlukan. Anda tidak dapat membuat instance objek tanpa melewati semua dependensi. Bagaimana jika Anda ingin memiliki dependensi opsional? Itu sebabnya proxy ada.
Plugin (Interceptor)
Sederhananya, plugin adalah mekanisme penyesuaian utama untuk Magento 2. Tidak ada lagi penulisan ulang kelas. Ini memungkinkan Anda untuk terhubung dan melakukan sesuatu sebelum, setelah atau di sekitar metode publik aplikasi apa pun.
ketika Anda menjalankan setup: di: compile perintah yang dilakukannya di bawah ini
Kompilasi kode terdiri dari semua hal berikut tanpa urutan tertentu:
Pembuatan kode aplikasi (pabrik, proksi, dan sebagainya)
Agregasi konfigurasi area (yaitu, konfigurasi injeksi dependensi yang dioptimalkan per area)
Generasi interseptor (yaitu, generasi kode interseptor yang dioptimalkan)
Pembuatan cache intersepsi Pembuatan kode repositori (yaitu, kode yang dihasilkan untuk API)
Pembuatan atribut data layanan (yaitu, kelas ekstensi yang dihasilkan untuk objek data)
Lihat jawaban ini untuk kapan kita harus menjalankan perintah mana: /magento//a/184927/35758
sumber
Magento masih akan berjalan di produksi dan dev tanpa perintah di: compile. Ini sebenarnya akan mengkompilasi Interceptor karena perlu dan menyimpannya di
generated
folder.Bahkan jika itu berhasil, itu tidak berarti Anda harus melewati langkah ini! Bahkan, ketika ini dijalankan, Magento juga memeriksa injeksi digandakan, loop ketergantungan dan langkah-langkah mendasar lainnya yang akan membuat situs Anda lebih stabil dan kecil kemungkinannya untuk crash dan! Mati.
Saya sangat percaya bahwa kesalahan itu disebabkan oleh penggunaan kelas yang tidak bisa dikompilasi Magento karena beberapa argumen konstruktor yang salah.
Kesalahan yang Anda posting cukup kabur, tetapi saya yakin Anda memiliki kelas yang memperluas
AbstractView
kelas, 99% itu adalah blok di suatu tempat di modul khusus Anda yang tidak memberikan argumen yang benar keparent::__construct()
metode . Karena itu ketika instantiated gagal.Perhatikan bahwa semua blok memperpanjang kelas AbstractView sehingga Anda harus menjalankan perintah kompilasi dengan
xdebug
on dan mengatur log saat melihat jejak stack untuk melihat kelas apa yang disebut terakhir sebelum gagal.Fakta bahwa situs berjalan tanpa kesalahan itu berarti bahwa Anda tidak benar-benar menggunakan blok rusak di mana pun di halaman Anda, tetapi Magento masih akan mencoba untuk mengkompilasinya ketika menjalankan
compile
perintah, maka itu gagal.sumber