Làm cách nào để khắc phục các cảnh báo / lỗi được nêu trong báo cáo đánh giá kỹ thuật của Magento Marketplace?


25

Với Thị trường Magento mới, tiện ích mở rộng được gửi đi qua một số trạng thái xác thực để được phê duyệt và có sẵn thông qua Thị trường.

Một trong số đó là đánh giá kỹ thuật, từ đó bạn có thể nhận được báo cáo kỹ thuật như sau:

Báo cáo kỹ thuật thị trường

Như bạn có thể thấy, hơn 200 cảnh báo khiến tôi sợ hãi, có tài nguyên nào giúp khắc phục mọi cảnh báo ngoài danh sách có sẵn trong tài liệu: http://docs.magento.com/marketplace/user_guide/extensions/ xem lại mã-xác nhận.html ?


Tôi cảm thấy như ai đó nên đề xuất ở đây bằng PHP CodeSniffer và bất cứ tiêu chuẩn nào là Magento 2 sử dụng ... PSR-2? Chắc chắn rồi sao!?
Robbie Averill

Nó sử dụng cả PSR-1 và PSR-2.
Manish

@raphael, vui lòng xem cái này, magento.stackexchange.com/questions/192506/NH
abhishek

@raphael vui lòng xem cái này ,: magento.stackexchange.com/questions/71399/ triệt
abhishek

Câu trả lời:


31

Sau một giờ xem qua báo cáo tôi đã đưa ra danh sách sau đây, nó có thể hữu ích cho mọi người mà tôi nghĩ.

Tôi sẽ cố gắng cập nhật ngay khi tôi tìm thấy nhiều cảnh báo / lỗi hơn:

Cảnh báo

Dòng vượt quá 80 ký tự; chứa các ký tự X

Hoặc là

Dòng vượt quá giới hạn tối đa 100 ký tự; chứa các ký tự X

Những cái đó là cái tôi đã thấy nhiều nhất, chúng là tự giải thích, đó là một cách thực hành tốt để giữ các dòng mã nhỏ để giữ cho mã sạch và dễ đọc.

Không tìm thấy khoảng trắng sau dấu phẩy trong chức năng gọi

Bạn đã gọi một hàm nhận tham số và không thêm dấu cách sau dấu phẩy. Ví dụ: strrchr($bla,".")nênstrrchr($bla, ".")

Dự kiến ​​\ "while (...) {\ n \"; đã tìm thấy \ "while (...) \ n {\ n \"

Dự kiến ​​\ "foreach (...) {\ n \"; đã tìm thấy \ "foreach (...) \ n {\ n \"

Dự kiến ​​\ "if (...) {\ n \"; đã tìm thấy \ "if (...) \ n {\ n \"

Dự kiến ​​\ "} khác {\ n \"; đã tìm thấy \ "} \ n khác {\ n \"

Điều đó có nghĩa là bạn đã trả về một dòng trước dấu ngoặc mở của các câu lệnh PHP đó.

Ví dụ về một cú pháp xấu với câu lệnh if / other:

if (true)
{
}
else
{
}

Nên là

if (true) {
} else {
}

Dấu ngoặc đơn đóng và dấu ngoặc mở của khai báo hàm nhiều dòng phải nằm trên cùng một dòng

Hầu hết thời gian, nó xảy ra trong hàm tạo nơi bạn khai báo một cái gì đó như thế này:

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

Trong khi đó nó phải là:

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

Kết thúc dòng ký tự không hợp lệ; mong đợi \ "\ n \" nhưng đã tìm thấy \ "\ r \ n \"

Xảy ra hầu hết thời gian ở phần đầu của tệp, nguyên nhân là do cách IDE của bạn mã hóa ký tự trả về.

Biến \ "your_variable \" không ở định dạng mũ lạc đà hợp lệ

Mỗi biến phải sử dụng định dạng mũ lạc đà, vì vậy $your_variablenên$yourVariable

Biến \ "one2Three \" chứa số nhưng điều này không được khuyến khích

Tránh sử dụng số trong các biến của bạn

Cấu trúc điều khiển nội tuyến không được phép

Bạn không nên sử dụng các cấu trúc điều khiển nội tuyến như:

else $test = true;

Bạn nên sử dụng:

else {
    $test = true;
}

Cú đúp mở của một lớp phải nằm trên dòng sau định nghĩa

Bạn đã trả về một dòng khi khai báo một lớp:

class Test
{

Bạn nên giữ nẹp mở trên cùng một dòng:

class Test {

Biến thành viên riêng \ "yourVariable \" phải chứa dấu gạch dưới hàng đầu

Biến thành viên được bảo vệ \ "yourVariable \" phải chứa dấu gạch dưới hàng đầu

Bạn nên thêm một dấu gạch dưới hàng đầu vào các biến thành viên được bảo vệ và riêng tư của bạn: $_yourVariable

Ngược lại với hai yếu tố đó, nếu bạn thêm dấu gạch dưới vào biến công khai, bạn có thể nhận được:

Biến thành viên công cộng \ "_ yourVariable \" không được chứa dấu gạch dưới hàng đầu.

Tham số phương thức $ bla không bao giờ được sử dụng

Bạn đã truyền một tham số cho một phương thức nhưng bạn không bao giờ sử dụng nó.

Khai báo hàm đa dòng không được thụt lề chính xác; 8 không gian dự kiến ​​nhưng tìm thấy X

Bạn đã thêm quá nhiều thụt vào các tham số khai báo hàm:

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

Nên là:

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

Phương pháp vô dụng có thể ghi đè được phát hiện

Bạn đang ghi đè một phương thức mà không cần thêm sửa đổi, ví dụ:

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

Mô hình tải phương thức LSD () được phát hiện trong vòng lặp

Bạn đang sử dụng load()phương thức bên trong một vòng lặp không được khuyến nghị và phải tránh.

Rất có thể mã của bạn trông như thế này:

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

Nếu bạn đang tải một mô hình trong một vòng lặp thì thực sự khá tệ về mặt hiệu suất. Nếu bạn chỉ cần lấy một vài thuộc tính, bạn nên sử dụng các bộ sưu tập thay thế.

Độ phức tạp chu kỳ của hàm (X) vượt quá 10; xem xét tái cấu trúc hàm

Nếu bạn không quen thuộc với độ phức tạp theo chu kỳ, tôi khuyên bạn nên đọc bài viết này: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Cảnh báo này về cơ bản có nghĩa là có quá nhiều vòng lặp và điều kiện trong chức năng của bạn.

Khởi tạo đối tượng trực tiếp không được khuyến khích trong Magento 2

Điều này được gây ra bởi thực tế là bạn đang khởi tạo một đối tượng trực tiếp bằng cách gọi lớp, ví dụ:

new \Zend_Filter_LocalizedToNormalized

Bạn nên sử dụng tiêm phụ thuộc hoặc phương sách cuối cùng, người quản lý đối tượng.

Nhận xét đề cập đến một nhiệm vụ TODO

Một trong những bình luận của bạn có chứa @TODOcờ sau .

Tránh các câu lệnh IF luôn đúng hoặc sai

Bạn đã tạo một điều kiện dường như luôn luôn đúng hoặc sai.

Ví dụ:

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

Lỗi

Không gian tên cho lớp \ "Class \" không được chỉ định.

Bạn đang thiếu use Path\To\Class;tuyên bố khi bắt đầu lớp học của bạn.


1
Trong trường hợp tôi đã hiểu đúng về vấn đề này, những đề xuất này có đề cập đến tất cả các tiện ích mở rộng M2 (ngay cả đối với sử dụng cá nhân) không?
Siarhey Uchukhlebau

@SiarheyUchukhlebau vâng, đó là báo cáo kỹ thuật bạn nhận được khi bạn tải lên tiện ích mở rộng trên Thị trường Magento
Raphael tại Digital Pianism

1
You should keep the opening brace on the same line:Không phải nó là cách khác? Nhân tiện, bài viết tuyệt vời
Claudiu Creanga

@ClaudiuCreanga Tôi nghĩ bạn đúng hãy để tôi kiểm tra lại;)
Raphael tại Digital Pianism

Có thể đẩy qua một tiện ích mở rộng có thông điệp cảnh báo hơn 10k không? Hoặc họ từ chối tất cả mọi thứ có cảnh báo?
Roland Soós

9

Sử dụng Codeniffer với bộ quy tắc MEQP1 hoặc MEQP2 (tùy thuộc vào phiên bản Magento của bạn) sẽ cho bạn ý tưởng về bộ quy tắc Magento: https://github.com/magento/marketplace-eqp/tree/master/

Bộ quy tắc này và quy tắc đang chạy trong quy trình gửi của Marketplace KHÔNG phải lúc nào cũng hoàn toàn đồng bộ (mặc dù tất nhiên, đó là lý tưởng), do đó bạn có thể bị từ chối vì các lỗi codeniffer ngay cả khi nó vượt qua phiên bản mới nhất trên Github.

Một số lỗi "mức độ nghiêm trọng-10" phổ biến hơn (các lỗi duy nhất mà tiện ích mở rộng của bạn sẽ bị từ chối) và các đề xuất được liệt kê của chúng, bao gồm:

Thẻ đóng không được phép ở cuối tệp PHP

Khuyến nghị: Xóa thẻ đóng PHP.

Các cuộc gọi chuyển qua tham chiếu thời gian cuộc gọi đều bị cấm

Khuyến nghị: Đọc tài liệu về các tài liệu tham khảo trong PHP 5 và cấu trúc lại mã của bạn. Tài liệu tham khảo: http://php.net/manual/en/lingu.references.pass.php

Phát hiện trực tiếp $ _ENV Superglobal được phát hiện.

Phát hiện trực tiếp $ _GET Superglobal được phát hiện.

Phát hiện trực tiếp $ _POST Superglobal được phát hiện.

Phát hiện trực tiếp $ _REQUEST Superglobal được phát hiện.

Phát hiện trực tiếp $ _SESSION Superglobal được phát hiện.

Phát hiện trực tiếp $ GLOBALS Superglobal được phát hiện.

Khuyến nghị: Sử dụng các đối tượng trình bao bọc tương ứng để nhận dữ liệu cookie, phiên hoặc yêu cầu.

Hàm set_magic_quotes_r Yoon () không được dùng nữa

Khuyến nghị: Không nên sử dụng các chức năng không dùng nữa vì chúng có thể bị xóa bất cứ lúc nào từ phiên bản tương lai. [Có lẽ là một lỗi chung cho tất cả các khấu hao]

Toán tử giống hệt === không được sử dụng để kiểm tra giá trị trả về của hàm strpose

Toán tử giống hệt === không được sử dụng để kiểm tra giá trị trả về của hàm thoát

Khuyến nghị: Sử dụng toán tử === để kiểm tra giá trị trả về của hàm này.

Sử dụng không chính xác của chuỗi trích dẫn trở lại liên tục. Báo giá lại phải luôn luôn bên trong chuỗi.

Khuyến nghị: [không có khuyến nghị riêng biệt. Tôi tưởng tượng điều này là để ngăn chặn exec thông qua backquote.]

Thiếu phương thức ACL _is ALLowed () trong lớp [ClassName].

Khuyến nghị: Quản lý rất cẩn thận việc thiết lập, quản lý và xử lý các đặc quyền. Tài nguyên ACL phải được xác định trong tệp adminhtml.xml cho mỗi bộ điều khiển adminhtml và phương thức _is ALLowed () nên được triển khai.

Không gian tên cho lớp [ExceptionClassName] không được chỉ định.

Khuyến nghị: Chỉ định không gian tên ngoại lệ.

Lỗi cú pháp PHP: Tham chiếu qua thời gian cuộc gọi đã bị xóa

Khuyến cáo: Sửa lỗi cú pháp. [Cái này đi kèm với cái trên. Tôi tưởng tượng rằng một lỗi chung tương tự được đưa ra cho tất cả các lỗi cú pháp PHP khác]

Có thể vi phạm thiết kế Magento 2. Đã phát hiện xây dựng Magento 1 điển hình.

Khuyến nghị: [Điều này không có khuyến nghị, nhưng mô tả mã nơi sử dụng lớp như Mage :: blah hoặc Mage_blah_blah :: blah được phát hiện - đây là những lớp chỉ tồn tại trong Magento 1 và sẽ không hoạt động trong Magento 2. Một ý tưởng hay là tìm kiếm tiện ích mở rộng M2 của bạn cho regex Mage(\b|_)để kiểm tra trước các cách sử dụng M1.]

tài nguyên là một từ dành riêng trong PHP 7.

Khuyến nghị: [Không có khuyến nghị riêng biệt. Đơn giản chỉ cần đổi tên từ thành một cái gì đó khác sẽ làm việc. Tôi tưởng tượng lỗi này tồn tại cho tất cả các từ dành riêng.]

Thẻ PHP mở phải là nội dung đầu tiên trong tệp

Khuyến nghị: Xóa tất cả các ký tự trước Thẻ mở PHP.

Sử dụng cấu trúc ngôn ngữ chết là không khuyến khích.

Sử dụng cấu trúc ngôn ngữ thoát là không khuyến khích.

Khuyến nghị: nên sử dụng phương thức đối tượng phản hồi setBody ().

Sử dụng cấu trúc ngôn ngữ echo không được khuyến khích.

Sử dụng cấu trúc ngôn ngữ in không được khuyến khích.

Khuyến nghị: Nên thay đổi kiến ​​trúc của tiện ích mở rộng để tránh sử dụng tiếng vang, tiêu đề, v.v. trong các lớp, xem xét sử dụng phương thức setBody () của đối tượng phản hồi.

Sử dụng eval () không được khuyến khích

Khuyến cáo: Tránh sử dụng eval ().


Không giống như các lỗi này khiến tiện ích mở rộng của bạn bị từ chối, các cảnh báo hiện chỉ được liệt kê dưới dạng lịch sự, để giúp cải thiện mã của tiện ích mở rộng của bạn. Bạn sẽ KHÔNG bị từ chối đánh giá công nghệ để cảnh báo, tuy nhiên có rất nhiều.

Tất nhiên, quy tắc này có thể được thắt chặt trong tương lai và bộ quy tắc mã hóa đang được xem xét liên tục, vì vậy xem có bao nhiêu cảnh báo bạn có thể giải quyết luôn là một kế hoạch tốt. Các cảnh báo cũng có thể chỉ ra các vấn đề mang tính hệ thống với cơ sở mã của bạn.


Một số lý do từ chối đánh giá kỹ thuật hiện không hiển thị trên báo cáo trực tuyến và chỉ được đưa ra trong email.

Những thứ như vi phạm sao chép và phần mềm độc hại được phát hiện sẽ chỉ có các thông báo được hiển thị trong email bạn nhận được cho bạn biết rằng tiện ích mở rộng của bạn không được chấp nhận, vì vậy hãy đọc email cẩn thận .

Một kho lưu trữ các email này hiện không thể nhìn thấy từ cổng thông tin của nhà phát triển, vì vậy nếu bạn xóa chúng mà không đọc hoặc gửi chúng vào thư rác, thì chúng sẽ biến mất.

Những người đánh giá cấp 1 của Magento đôi khi đưa thông tin bổ sung vào email này, chỉ là những điều hữu ích mà họ nghĩ bạn có thể muốn biết, như "khóa mảng này 'sever' có lẽ nên là 'máy chủ', hoặc là lý do cho sự từ chối và đề xuất của họ về cách giải quyết nhanh chóng, như "Bạn đã sao chép toàn bộ tệp lõi Magento và chỉ thay đổi đường dẫn lớp: bạn có thể thay thế tệp này bằng cài đặt tùy chọn lớp thay thế." hoặc "Bạn đã sao chép toàn bộ tệp lõi Magento chỉ để thay đổi một vài chức năng công cộng: bạn có thể sử dụng plugin cho việc này thay thế. "

Nếu bạn không đọc những điều này và chỉ cần xem báo cáo về mã, bạn có thể sẽ cố gắng khắc phục các sự cố sai.


Lưu ý rằng unescaped output detectedtin nhắn KHÔNG nên được né tránh bằng cách sử dụng @escapeNotVerifiedhoặc @noEscapebình luận. Điều này có thể sẽ không được phép trong các phiên bản tương lai của Magento. Thay vào đó, sử dụng một trong những điều sau đây:

  • Bất kỳ chuỗi tĩnh trong dấu ngoặc đơn.
  • Một chuỗi tĩnh trong dấu ngoặc kép, không có biến nội tuyến.
  • [đề nghị] Một giá trị thoát với một trong những phương pháp thoát khỏi \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Một giá trị được truyền thành một kiểu số (ít nhất là bool và int, có thể là các loại khác?)
  • Bất kỳ phương thức gọi với từ "html" trong tên, như printBannerHtml(). Đừng lạm dụng cái này! Hãy chắc chắn rằng blahHtml()phương thức của bạn thực sự thoát chính xác tất cả các biến.

cảnh báo hiển thị tiện ích mở rộng của tôi nhưng không có phần nào ở trên vì vậy phần mở rộng của tôi có thể bị từ chối vì cảnh báo không?
Sanjay Gohil

Tôi đã đăng bài này một thời gian trước - có thể có những cái mới được thêm vào kể từ đó. Khi bạn đăng nhập vào tài khoản nhà phát triển của mình, nhấp vào tiện ích mở rộng và xem nhật ký lỗi, thông báo bạn đang thấy là gì và chúng ở mức độ nào? Nếu họ không nghiêm trọng 10, thì bạn có thể bị từ chối vì một số lý do khác. Email từ chối nói gì?
Dewi Morgan

6

Lỗi:

Đã phát hiện ra kết quả không mong muốn

Lỗi trong tệp .phtml

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

Bạn hét lên sử dụng:

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

Tham khảo bảo mật Mẫu XSS cho http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/temsheet/template-security.html#escape-fifts-for-temsheet


Đây là phong cách lập trình cực kỳ nghèo nàn. Xin đừng lạm dụng các lệnh @noEscape@escapeNotValidatedlệnh theo cách này: nếu bạn làm như vậy, chúng có thể bị phản đối và sau đó không được hệ thống MEQP không cho phép. Xem phần dưới câu trả lời của tôi để biết một loạt các cách tốt hơn để thoát dữ liệu của bạn.
Dewi Morgan

1
@Dewi Morgan: Cảm ơn thông tin quý giá của bạn.
Sankar_k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.