Masalahnya sudah diketahui: lib
kelas dimuat secara eksklusif melalui autoloader, dan kami tidak dapat mengubahnya selain:
- Menyalinnya seluruhnya ke codePool yang diperiksa lebih awal dari lib.
- Menginstal autoloader PSR-0 , menentukan classmap autoload, dan kemudian menyalin file seluruhnya ke dalam struktur folder itu sebagai gantinya. [solusi saya saat ini]
Saya berada di tempat yang sulit karena saya ingin berpotensi menyentuh banyak file-file ini - tetapi demi kewarasan dan stabilitas / peningkatan kemampuan toko saya tidak ingin menyalin seluruh kelas perpustakaan.
Sekarang jelas ada solusi potensial untuk masalah ini, tetapi mereka semua datang dengan masalah mereka sendiri:
- Buka rute AOP dan gunakan perpustakaan berbasis PHP seperti Go! AOP : Terakhir saya periksa ini akan membutuhkan kelas Magento untuk dimuat oleh komposer autoloader, bukan hanya yang tersedia. Flyingmana telah melakukan beberapa pekerjaan di bidang ini, tetapi sudah pasti tidak siap untuk penggunaan produksi dan kebutuhan saya lebih cepat. Saya juga ingin mengirim sebagai ekstensi, dan itu akan memerlukan lebih banyak pengaturan komposer.
- Buka rute AOP dan gunakan ekstensi PHP asli : Mungkin yang paling menguntungkan saat ini, tetapi akan memerlukan menginstal ekstensi terpisah, belum lagi bahwa itu tidak akan bekerja dengan HHVM.
- Gunakan classkit dan / atau runkit PHP : Ini adalah ekstensi PHP asli lain sehingga memiliki masalah yang sama seperti di atas.
- Patch situs panggilan untuk menggunakan
\Danslo\Varien_X
versi namespaced ( ) saya sendiri , kemudian diperluas dari yang asli (\Varien_X
): Ada terlalu banyak callites untuk ditambal dan itu akan membutuhkan sejumlah penulisan ulang yang konyol. Bukan pilihan. Roll my own: Seharusnya mungkin untuk:
- Tulis autoloader saya sendiri.
- Salin kelas asli ke folder terpisah (
{root_dir}/var/tmp
), bungkus dalamnamespace \Magento { < original contents > }
. - Sertakan file itu.
- Sertakan kelas modifikasi saya
OriginalClass extends Magento\OriginalClass {}
Kelemahan dari ini jelas: pembuatan kode dinamis, regex, sedikit overhead untuk memuat kelas yang ditulis ulang. Tapi saya hampir yakin bahwa pada titik ini akan mengalahkan menyalin ~ 5.000 baris kode ketika saya hanya ingin menyentuh / menambah ~ 100 baris.
Saya tahu saya banyak bertanya, tetapi adakah yang modern dan relatif bersih di luar sana yang membantu menyelesaikan masalah ini?
Jawaban:
Memutuskan untuk menerapkan Go! Kerangka kerja AOP di Magento.
Lihat Danslo_Aop di github.
sumber
Saya ingin menambahkan Go itu! Kerangka kerja AOP dapat bekerja tanpa komposer, saya dapat membantu dengan konfigurasi (buat saja masalah pada github untuk itu). Komposer diperlukan hanya untuk integrasi transparan dengan aplikasi modern.
Cukup ganti
include $filename
ataurequire $filename
di bootstrap Anda denganinclude FilterInjectorTransformer::rewrite($filename)
dan konfigurasikan autoloader untuk Go! AOP itu sendiri.sumber
Pergilah dengan pendekatan autoloader. Ganti nama / semua / kelas di lib dengan awalan:
Jalankan "override fixer" berikut ini setiap kali Anda menambahkan file ke mylib:
Ajari autoloader untuk kembali
mylib/${classname}.php
jika ada danmylib/full/path/to/class.php
jika tidak danmylib/full/path/to/class.php
tidak.Masukkan override Anda
mylib/full/path/to/class.php
dan perpanjang versi Oldlib_.Upgrade hanya memutar kembali awalan di lib / meng-upgrade-nya, menerapkan kembali awalan, jalankan kembali fixer override. Yang tersisa adalah barang-barang yang dipindahkan
lib/
dan sebelumnya diganti, tetapi itu tidak terkait dengan masalah. Masalah Anda mungkin adalah jumlah file pada direktori mylib /, tapi saya yakin Anda bisa menyelesaikannya :).sumber
a modern
cara menulis ulang file lib. Pemrograman imperatif adalah sekolah kuno;)Anda juga dapat menentukan Stream kustom dan menambahkannya di atas jalur pengisian otomatis. Ini bekerja dengan autoloader dan adopsi minimal. Lihat contoh
sumber