Di magento 1 saya bisa membuat file di mana saya hanya perlu membuat instance Mage_Core_Model_App
kelas dan kemudian saya bisa menambahkan kode "kotor" saya untuk tujuan pengujian.
Sesuatu seperti ini test.php
:
<?php
//some settings
error_reporting(E_ALL | E_STRICT);
define('MAGENTO_ROOT', getcwd());
$mageFilename = MAGENTO_ROOT . '/app/Mage.php';
require_once $mageFilename;
Mage::setIsDeveloperMode(true);
ini_set('display_errors', 1);
umask(0);
//instantiate the app model
Mage::app();
//my toy code in here.
Kemudian saya bisa memanggil test.php
browser dan melihat apa yang saya lakukan.
Bagaimana saya bisa melakukan hal yang sama untuk Magento 2?
cron.php
:$app = $bootstrap->createApplication('Magento\Framework\App\Cron', ['parameters' => ['group::']]);
. Haruskah saya membuat model aplikasi saya sendiri?Jawaban:
Berdasarkan jawaban @ Flyingmana, saya melakukan sedikit penggalian dan menemukan solusi. Tampaknya bekerja untuk saya.
Pertama solusi saya, lalu beberapa penjelasan.
Saya telah membuat file bernama
test.php
root dari contoh magento saya.Kemudian saya membuat file yang disebut
TestApp.php
di tempat yang sama dengan konten ini.Sekarang saya bisa memanggil
test.php
browser dan segala sesuatu yang ditempatkan di TestApp :: launch () akan dieksekusi.Sekarang, mengapa ini berhasil:
Metode
createApplication
dari kelas bootstrap adalah bagian yang paling penting. Itu menciptakan turunan dari suatu kelas aplikasi. Metode inicreateApplication
mengharapkan implementasi dari\Magento\Framework\AppInterface
yang berisi 2 metode.Jadi saya membuat kelas saya sendiri dalam
TestApp
mengimplementasikan antarmuka itu. Saya membuat metodecatchException
kembalifalse
selalu karena saya tidak ingin aplikasi saya menangani pengecualian. Jika ada sesuatu yang salah, cetak saja di layar.Kemudian saya menerapkan metode ini
launch
. ini disebut oleh\Magento\Framework\App\Bootstrap::run
.run
Metode ini melakukan hal yang hampir sama tidak peduli apa aplikasi dilewatkan sebagai parameter.Satu-satunya hal yang tergantung pada aplikasi adalah baris ini:
Ini berarti bahwa panggilan
\Magento\Framework\App\Bootstrap::run
akan init Magento env (mungkin melakukan beberapa hal gila lainnya ... Saya belum memeriksa semuanya) kemudian memanggillaunch
metode dari aplikasi.Itu sebabnya Anda harus memasukkan semua kode kotor Anda ke dalam metode itu.
Kemudian
\Magento\Framework\App\Bootstrap::run
panggilan$response->sendResponse();
mana$response
adalah apa yanglaunch
kembali metode.Karena itulah
return $this->_response;
diperlukan. Itu hanya mengembalikan respons kosong.Saya membuat kelas aplikasi saya diperluas
\Magento\Framework\App\Http
sehingga saya sudah memiliki parameter permintaan dan respons (dan lainnya), tetapi Anda dapat membuat kelas Anda tidak memperpanjang apa pun. Maka Anda perlu menyalin konstruktor dari\Magento\Framework\App\Http
kelas. Mungkin menambahkan lebih banyak parameter di konstruktor jika Anda membutuhkannya.sumber
TestApp
kelasnya dapat didefinisikan dalamtest.php
file yang sama , tetapi saya tidak ingin membuatnya sekotor itu :)parent::launch();
sebagai baris pertamalaunch()
metode karena memberi saya kesalahan "Kode area tidak disetel"Untuk tes cepat / pendek / kotor, saya menggunakan sesuatu seperti ini:
sumber
Berdasarkan jawaban @ Marius saya datang dengan ini.
Ini berfungsi baik melalui baris perintah maupun browser, yang menurut saya berguna.
Berikut ini contoh skrip untuk menghapus kategori secara pemrograman.
scripts/abstract.php
scripts/delete-category.php
Lalu saya jalankan saja seperti
php scripts/delete-category.php
sumber
Magento\Framework\Exception\LocalizedException: Area code is not set
. Bagaimana saya bisa mengaturnya? Saya butuh fronend.Seperti yang diminta, contoh yang sangat singkat tentang bagaimana Anda dapat menulis tes (tanpa menempatkannya dalam struktur ekstensi folder Anda). Sayangnya ini semua baris perintah dan bukan untuk konsumsi melalui browser.
Buat file
dev/tests/unit/quicktest.php
dengan
lalu dari direktori
dev/tests/unit/
jalankanphpunit quicktest.php
yang akan menjalankan kode Anda. Ini semua berfungsi sejak filedev/tests/unit/phpunit.xml.dist
dimuat secara otomatis dan menyiapkan lingkungan.Dalam banyak kasus, Anda mungkin harus memberikan input ke konstruktor kelas. Silakan lihat tes yang ada di bawah
dev/tests/unit/testsuite/
untuk contoh lebih lanjut tentang bagaimana ini bisa terlihat, termasuk benda mengejek.sumber
Berikut cara yang lebih baik daripada menghubungkan ke sistem pengujian: Gunakan antarmuka baris perintah Magento 2.
Ini berarti Anda harus mengintegrasikan kode kotak pasir Anda ke dalam modul yang sebenarnya (atau membuatnya untuk tujuan itu), tetapi Anda tetap harus melakukannya.
Setelah Anda mengatur modul , menambahkan perintah cukup mudah. Yang Anda butuhkan hanyalah kelas, dan DI untuk mendaftarkannya.
1. {module} /etc/di.xml
2. {module} /Console/Command/GreetingCommand.php
Contoh berasal dari https://github.com/magento/magento2-samples/tree/master/sample-module-command - lihat di sana untuk modul lengkap yang menggabungkan fungsi ini. Ada contoh-contoh yang kurang sepele disertakan.
Dengan konvensi, kelas perintah Anda harus selalu berada
{module}/Console/Command
, dan diakhiri denganCommand.php
.Setelah Anda menambahkan dua bit kode (dan cache Magento memerah, dll.), Jalankan perintah Anda dengan nama di SSH:
php bin/magento example:greeting
.Anda bisa menggunakan injeksi ketergantungan dalam konteks ini, sehingga Anda bisa menjalankan kode apa pun yang Anda inginkan
execute()
.Antarmuka ini dibangun di atas komponen Konsol Symfony , sehingga Anda juga memiliki akses penuh ke semua fungsionalitas yang luas itu, termasuk opsi / argumen , tabel , dan bilah kemajuan yang sangat mudah .
Jika Anda mengalami masalah dalam mengatur perintah atau opsi, Anda biasanya dapat menjalankan perintah 'daftar' untuk mendapatkan visibilitas yang lebih baik mengenai apa yang salah:
php bin/magento list
Nikmati.
sumber
Bagian yang penting adalah
\Magento\Framework\App\Bootstrap::create
tetapi karena
Bootstrap::init()
metode ini bersifat pribadi, dan ada banyak hal penting yang terjadi, metode publik yang memanggilnya diperlukan.Itu di satu sisi
createApplication()
dan mengikutirun()
metode, tetapi juga metodegetDirList()
dangetObjectManager()
, yang keduanya tidak perlu argumen.Jadi Aplikasi tidak diperlukan, kelemahannya, bahwa Handler kesalahan tidak diinisialisasi.
sumber
Mungkin di luar topik, tetapi saya selalu menggunakan file pengontrol indeks Kontak di Magento 1 untuk menguji berbagai hal (metode IndexAction). Sesederhana pergi ke example.com/contacts. Anda hanya perlu memastikan untuk tidak melakukan perubahan itu;)
Saya yakin Anda dapat melakukan hal serupa di Magento 2. Menghindarkan Anda dari keharusan membuat file baru dengan kode bootstrap.
sumber
Jawaban ini adalah sedikit modifikasi dari jawaban di atas oleh Marius
Karena di Magento 2.1 mendapat kesalahan seperti
Area code not set
ketika menggunakan kode itu.So the intension of this answer is to fix that error on Magento 2.1
Yang harus Anda lakukan untuk memperbaiki kesalahan ini adalah menentukan area di Anda
test.php file
. (lihat file yang dimodifikasi di bawah).Dan
TestApp.php
file akan tetap sama.sumber
Uncaught TypeError: Argument 2 passed to Magento\\Framework\\App\\Http::__construct() must be an instance of Magento\\Framework\\Event\\Manager, none given
Anda dapat mengarahkan skrip pada root magento dengan menambahkan kode di bawah ini dan bootstrap akan disertakan .. [Buat test.php pada folder root magento dan sertakan kode di bawah ini]
Semoga ini bisa membantu.
sumber
Anda dapat menjalankan skrip langsung dari root Magento 2 menggunakan kode di bawah ini. Buat file baru di direktori root Magento 2 dan tambahkan kode ini dan setelah ini tambahkan skrip Anda di file.
sumber
Inilah yang saya lakukan untuk membawa inisialisasi Magento ke dalam skrip khusus saya di luar direktori magento.
Ini adalah cara yang disarankan menurut dokumen Magento. http://devdocs.magento.com/guides/v2.0/config-guide/bootstrap/magento-bootstrap.html
sumber