Bagaimana cara memperbaiki peringatan / kesalahan yang diajukan oleh laporan tinjauan teknis Magento Marketplace?

25

Dengan Magento Marketplace baru, perpanjangan yang diajukan melewati beberapa negara validasi agar dapat disetujui dan tersedia melalui Marketplace.

Salah satunya adalah tinjauan teknis, dari mana Anda bisa mendapatkan laporan teknis seperti berikut:

Laporan Teknis Marketplace

Seperti yang Anda lihat, 200+ peringatan agak menakutkan bagi saya, adakah sumber daya untuk membantu memperbaiki setiap peringatan selain dari daftar yang tersedia di dokumen: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?

Raphael di Digital Pianism
sumber
Saya merasa seseorang harus menyarankan di sini menggunakan PHP CodeSniffer dan apa pun standarnya yang digunakan Magento 2 ... PSR-2? Pasti!?
Robbie Averill
Ini menggunakan PSR-1 dan PSR-2.
Manish
@raphael, tolong lihat ini, magento.stackexchange.com/questions/192506/…
abhishek
@raphael tolong lihat ini ,: magento.stackexchange.com/questions/71399/...
abhishek

Jawaban:

31

Setelah satu jam membaca laporan saya menemukan daftar berikut, ini bisa bermanfaat untuk semua orang yang saya kira.

Saya akan mencoba memperbaruinya segera setelah saya menemukan lebih banyak peringatan / kesalahan:

Peringatan

Baris melebihi 80 karakter; berisi karakter X

Atau

Baris melebihi batas maksimum 100 karakter; berisi karakter X

Itu adalah salah satu yang paling sering saya lihat, mereka cukup jelas, itu adalah praktik yang baik untuk menjaga garis pengkodean kecil untuk menjaga kode yang bersih dan mudah dibaca.

Tidak ada ruang yang ditemukan setelah koma dalam panggilan fungsi

Anda telah memanggil fungsi yang menerima parameter dan tidak menambahkan spasi setelah koma. Contoh: strrchr($bla,".")seharusnyastrrchr($bla, ".")

Diharapkan \ "while (...) {\ n \"; ditemukan \ "while (...) \ n {\ n \"

Diharapkan \ "foreach (...) {\ n \"; ditemukan \ "foreach (...) \ n {\ n \"

Diharapkan \ "jika (...) {\ n \"; ditemukan \ "jika (...) \ n {\ n \"

Diharapkan \ "} else {\ n \"; ditemukan \ "} \ n lain {\ n \"

Itu berarti Anda telah mengembalikan garis sebelum braket pembuka dari pernyataan PHP tersebut.

Contoh sintaks yang buruk dengan pernyataan if / else:

if (true)
{
}
else
{
}

Seharusnya

if (true) {
} else {
}

Tanda kurung penutup dan kurung buka deklarasi fungsi multi-baris harus berada di baris yang sama

Sebagian besar waktu, itu terjadi di konstruktor di mana Anda menyatakan sesuatu seperti ini:

public function __construct(
    ProductFactory $productFactory,
    Test $test
)
{
}

Padahal seharusnya:

public function __construct(
    ProductFactory $productFactory,
    Test $test
) {
}

Karakter akhir baris tidak valid; diharapkan \ "\ n \" tetapi ditemukan \ "\ r \ n \"

Sering terjadi di awal file, itu disebabkan oleh cara IDE Anda mengkodekan karakter kembali.

Variabel \ "your_variable \" tidak dalam format topi unta yang valid

Setiap variabel harus menggunakan format topi unta, demikian juga $your_variableseharusnya$yourVariable

Variabel \ "one2Three \" berisi angka tetapi ini tidak disarankan

Hindari menggunakan angka dalam variabel Anda

Struktur kontrol sebaris tidak diizinkan

Anda tidak boleh menggunakan struktur kontrol sebaris seperti:

else $test = true;

Kamu harus menggunakan:

else {
    $test = true;
}

Pembukaan brace suatu kelas harus ada di garis setelah definisi

Anda telah mengembalikan garis ketika mendeklarasikan kelas:

class Test
{

Anda harus menjaga brace pembuka pada baris yang sama:

class Test {

Variabel anggota pribadi \ "yourVariable \" harus berisi garis bawah utama

Variabel anggota yang dilindungi \ "yourVariable \" harus mengandung garis bawah utama

Anda harus menambahkan garis bawah utama ke variabel anggota yang dilindungi dan pribadi: $_yourVariable

Sebagai kebalikan dari keduanya, jika Anda menambahkan garis bawah dalam variabel publik Anda, Anda bisa mendapatkan:

Variabel anggota publik \ "_ yourVariable \" tidak boleh berisi garis bawah utama.

Parameter metode $ bla tidak pernah digunakan

Anda telah mengirimkan parameter ke suatu metode tetapi Anda tidak pernah menggunakannya.

Deklarasi fungsi multi-baris tidak membuat indentasi benar; diharapkan 8 spasi tetapi ditemukan X

Anda telah menambahkan terlalu banyak lekukan ke parameter deklarasi fungsi Anda:

public function __construct(ProductRepository $productRepository,
                            ListsInterface $listsInterface,
                            Data $helper
) {

Seharusnya:

public function __construct(ProductRepository $productRepository,
    ListsInterface $listsInterface,
    Data $helper
) {

Kemungkinan metode sia-sia terdeteksi

Anda mengganti metode tanpa menambahkan modifikasi, contoh:

public function __construct(Context $context) {
    parent::__construct($context);
}

Model memuat metode LSD () terdeteksi dalam loop

Anda menggunakan load()metode di dalam perulangan yang tidak direkomendasikan dan harus dihindari.

Kemungkinan besar kode Anda terlihat seperti ini:

foreach(...) {
    $model->load();
}

Jika Anda memuat model dalam satu lingkaran, itu memang sangat buruk dalam hal kinerja. Jika Anda hanya perlu mengambil beberapa atribut, Anda harus menggunakan koleksi saja.

Kompleksitas siklomatik fungsi (X) menunjukkan 10; pertimbangkan refactoring fungsi

Jika Anda tidak terbiasa dengan kompleksitas cyclomatic, saya sarankan Anda membaca di posting ini: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Peringatan ini pada dasarnya berarti bahwa ada terlalu banyak loop dan kondisi dalam fungsi Anda.

Instansiasi objek langsung tidak disarankan di Magento 2

Ini disebabkan oleh kenyataan bahwa Anda membuat instance objek secara langsung dengan memanggil kelas, misalnya:

new \Zend_Filter_LocalizedToNormalized

Anda harus menggunakan injeksi ketergantungan atau pilihan terakhir, manajer objek.

Komentar mengacu pada tugas TODO

Salah satu komentar Anda berisi @TODObendera berikut .

Hindari pernyataan IF yang selalu benar atau salah

Anda telah membuat kondisi yang tampaknya selalu benar atau salah.

Sebagai contoh:

$variable = "6";
...
// More code that doesn't change $variable
...
if ($variable)

Kesalahan

Namespace untuk kelas \ "Kelas \" tidak ditentukan.

Anda kehilangan use Path\To\Class;pernyataan di awal kelas Anda.

Raphael di Digital Pianism
sumber
1
Jika saya sudah memahami ini dengan benar, rekomendasi ini merujuk ke semua ekstensi M2 (bahkan untuk penggunaan pribadi)?
Siarhey Uchukhlebau
@SiarheyUchukhlebau ya itulah laporan teknis yang Anda dapatkan setelah Anda mengunggah ekstensi di Magento Marketplace
Raphael di Digital Pianism
1
You should keep the opening brace on the same line:bukankah sebaliknya? Pos luar biasa
Claudiu Creanga
@ClaudiuCreanga Saya pikir Anda benar, izinkan saya mengecek;)
Raphael di Digital Pianism
Apakah mungkin untuk mendorong melalui ekstensi yang memiliki lebih dari 10 ribu pesan peringatan? Atau mereka menolak segala sesuatu yang memiliki peringatan?
Roland Soós
9

Menggunakan Codesniffer dengan aturan MEQP1 atau MEQP2 (tergantung pada versi Magento Anda) akan memberi Anda gambaran tentang aturan Magento: https://github.com/magento/marketplace-eqp/tree/master/

Aturan ini dan yang berjalan pada proses pengiriman Marketplace TIDAK selalu selaras dengan sempurna (meskipun tentu saja, itu yang ideal), jadi Anda mungkin ditolak karena kesalahan codeniffer bahkan jika ia melewati versi terbaru di Github.

Beberapa kesalahan "severity-10" yang lebih umum (satu-satunya kesalahan yang akan ditolak oleh ekstensi Anda), dan rekomendasi yang tercantum, termasuk:

Tag penutup tidak diizinkan di akhir file PHP

Rekomendasi: Hapus tag penutup PHP.

Panggilan referensi lewat waktu panggilan dilarang

Rekomendasi: Baca dokumentasi referensi di PHP 5 dan perbaiki kode Anda. Referensi: http://php.net/manual/en/language.references.pass.php

Penggunaan langsung $ _ENV Superglobal terdeteksi.

Penggunaan langsung $ _GET Superglobal terdeteksi.

Penggunaan langsung $ _POST Superglobal terdeteksi.

Penggunaan langsung $ _REQUEST Superglobal terdeteksi.

Penggunaan langsung $ _SESSION Superglobal terdeteksi.

Penggunaan langsung $ GLOBAL Superglobal terdeteksi.

Rekomendasi: Gunakan objek pembungkus yang sesuai untuk mendapatkan cookie, sesi, atau meminta data.

Fungsi set_magic_quotes_runtime () telah ditinggalkan

Rekomendasi: Fungsi yang sudah usang tidak boleh digunakan karena dapat dihapus kapan saja dari versi yang akan datang. [Mungkin kesalahan umum untuk semua penghentian]

Operator identik === tidak digunakan untuk menguji nilai pengembalian fungsi strpos

Operator identik === tidak digunakan untuk menguji nilai kembali fungsi stripos

Rekomendasi: Gunakan operator === untuk menguji nilai kembali fungsi ini.

Penggunaan string back quote konstan salah. Kutipan kembali harus selalu di dalam string.

Rekomendasi: [tidak ada rekomendasi terpisah. Saya membayangkan yang satu ini adalah untuk mencegah exec melalui backquotes.]

Kehilangan metode ACL _isAllowed () di kelas [ClassName].

Rekomendasi: Sangat hati-hati mengatur pengaturan, manajemen, dan penanganan hak istimewa. Sumberdaya ACL harus didefinisikan dalam file adminhtml.xml untuk setiap kontroler adminhtml dan metode _isAllowed () harus diimplementasikan.

Namespace untuk kelas [ExceptionClassName] tidak ditentukan.

Rekomendasi: Tentukan ruang nama Pengecualian.

Kesalahan sintaksis PHP: Pass-by-referensi waktu panggilan telah dihapus

Rekomendasi: Perbaiki kesalahan sintaksis. [Yang ini menyertai hal di atas. Saya membayangkan bahwa kesalahan umum serupa diberikan untuk semua kesalahan sintaks PHP lainnya]

Kemungkinan pelanggaran desain Magento 2. Konstruksi Magento 1 yang terdeteksi khas.

Rekomendasi: [Ini datang tanpa rekomendasi, tetapi menggambarkan kode di mana penggunaan kelas seperti Mage :: blah atau Mage_blah_blah :: blah terdeteksi - ini adalah kelas yang hanya ada di Magento 1 dan tidak akan berfungsi di Magento 2. Ide yang bagus adalah untuk cari ekstensi M2 Anda untuk regex Mage(\b|_)untuk memeriksa sebelum penggunaan M1.]

sumber daya adalah kata khusus di PHP 7.

Rekomendasi: [Tidak ada rekomendasi terpisah. Cukup mengubah nama kata menjadi sesuatu yang lain harus bekerja. Saya membayangkan kesalahan ini ada untuk semua kata yang dipesan.]

Tag PHP pembuka harus merupakan konten pertama dalam file

Rekomendasi: Hapus semua karakter sebelum Tag Pembuka PHP.

Penggunaan konstruksi bahasa tidak dianjurkan.

Penggunaan konstruksi bahasa keluar tidak disarankan.

Rekomendasi: metode objek setBody () harus digunakan.

Penggunaan konstruksi bahasa gema tidak disarankan.

Penggunaan konstruksi bahasa cetak tidak disarankan.

Rekomendasi: Arsitektur ekstensi harus diubah untuk menghindari penggunaan gema, header, dll di kelas, pertimbangkan untuk menggunakan metode setBody () dari objek respons.

Penggunaan eval () tidak disarankan

Rekomendasi: Hindari penggunaan eval ().


Tidak seperti kesalahan ini, yang menyebabkan ekstensi Anda ditolak, peringatan saat ini didaftarkan hanya sebagai rasa hormat, untuk membantu meningkatkan kode ekstensi Anda. Anda TIDAK akan ditolak dari ulasan teknologi untuk peringatan, namun ada banyak.

Tentu saja, aturan ini dapat diperketat di masa mendatang, dan aturan kodeniffer sedang dikaji ulang, jadi melihat berapa banyak peringatan yang dapat Anda selesaikan selalu merupakan rencana yang bagus. Peringatan juga dapat menunjukkan masalah sistemik dengan basis kode Anda.


Beberapa alasan penolakan dari tinjauan teknis saat ini tidak muncul di laporan online, dan hanya diberikan dalam email.

Hal-hal seperti pelanggaran salin-rekat dan malware yang terdeteksi hanya akan menampilkan pesan di email yang Anda beri tahu bahwa ekstensi Anda tidak diterima, jadi baca email dengan hati-hati .

Arsip email-email ini saat ini tidak terlihat dari portal pengembang, jadi jika Anda menghapusnya tanpa membaca, atau mengarsipkannya ke sampah, maka mereka hilang.

Peninjau Tingkat 1 Magento kadang-kadang memasukkan informasi tambahan dalam email ini, baik hanya hal-hal bermanfaat yang menurut mereka mungkin ingin Anda ketahui, seperti "kunci array ini 'sever' mungkin harus 'server'," atau alasan penolakan dan saran mereka tentang cara menyelesaikannya dengan cepat, seperti "Anda menyalin seluruh file inti Magento dan baru saja mengubah classpath: Anda dapat mengganti ini dengan pengaturan preferensi kelas sebagai gantinya.", atau "Anda menyalin seluruh file inti Magento hanya untuk mengubah beberapa fungsi publik: Anda dapat menggunakan plugin untuk ini. "

Jika Anda tidak membaca ini, dan hanya melihat laporan codesniffer, Anda mungkin akhirnya mencoba untuk memperbaiki masalah yang salah.


Perhatikan bahwa unescaped output detectedpesan TIDAK harus dihindari menggunakan @escapeNotVerifiedatau @noEscapekomentar. Ini kemungkinan akan dianulir dalam versi Magento di masa mendatang. Sebaliknya, gunakan salah satu dari yang berikut:

  • Setiap string statis dalam tanda kutip tunggal.
  • String statis dalam tanda kutip ganda, tanpa variabel inline.
  • [direkomendasikan] Nilai melarikan diri dengan salah satu metode melarikan diri dari \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Nilai dilemparkan ke tipe numerik (setidaknya bool dan int, mungkin yang lain?)
  • Metode apa saja memanggil dengan kata "html" dalam nama, seperti printBannerHtml(). Jangan menyalahgunakan yang ini! Pastikan blahHtml()metode Anda benar-benar keluar dari semua variabel dengan benar.
Dewi Morgan
sumber
ekstensi display saya peringatan tetapi tidak ada yang di atas jadi mungkinkah ekstensi saya ditolak karena peringatan?
Sanjay Gohil
Saya memposting ini beberapa waktu lalu - mungkin ada yang baru ditambahkan sejak saat itu. Ketika Anda masuk ke akun pengembang Anda, klik pada ekstensi, dan lihat log kesalahan, apa pesan yang Anda lihat, dan tingkat kesalahannya? Jika tidak parah 10, maka Anda mungkin ditolak karena alasan lain. Apa yang dikatakan email penolakan?
Dewi Morgan
6

Kesalahan:

Output tidak terhapus terdeteksi

Kesalahan dalam file .phtml

<ul class="form-list" id="payment_form_<?php echo $code ?>" style="display:none;">

Anda berteriak menggunakan:

<ul class="form-list" id="payment_form_<?php /* @noEscape */ echo $code ?>" style="display:none;">

Lihat keamanan Templat XSS untuk http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates

Sankar_k
sumber
Ini adalah gaya pemrograman yang sangat buruk. Tolong jangan menyalahgunakan @noEscapedan @escapeNotValidatedmemerintahkan dengan cara ini: jika Anda melakukannya, mereka kemungkinan akan ditinggalkan dan kemudian dilarang oleh sistem MEQP. Lihat bagian bawah jawaban saya untuk beragam cara yang lebih baik untuk menghindari data Anda.
Dewi Morgan
1
@Dewi Morgan: Terima kasih atas informasi Anda yang berharga.
Sankar_k