Magento Marketplace teknik inceleme raporunda meydana gelen uyarılar / hatalar nasıl giderilir?


25

Yeni Magento Pazarı ile sunulan bir uzatma, Piyasada onaylanması ve kullanıma sunulması için çeşitli doğrulama durumlarından geçer.

Bunlardan biri, aşağıdakine benzer bir teknik rapor alabileceğiniz teknik incelemedir:

Pazar Yeri Teknik Raporu

Gördüğünüz gibi, 200'den fazla uyarı benden korktu, her uyarının dokümanlardaki listeden ayrı olarak düzeltilmesine yardımcı olacak herhangi bir kaynak var mı: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


Ben gibi hissediyorum birisi PHP CodeSniffer ve kullanma burada önermek gerekir standarttır her şeyin Magento 2 kullandığı ... PSR-2? Şüphesiz !?
Robbie Averill

Hem PSR-1'i hem de PSR-2'yi kullanır.
Manish


Yanıtlar:


31

Rapordan geçtikten bir saat sonra aşağıdaki listeyle karşılaştım, sanırım herkes için faydalı olabilir.

Daha fazla uyarı / hata bulduğumda güncel tutmaya çalışacağım:

Uyarılar

Satır 80 karakteri aşıyor; X karakter içeriyor

Veya

Satır maksimum 100 karakter sınırını aşıyor; X karakter içeriyor

Bunlar en çok gördüğüm, açıklayıcı, temiz ve okunaklı bir kod tutmak için kodlama satırlarını küçük tutmak iyi bir uygulamadır.

İşlev çağrısında virgülten sonra boşluk bulunamadı

Parametreleri alan ve virgülden sonra boşluk ekleyen bir işlev çağırdınız. Örnek: strrchr($bla,".")olmalıstrrchr($bla, ".")

Beklenen \ "while (...) {\ n \"; \ "while (...) \ n {\ n \" bulundu

Beklenen \ "foreach (...) {\ n \"; \ "foreach (...) \ n {\ n \" bulundu

Beklenen \ "if (...) {\ n \"; \ "if (...) \ n {\ n \" bulundu

Beklenen \ "} else {\ n \"; \ "} \ n başkası bulundu {\ n \"

Bu, bu PHP ifadelerinin açılmadan önce bir satır döndürdüğünüz anlamına gelir.

İf / else ifadesiyle hatalı bir sözdizimi örneği:

if (true)
{
}
else
{
}

Olmalı

if (true) {
} else {
}

Çok satırlı işlev bildiriminin kapanış parantezi ve açılış ayracı aynı satırda olmalıdır

Çoğu zaman, böyle bir şeyi ilan ettiğiniz kurucuda olur:

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

Oysa ki:

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

Satır sonu karakteri geçersiz; beklenen \ "\ n \" fakat \ "\ r \ n \" bulundu

Dosyanın başında çoğu zaman gerçekleşir, bunun sebebi IDE'nizin dönüş karakterini kodlamasıdır.

Değişken \ "your_variable \" geçerli deve büyüklüğü biçiminde değil

Her değişkenin deve büyüklüğü biçimini kullanması $your_variablegerekir;$yourVariable

\ "One2Three \" değişkeni sayıları içerir ancak bu önerilmez

Değişkenlerinizde sayı kullanmaktan kaçının

Satır içi kontrol yapılarına izin verilmez

Aşağıdaki gibi satır içi kontrol yapılarını kullanmamalısınız:

else $test = true;

Kullanmalısın:

else {
    $test = true;
}

Bir sınıfın açılış ayracı, tanımdan sonra satırda olmalıdır

Bir sınıf bildirirken bir satır döndürdünüz:

class Test
{

Açma ayracını aynı satırda tutmalısınız:

class Test {

Özel üye değişkeni \ "yourVariable \" öncül alt çizgi içermelidir

Korumalı üye değişkeni \ "yourVariable \" baştaki bir alt çizgi içermelidir

Korunan ve özel üye değişkenlerinize lider alt çizgi eklemelisiniz: $_yourVariable

Bu ikisinin tersine, ortak değişkeninize alt çizgi eklerseniz, aşağıdakileri yapabilirsiniz:

\ "_ YourVariable \" genel üye değişkeni, öncü alt çizgi içermemelidir.

$ Bla yöntem parametresi asla kullanılmaz

Bir parametreye bir metodu geçtiniz fakat onu asla kullanmadınız.

Çok satırlı işlev bildirimi doğru girintili değil; 8 boşluk bekleniyor ancak X bulundu

İşlev bildirim parametrelerinize çok fazla girinti eklediniz:

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

Olmalı:

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

Muhtemel işe yaramaz yöntem geçersiz kılma tespit edildi

Değişiklik eklemeden bir yöntemi geçersiz kılıyorsunuz, örneğin:

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

Model LSD yöntemi yükü () döngüde algılandı

Bu load()yöntemi, önerilmeyen ve kaçınılması gereken bir döngü içinde kullanıyorsunuz .

Büyük olasılıkla kodunuz şöyle görünüyor:

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

Bir döngü içinde bir model yüklüyorsanız, performans açısından gerçekten oldukça kötü. Yalnızca birkaç özellik almanız gerekiyorsa, bunun yerine koleksiyonları kullanmalısınız.

Fonksiyonun siklomatik karmaşıklığı (X) 10'u aşar; işlevi yeniden düzenlemeyi düşünün

Eğer siklomatik karmaşıklığa aşina değilseniz, bu yazıyı okumanızı öneririm: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Bu uyarı temel olarak, fonksiyonunuzda çok fazla döngü ve koşul olduğu anlamına gelir.

Magento 2'de doğrudan nesne örneklemesi önerilmez

Örneğin nesneyi doğrudan sınıfı çağırarak başlattığınız gerçeğinden kaynaklanmaktadır, örneğin:

new \Zend_Filter_LocalizedToNormalized

Bağımlılık enjeksiyonunu veya son çare, nesne yöneticisi kullanmalısınız.

Yorumlar bir TODO görevine atıfta bulunur

Yorumunuzdan biri aşağıdaki @TODObayrağı içeriyor .

Her zaman doğru veya yanlış olan IF ifadelerinden kaçının

Her zaman doğru veya yanlış gibi görünen bir koşul yarattınız.

Örneğin:

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

Hatalar

\ "Class \" sınıfı için ad alanı belirtilmedi.

use Path\To\Class;Sınıfınızın başındaki ifadeyi kaçırıyorsunuz .


1
Bunu doğru anladıysam, bu tavsiyeler tüm M2 uzantılarını (kişisel kullanım için bile) ifade eder.
Siarhey Uchukhlebau

@SiarheyUchukhlebau evet bu size bir kez olsun teknik rapor Magento Marketplace üzerinde bir uzantı yüklemek var
Dijital pianism Raphael

1
You should keep the opening brace on the same line:Diğer yoldan değil mi? Bu arada büyük yazı
Claudiu Creanga

@ClaudiuCreanga Sanırım haklısın iki kez kontrol etmeme izin ver;)
Raphael, Digital Pianism'de,

10 k'dan fazla uyarı mesajı olan bir uzantıdan geçmek mümkün müdür? Yoksa uyarıları olan her şeyi reddediyorlar mı?
Roland Soós

9

Codesniffer'ı MEQP1 veya MEQP2 kural kümesiyle kullanmak (Magento sürümünüze bağlı olarak), Magento kuralları hakkında bir fikir verecektir: https://github.com/magento/marketplace-eqp/tree/master/

Bu kural seti ve Marketplace’in gönderme işleminde çalışanlar her zaman mükemmel senkronizasyonda DEĞİLDİR (elbette, bu idealdir), bu nedenle Github’daki en son sürümü geçse bile kodlardan kaynaklanan hataları reddedebilirsiniz.

Daha yaygın olan "önem derecesi-10" hatalarından bazıları (uzantınızın reddedileceği tek hatalar) ve listelenen önerileri şunlardır:

PHP dosyasının sonunda kapanış etiketine izin verilmez

Öneri: PHP kapanış etiketini kaldırın.

Çağrı süresi referans by pass çağrıları yasaktır

Öneri: PHP 5'deki referanslarla ilgili belgeleri okuyun ve kodunuzu yeniden yazın. Kaynaklar: http://php.net/manual/en/language.references.pass.php

$ _ENV Superglobal'ın doğrudan kullanımı tespit edildi.

$ _GET Superglobal'ın doğrudan kullanımı tespit edildi.

$ _POST Superglobal'ın doğrudan kullanımı tespit edildi.

$ _REQUEST Superglobal'ın doğrudan kullanımı tespit edildi.

$ _SESSION Superglobal'ın doğrudan kullanımı tespit edildi.

$ GLOBALS Superglobal'ın doğrudan kullanımı tespit edildi.

Öneri: Çerez, oturum veya istek verisi almak için karşılık gelen sarıcı nesneleri kullanın.

Set_magic_quotes_runtime () işlevi kullanımdan kaldırıldı

Öneri: Kaldırılan işlevler, gelecekteki bir sürümden herhangi bir zamanda kaldırılabileceğinden kullanılmamalıdır. [Muhtemelen tüm itirazlar için genel bir hata]

Özdeş işleç === strpos işlevinin döndürdüğü değeri test etmek için kullanılmaz

Aynı operatör === stripos fonksiyonunun dönüş değerini test etmek için kullanılmaz

Öneri: Bu işlevin dönüş değerini test etmek için === operatörünü kullanın.

Geri alıntı dizesi sabiti yanlış kullanımı. Geri tırnaklar her zaman dizelerin içinde olmalıdır.

Tavsiye: [ayrı bir öneri yok. Bunun, ters alıntılar yoluyla yürütülmesini engellemek olduğunu düşünüyorum.]

[ClassName] sınıfında _isAllowed () ACL yöntemini eksik.

Öneri: Ayrıcalıkların belirlenmesi, yönetimi ve ele alınmasını çok dikkatli bir şekilde yönetin. Her bir adminhtml denetleyicisi için adminhtml.xml dosyasında ACL kaynağı tanımlanmalı ve _isAllowed () yöntemi uygulanmalıdır.

[ExceptionClassName] sınıfı için ad alanı belirtilmedi.

Öneri: İstisna ad alanını belirtin.

PHP sözdizimi hatası: Çağrılma referans referans kodu kaldırıldı

Öneri: Sözdizimi hatası düzeltildi. [Bu, yukarıdakilere eşlik eder. Diğer tüm PHP sözdizimi hataları için benzer bir genel hatanın verildiğini hayal ediyorum]

Muhtemel Magento 2 tasarım ihlali. Tipik Magento 1 yapısı tespit edildi.

Öneri: [Bu bir öneri ile birlikte gelmiyor, ancak Mage :: blah veya Mage_blah_blah :: blah gibi sınıf kullanımının tespit edildiği kodları açıklıyor - bunlar yalnızca Magento 1'de bulunan ve Magento 2'de çalışmayan sınıflardır. İyi bir fikir Mage(\b|_)M1 kullanımlarını önceden kontrol etmek için M2 uzantınızı regex'te arayın .]

PHP 7'de kaynak ayrılmış bir kelimedir.

Öneri: [Ayrı bir öneri yok. Sözcüğü yeniden adlandırmak başka bir işe yaramalı. Bu hatanın ayrılmış tüm kelimeler için mevcut olduğunu hayal ediyorum.]

Açılış PHP etiketi, dosyadaki ilk içerik olmalıdır

Öneri: PHP Açılış Etiketinden önceki tüm karakterleri kaldırın.

Kalıp dili yapısının kullanılması önerilmemektedir.

Çıkış dili yapısının kullanılması önerilmez.

Öneri: setBody () yanıt nesnesi yöntemi kullanılmalıdır.

Yankı dili yapısının kullanılması önerilmez.

Baskı dili yapısının kullanılması tavsiye edilmez.

Öneri: Eko, başlık vb. Sınıflarda yankı, başlık vb. Kullanımını önlemek için değiştirilmelidir, yanıt nesnesinin setBody () yöntemini kullanın.

Eval () kullanımı tavsiye edilmez

Öneri: eval () kullanmaktan kaçının.


Uzantınızın reddedilmesine neden olan bu hatalardan farklı olarak, uzantınızın kodunu iyileştirmeye yardımcı olmak için uyarılar şu anda yalnızca bir nezaket olarak listelenmiştir. Ancak birçoğu olmak üzere, teknik inceleme uyarıları için reddedilmeyeceksiniz.

Tabii ki, bu kural gelecekte daha da sıkılaştırılabilir ve kurallara dayanan kurallar sürekli gözden geçiriliyor, bu yüzden kaç tane uyarı alabileceğinizi görmek her zaman iyi bir plandır. Uyarılar, kod tabanınızla ilgili sistemik sorunları da gösterebilir.


Teknik incelemeden reddedilme nedenleri şu anda çevrimiçi raporda görünmüyor ve yalnızca e-postada belirtiliyor.

Kopyala yapıştır ihlalleri ve tespit edilen kötü amaçlı yazılımlar gibi şeyler yalnızca e-postada gösterilen ve uzantınızın kabul edilmediğini bildiren iletiler gösterecektir, bu nedenle e-postayı dikkatlice okuyun .

Bu e-postaların arşivi şu anda geliştirici portalında görünmüyor, bu yüzden okumadan silmeniz ya da önemsiz dosyalama yapmanız durumunda, gittiler.

Magento'nun Seviye 1 gözden geçirenleri bazen bu e-postaya ek bilgi verdiler, ya "bilmek" isteyebileceklerini düşündükleri şeyler gibi, "bu dizi anahtarı" sever "muhtemelen" sunucu "olmalı" ya da red ve önerileri için gerekçeler gibi "Tüm Magento çekirdek dosyasını kopyaladınız ve sınıf yolunu yeni değiştirdiniz: bunun yerine bir sınıf tercih ayarını değiştirebilirsiniz." veya "Birkaç tane değiştirmek için tüm Magento çekirdek dosyasını kopyaladınız. genel işlevler: bunun için eklentileri kullanabilirsiniz. "

Bunları okumazsanız ve yalnızca kodlama raporuna bakın, yanlış sorunları gidermeye çalışabilirsiniz.


Not unescaped output detectedmesajı kullanarak kaçtı kullanmamaları gerekiyor @escapeNotVerifiedveya @noEscapeyorumlarınızı. Magento'nun gelecekteki sürümlerinde bu muhtemelen yasaklanacak. Bunun yerine, aşağıdakilerden birini kullanın:

  • Tek tırnak içinde herhangi bir statik dize.
  • Satır içi değişkenleri olmayan, çift tırnaklı statik bir dize.
  • [önerilir] değeri kaçış yöntemlerinden biriyle kaçan \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Sayısal bir türe yapılan değer (en azından bool ve int, belki diğerleri?)
  • Adında "html" sözcüğü olan herhangi bir yöntem çağrısı gibi printBannerHtml(). Bunu kötüye kullanma! blahHtml()Yöntemin gerçekten tüm değişkenlerden kaçtığından emin olun .

uzatma ekran uyarım ancak yukarıdakilerin hiçbiri bu yüzden uyarım nedeniyle uzatma reddedilebilir mi?
Sanjay Gohil

Bunu bir süre önce gönderdim - o zamandan beri eklenen yenileri olabilir. Geliştirici hesabınıza giriş yaptığınızda, uzantıyı tıklayın ve hata günlüğünü görüntüleyin, gördüğünüz mesaj nedir ve hangi seviyelerde hatalar? Önem derecesi 10 değilse, başka bir nedenle reddedilebilir. Reddetme e-postası ne diyor?
Dewi Morgan

6

Hata:

Çıkmayan çıktı algılandı

.Phtml dosyasında hata

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

Sen kullanmak bağırmak:

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

Http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates için Templates XSS güvenliğine bakın


Bu olağanüstü zayıf programlama tarzı. Lütfen @noEscapeve @escapeNotValidatedkomutlarını bu şekilde kötüye kullanmayın : yaparsanız, MEQP sistemi tarafından onaylanmayacak ve daha sonra izin verilmeyebilir. Verilerinizden kaçmak için daha iyi bir dizi yol için cevabımın en altına bakın.
Dewi Morgan

1
@Dewi Morgan: Değerli bilgileriniz için teşekkür ederiz.
Sankar_k
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.