วิธีแก้ไขคำเตือน / ข้อผิดพลาดที่เกิดจากรายงานการตรวจสอบทางเทคนิคของ Magento Marketplace


25

ด้วย Magento Marketplace ใหม่ส่วนขยายที่ส่งจะต้องผ่านการตรวจสอบหลายสถานะเพื่อที่จะได้รับการอนุมัติและพร้อมใช้งานผ่าน Marketplace

หนึ่งในนั้นคือการตรวจสอบทางเทคนิคซึ่งคุณสามารถรับรายงานทางเทคนิคได้ดังต่อไปนี้:

รายงานทางเทคนิค Marketplace

อย่างที่คุณเห็นคำเตือนมากกว่า 200 ข้อนั้นกลัวนรกฉันมีทรัพยากรที่จะช่วยแก้ไขคำเตือนทุกรายการนอกเหนือจากรายการที่มีอยู่ในเอกสาร: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


ฉันรู้สึกเหมือนมีคนแนะนำให้ใช้ PHP CodeSniffer และมาตรฐานใดที่ Magento 2 ใช้ ... PSR-2? แน่นอน !?
Robbie Averill

มันใช้ทั้ง PSR-1 และ PSR-2
Manish

@raphael, โปรดดูสิ่งนี้, magento.stackexchange.com/questions/192506/ …
abhishek

@raphael โปรดดูสิ่งนี้: magento.stackexchange.com/questions/71399/…
abhishek

คำตอบ:


31

หลังจากหนึ่งชั่วโมงผ่านรายงานฉันพบรายการต่อไปนี้อาจเป็นประโยชน์สำหรับทุกคนที่ฉันคิด

ฉันจะพยายามอัพเดทต่อไปทันทีที่ฉันพบคำเตือน / ข้อผิดพลาดเพิ่มเติม:

คำเตือน

บรรทัดมีความยาวเกิน 80 อักขระ มีอักขระ X

หรือ

บรรทัดเกินขีด จำกัด สูงสุด 100 อักขระ มีอักขระ X

คนเหล่านั้นเป็นคนที่ฉันเคยเห็นมากที่สุดพวกเขาอธิบายตนเองมันเป็นแนวปฏิบัติที่ดีในการเข้ารหัสบรรทัดเล็ก ๆ เพื่อรักษาโค้ดที่สะอาดและอ่านได้

ไม่พบช่องว่างหลังจากเครื่องหมายจุลภาคในการเรียกใช้ฟังก์ชัน

คุณได้เรียกใช้ฟังก์ชันที่รับพารามิเตอร์และไม่ได้เพิ่มช่องว่างหลังเครื่องหมายจุลภาค ตัวอย่าง: strrchr($bla,".")ควรเป็นstrrchr($bla, ".")

คาดว่า \ "ขณะที่ (... ) {\ n \"; พบ \ "ในขณะที่ (... ) \ n {\ n \"

คาดว่า \ "foreach (... ) {\ n \"; พบ \ "foreach (... ) \ n {\ n \"

คาดว่า \ "ถ้า (... ) {\ n \"; พบ \ "if (... ) \ n {\ n \"

คาดว่า \ "} อื่น {\ n \"; พบ \ "} \ n อื่น {\ n \"

นั่นหมายความว่าคุณได้ส่งคืนบรรทัดก่อนวงเล็บเปิดของคำสั่ง PHP เหล่านั้น

ตัวอย่างของไวยากรณ์ที่ไม่ถูกต้องด้วยคำสั่ง if / else:

if (true)
{
}
else
{
}

ควรจะเป็น

if (true) {
} else {
}

วงเล็บปิดและวงเล็บเปิดของการประกาศฟังก์ชันหลายบรรทัดต้องอยู่ในบรรทัดเดียวกัน

ส่วนใหญ่มันเกิดขึ้นในตัวสร้างที่คุณประกาศสิ่งนี้:

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

ในขณะที่มันควรจะเป็น:

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

อักขระสิ้นสุดบรรทัดไม่ถูกต้อง คาดว่า \ "\ n \" แต่พบ \ "\ r \ n \"

เกิดขึ้นส่วนใหญ่ในตอนต้นของไฟล์มันเกิดจากวิธีที่ IDE ของคุณเข้ารหัสอักขระที่ส่งคืน

ตัวแปร \ "your_variable \" ไม่อยู่ในรูปแบบหมวกอูฐที่ถูกต้อง

ทุกตัวแปรต้องใช้รูปแบบหมวกอูฐดังนั้น$your_variableควรเป็น$yourVariable

ตัวแปร \ "one2Three \" มีตัวเลข แต่สิ่งนี้เป็นสิ่งที่ทำให้หมดกำลังใจ

หลีกเลี่ยงการใช้ตัวเลขในตัวแปรของคุณ

ไม่อนุญาตให้ใช้โครงสร้างการควบคุมแบบอินไลน์

คุณไม่ควรใช้โครงสร้างการควบคุมแบบอินไลน์เช่น:

else $test = true;

คุณควรใช้:

else {
    $test = true;
}

การเปิดวงเล็บปีกกาของคลาสจะต้องอยู่ในบรรทัดหลังคำจำกัดความ

คุณส่งคืนบรรทัดเมื่อประกาศคลาส:

class Test
{

คุณควรให้วงเล็บปีกกาเปิดในบรรทัดเดียวกัน:

class Test {

ตัวแปรสมาชิกส่วนตัว \ "yourVariable \" ต้องมีเครื่องหมายขีดเส้นใต้

ตัวแปรสมาชิกที่มีการป้องกัน \ "yourVariable \" จะต้องมีเครื่องหมายขีดเส้นใต้

คุณควรเพิ่มขีดเส้นใต้นำไปยังตัวแปรที่ได้รับการป้องกันและส่วนตัว: $_yourVariable

ตรงกันข้ามกับทั้งสองถ้าคุณเพิ่มขีดล่างในตัวแปรสาธารณะของคุณคุณจะได้รับ:

ตัวแปรสมาชิกสาธารณะ \ "_ yourVariable \" ต้องไม่มีเครื่องหมายขีดเส้นใต้

ไม่เคยใช้วิธีการพารามิเตอร์ $ bla

คุณได้ส่งพารามิเตอร์ไปยังวิธีการ แต่คุณไม่เคยใช้มัน

การประกาศฟังก์ชันหลายบรรทัดไม่เยื้องอย่างถูกต้อง คาดว่าจะมี 8 ที่ว่าง แต่พบ X

คุณได้เพิ่มการเยื้องในพารามิเตอร์การประกาศฟังก์ชันของคุณมากเกินไป:

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

ควรจะเป็น:

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

ตรวจพบวิธีการที่ไร้ประโยชน์ที่เป็นไปได้

คุณกำลังเอาชนะวิธีการโดยไม่เพิ่มการแก้ไขตัวอย่าง:

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

ตรวจพบวิธีโหลด model LSD () ในลูป

คุณกำลังใช้load()วิธีการในวงซึ่งไม่แนะนำและจะต้องหลีกเลี่ยง

รหัสของคุณน่าจะมีลักษณะดังนี้:

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

หากคุณกำลังโหลดโมเดลในการวนซ้ำมันย่อมไม่ดีนักในแง่ของประสิทธิภาพ หากคุณต้องการดึงคุณสมบัติบางอย่างคุณควรใช้คอลเล็กชันแทน

ความซับซ้อนของ cyclomatic (X) เหนือกว่า 10; พิจารณาการปรับเปลี่ยนฟังก์ชัน

ถ้าคุณไม่คุ้นเคยกับความซับซ้อน cyclomatic ผมขอแนะนำให้คุณได้อ่านที่บทความนี้: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html คำเตือนนี้โดยทั่วไปหมายความว่ามีลูปและเงื่อนไขมากเกินไปในการทำงานของคุณ

การทำให้อินสแตนซ์ของวัตถุโดยตรงไม่สนับสนุนใน Magento 2

มันเกิดจากความจริงที่ว่าคุณยกตัวอย่างวัตถุโดยตรงโดยการเรียกชั้นเรียนตัวอย่างเช่น:

new \Zend_Filter_LocalizedToNormalized

คุณควรใช้การฉีดพึ่งพาหรือวิธีสุดท้ายผู้จัดการวัตถุ

ความคิดเห็นอ้างถึงภารกิจสิ่งที่ต้องทำ

หนึ่งในความคิดเห็นของคุณมีการ@TODOตั้งค่าสถานะต่อไปนี้

หลีกเลี่ยงคำสั่ง IF ที่เป็นจริงหรือเท็จเสมอ

คุณได้สร้างเงื่อนไขที่ดูเหมือนจะเป็นจริงหรือเท็จเสมอ

ตัวอย่างเช่น:

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

ข้อผิดพลาด

ไม่ได้ระบุ Namespace สำหรับคลาส \ "Class \"

คุณไม่มีuse Path\To\Class;คำชี้แจงในตอนต้นของชั้นเรียน


1
ในกรณีที่ฉันเข้าใจถูกต้องคำแนะนำเหล่านี้อ้างถึงส่วนขยาย M2 ทั้งหมด (แม้เป็นการใช้ส่วนตัว)
Siarhey Uchukhlebau

@SiarheyUchukhlebau ใช่นั่นคือรายงานทางเทคนิคที่คุณได้รับเมื่อคุณอัปโหลดส่วนขยายในตลาดวีโอไอพี
Raphael ที่ Digital Pianism

1
You should keep the opening brace on the same line:มันเป็นอย่างอื่นไม่ได้รอบ? โพสต์ที่ยอดเยี่ยมโดยทาง
Claudiu Creanga

@ClaudiuCreanga ฉันคิดว่าคุณถูกต้องให้ฉันตรวจสอบอีกครั้ง;)
Raphael ที่ Digital Pianism

เป็นไปได้ไหมที่จะส่งผ่านส่วนขยายที่มีข้อความเตือนมากกว่า 10k หรือพวกเขาปฏิเสธทุกสิ่งที่มีคำเตือน
Roland Soós

9

การใช้ Codesniffer กับชุดกฎ MEQP1 หรือ MEQP2 (ขึ้นอยู่กับเวอร์ชั่นของ Magento) จะทำให้คุณมีความคิดเกี่ยวกับชุดกฎ Magento: https://github.com/magento/marketplace-eqp/tree/master/

ชุดกฎนี้และกระบวนการส่งของ Marketplace นั้นไม่ได้อยู่ในซิงค์เสมอ (แม้ว่าแน่นอนว่าเป็นอุดมคติ) ดังนั้นคุณอาจได้รับการปฏิเสธสำหรับข้อผิดพลาดของ codeniffer แม้ว่าจะผ่านเวอร์ชันล่าสุดบน Github

ข้อผิดพลาด "ความรุนแรง -10" ที่พบบ่อยมากขึ้น (ข้อผิดพลาดเฉพาะส่วนขยายของคุณจะถูกปฏิเสธ) และคำแนะนำที่ปรากฏในรายการ ได้แก่ :

ไม่อนุญาตให้ใช้แท็กปิดที่ท้ายไฟล์ PHP

คำแนะนำ: ลบแท็กปิด PHP

ไม่อนุญาตให้ทำการโทรผ่านเวลาอ้างอิง

คำแนะนำ: อ่านเอกสารเกี่ยวกับการอ้างอิงใน PHP 5 และ refactor รหัสของคุณ การอ้างอิง: http://php.net/manual/th/language.references.pass.php

ตรวจพบการใช้งานโดยตรงของ $ _ENV Superglobal

ตรวจพบการใช้งานโดยตรงของ $ _GET Superglobal

ตรวจพบการใช้ Superglobal ของ $ _POST โดยตรง

ตรวจพบการใช้ Superglobal ของ $ _REQUEST โดยตรง

ตรวจพบการใช้งานโดยตรงของ $ _SESSION Superglobal

ตรวจพบการใช้งานโดยตรงของ $ GLOBALS Superglobal

คำแนะนำ: ใช้วัตถุห่อหุ้มที่สอดคล้องกันเพื่อรับคุกกี้เซสชันหรือข้อมูลการร้องขอ

ฟังก์ชัน set_magic_quotes_runtime () เลิกใช้แล้ว

คำแนะนำ: ไม่ควรใช้ฟังก์ชั่นที่เลิกใช้เนื่องจากอาจถูกลบออกได้ตลอดเวลาจากเวอร์ชันในอนาคต [อาจเป็นข้อผิดพลาดทั่วไปสำหรับการคัดค้านทั้งหมด]

ตัวดำเนินการที่เหมือนกัน === ไม่ได้ใช้สำหรับการทดสอบค่าส่งคืนของฟังก์ชัน strpos

ผู้ประกอบการที่เหมือนกัน === ไม่ได้ใช้สำหรับการทดสอบค่าส่งคืนของฟังก์ชั่นแถบ

คำแนะนำ: ใช้ตัวดำเนินการ === เพื่อทดสอบค่าส่งคืนของฟังก์ชันนี้

การใช้สตริงคำพูดย้อนหลังไม่ถูกต้อง เครื่องหมายคำพูดย้อนกลับควรอยู่ในสตริงเสมอ

คำแนะนำ: [ไม่มีข้อเสนอแนะแยกต่างหาก ฉันคิดว่าอันนี้คือการป้องกันไม่ให้ผู้บริหารผ่าน backquotes]

ไม่มีเมธอด _isAllowed () ACL ในคลาส [ClassName]

คำแนะนำ: จัดการการตั้งค่าการจัดการและการจัดการสิทธิ์อย่างรอบคอบ ควรกำหนดทรัพยากร ACL ในไฟล์ adminhtml.xml สำหรับแต่ละตัวควบคุม adminhtml และควรใช้เมธอด _isAllowed ()

ไม่ได้ระบุ Namespace สำหรับคลาส [ExceptionClassName]

คำแนะนำ: ระบุเนมสเปซยกเว้น

ข้อผิดพลาดทางไวยากรณ์ของ PHP: ลบการอ้างอิงการโทรตามเวลาโทรแล้ว

คำแนะนำ: แก้ไขข้อผิดพลาดทางไวยากรณ์ [อันนี้มาพร้อมกับข้างบน ฉันจินตนาการว่ามีข้อผิดพลาดทั่วไปที่คล้ายกันถูกกำหนดไว้สำหรับข้อผิดพลาดทางไวยากรณ์ PHP อื่น ๆ ทั้งหมด]

การละเมิดการออกแบบ Magento 2 ที่เป็นไปได้ ตรวจพบการก่อสร้าง Magento ทั่วไป

คำแนะนำ: [สิ่งนี้ไม่มีคำแนะนำ แต่อธิบายรหัสที่การใช้งานคลาสเช่น Mage :: blah หรือ Mage_blah_blah :: blah ถูกตรวจพบ - เหล่านี้เป็นคลาสที่มีเฉพาะใน Magento 1 และจะไม่ทำงานใน Magento 2 ความคิดที่ดีคือ ค้นหาส่วนขยาย M2 ของคุณสำหรับ regex Mage(\b|_)เพื่อตรวจสอบการใช้งาน M1 ล่วงหน้า

ทรัพยากรเป็นคำสงวนใน PHP 7

คำแนะนำ: [ไม่มีข้อเสนอแนะแยกต่างหาก เพียงแค่เปลี่ยนชื่อคำเป็นอย่างอื่นควรใช้งานได้ ฉันคิดว่าข้อผิดพลาดนี้มีอยู่สำหรับคำที่สงวนไว้ทั้งหมด]

การเปิดแท็ก PHP จะต้องเป็นเนื้อหาแรกในไฟล์

คำแนะนำ: ลบตัวละครทั้งหมดก่อน PHP เปิดแท็ก

ไม่สนับสนุนการใช้โครงสร้างภาษาตาย

การใช้โครงสร้างภาษาทางออกไม่ได้รับการสนับสนุน

คำแนะนำ: ควรใช้วิธีการตอบสนองของ setBody ()

การใช้โครงสร้างภาษาก้องไม่ได้รับการสนับสนุน

การใช้โครงสร้างภาษาการพิมพ์นั้นไม่ได้รับการสนับสนุน

คำแนะนำ: ควรเปลี่ยนสถาปัตยกรรมของส่วนขยายเพื่อหลีกเลี่ยงการใช้ echo ส่วนหัว ฯลฯ ในคลาสพิจารณาใช้เมธอด setBody () ของวัตถุตอบกลับ

การใช้ eval () ไม่ได้รับการสนับสนุน

คำแนะนำ: หลีกเลี่ยงการใช้ eval ()


ซึ่งแตกต่างจากข้อผิดพลาดเหล่านี้ซึ่งทำให้ส่วนขยายของคุณถูกปฏิเสธขณะนี้คำเตือนมีการระบุไว้ว่าเป็นมารยาทเพื่อช่วยปรับปรุงรหัสส่วนขยายของคุณ คุณจะไม่ถูกปฏิเสธจากการตรวจสอบทางเทคโนโลยีเพื่อดูคำเตือน

แน่นอนว่ากฎนี้อาจถูกทำให้รัดกุมขึ้นในอนาคตและชุดกฎของโค้ดเนเฟอร์ยังอยู่ภายใต้การทบทวนอย่างต่อเนื่องดังนั้นการเห็นว่าคำเตือนจำนวนมากที่คุณสามารถแก้ไขได้นั้นเป็นแผนที่ดีเสมอ คำเตือนยังสามารถระบุปัญหาที่เป็นระบบของ codebase ของคุณ


เหตุผลบางประการสำหรับการปฏิเสธจากการตรวจสอบทางเทคนิคไม่ปรากฏในรายงานออนไลน์ในขณะนี้และมีให้เฉพาะในอีเมล

สิ่งที่ต้องการ copy-paste ละเมิดและมัลแวร์ที่ตรวจพบจะมีเพียงข้อความที่แสดงในอีเมลที่คุณได้รับการแจ้งให้คุณทราบว่านามสกุลของคุณไม่ได้รับการยอมรับดังนั้นอ่านอีเมลอย่างระมัดระวัง

ขณะนี้การเก็บถาวรของอีเมลเหล่านี้ไม่สามารถมองเห็นได้จากพอร์ทัลผู้พัฒนาดังนั้นหากคุณลบทิ้งโดยไม่ต้องอ่านหรือส่งไปยังอีเมลขยะ

ผู้ตรวจทานระดับ 1 ของ Magento บางครั้งใส่ข้อมูลเพิ่มเติมลงในอีเมลนี้ไม่ว่าจะเป็นเพียงสิ่งที่มีประโยชน์ที่พวกเขาคิดว่าคุณอาจต้องการทราบเช่น "คีย์อาร์เรย์นี้ 'ตัด' ควรเป็น 'เซิร์ฟเวอร์' หรือเหตุผลสำหรับการปฏิเสธและข้อเสนอแนะ เกี่ยวกับวิธีการแก้ไขอย่างรวดเร็วเช่น "คุณคัดลอกไฟล์หลักทั้งวีโอไอพีและเพียงเปลี่ยน classpath: คุณสามารถแทนที่ด้วยการตั้งค่าคลาสแทน" หรือ "คุณคัดลอกไฟล์หลักวีโอไอพีทั้งคู่เพื่อเปลี่ยนคู่ของ ฟังก์ชั่นสาธารณะ: คุณสามารถใช้ปลั๊กอินสำหรับสิ่งนี้แทน "

หากคุณไม่ได้อ่านสิ่งเหล่านี้และเพียงแค่ดูรายงานรหัสนักท่องเว็บคุณอาจต้องพยายามแก้ไขปัญหาที่ไม่ถูกต้อง


โปรดทราบว่าunescaped output detectedข้อความไม่ควรหลบโดยใช้@escapeNotVerifiedหรือ@noEscapeความคิดเห็น สิ่งนี้จะไม่ได้รับอนุญาตใน Magento รุ่นอนาคต ใช้หนึ่งในสิ่งต่อไปนี้แทน:

  • สตริงคงที่ใด ๆ ในเครื่องหมายคำพูดเดี่ยว
  • สตริงแบบสแตติกในเครื่องหมายคำพูดคู่โดยไม่มีตัวแปรอินไลน์
  • [แนะนำ]ค่าหนีด้วยวิธีใดวิธีหนึ่งหลบหนีออกมาจาก \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl())
  • ค่าที่ส่งไปเป็นประเภทตัวเลข (อย่างน้อย bool และ int อาจเป็นประเภทอื่นหรือไม่)
  • เรียกวิธีการใด ๆ กับคำว่า "HTML" printBannerHtml()ในชื่อเช่น อย่าทำผิดกฎข้อนี้! ตรวจสอบให้แน่ใจว่าblahHtml()วิธีการของคุณอย่างแท้จริงหนีตัวแปรทั้งหมด

คำเตือนการแสดงผลส่วนขยายของฉัน แต่ไม่มีการข้างต้นดังนั้นเป็นไปได้ที่ส่วนขยายของฉันถูกปฏิเสธเนื่องจากคำเตือน?
Sanjay Gohil

ฉันโพสต์ในขณะนี้กลับมา - อาจมีการเพิ่มใหม่ตั้งแต่นั้นมา เมื่อคุณลงชื่อเข้าใช้บัญชีนักพัฒนาของคุณคลิกที่ส่วนขยายและดูบันทึกข้อผิดพลาดข้อความที่คุณเห็นคืออะไรและข้อผิดพลาดในระดับใด หากพวกเขาไม่ใช่ความรุนแรง 10 คุณอาจถูกปฏิเสธด้วยเหตุผลอื่น อีเมลการปฏิเสธพูดว่าอะไร
Dewi Morgan

6

ข้อผิดพลาด:

ตรวจพบผลลัพธ์ที่ไม่ใช้ Escape

ข้อผิดพลาดในไฟล์. phtml

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

คุณตะโกนใช้:

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

อ้างอิงการรักษาความปลอดภัยเทมเพลต XSS สำหรับhttp://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates


นี่เป็นรูปแบบการเขียนโปรแกรมที่ไม่ดีเป็นพิเศษ โปรดอย่าละเมิดคำสั่ง@noEscapeและ@escapeNotValidatedด้วยวิธีนี้: ถ้าคุณทำพวกเขามีแนวโน้มที่จะถูกเลิกใช้งานและไม่อนุญาตให้ใช้โดยระบบ MEQP ดูที่ด้านล่างของคำตอบของฉันเพื่อหาวิธีที่ดีกว่าในการหลีกเลี่ยงข้อมูลของคุณ
Dewi Morgan

1
@Dewi Morgan: ขอบคุณสำหรับข้อมูลที่มีค่าของคุณ
Sankar_k
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.