Magento Marketplace 기술 검토 보고서에서 발생하는 경고 / 오류를 수정하는 방법은 무엇입니까?


25

새로운 Magento Marketplace에서는 제출 된 확장 프로그램이 마켓 플레이스를 통해 승인 및 사용 가능하도록 여러 가지 유효성 검사 상태를 거칩니다.

그중 하나는 기술 검토이며 다음과 같은 기술 보고서를 얻을 수 있습니다.

마켓 플레이스 기술 보고서

당신이 볼 수 있듯이, 200 개 이상의 경고가 좀 날의 지옥을 무서워, 워드 프로세서의 목록에서 떨어져 사용할 수를 모든 경고를 해결 도움에 대한 자원이 : http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


누군가 PHP CodeSniffer를 사용하여 여기에서 제안해야한다고 생각 하고 Magento 2가 사용하는 표준이 무엇이든 ... PSR-2? 확실히!?
로비 애 버릴

PSR-1과 PSR-2를 모두 사용합니다.
Manish

@raphael, pls는 이것을 참조 magento.stackexchange.com/questions/192506/…
abhishek

@raphael pls는 이것을 참조 : magento.stackexchange.com/questions/71399/…
abhishek

답변:


31

한 시간 동안 보고서를 살펴본 후 다음 목록을 작성하면 생각하는 모든 사람에게 도움이 될 수 있습니다.

더 많은 경고 / 오류가 발견되는 즉시 업데이트를 유지하도록 노력하겠습니다.

경고

줄이 80자를 초과합니다. X 문자를 포함

또는

줄이 최대 한도 인 100자를 초과합니다. X 문자를 포함

그것들은 내가 가장 많이 본 것입니다. 그들은 설명이 필요합니다. 깨끗하고 읽기 쉬운 코드를 유지하기 위해 코딩 라인을 작게 유지하는 것이 좋습니다.

함수 호출에서 쉼표 뒤에 공백이 없습니다.

매개 변수를 수신하고 쉼표 뒤에 공백을 추가하지 않은 함수를 호출했습니다. 예 : strrchr($bla,".")해야strrchr($bla, ".")

\ "while (...) {\ n \"; \ "동안 (...) \ n {\ n \"

예상되는 \ "foreach (...) {\ n \"; \ "foreach (...) \ n {\ n \"을 (를) 찾았습니다.

예상 \ "if (...) {\ n \"; \ "if (...) \ n {\ n \"을 (를) 찾았습니다.

예상 \ "} else {\ 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);
}

루프에서 모델 LSD 메소드 load () 감지

load()루프 내부 에서 메소드를 사용 하고 있으며 권장하지 않으며 피해야합니다.

코드는 다음과 같습니다.

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

루프에서 모델을로드하는 경우 실제로 성능면에서 상당히 나쁩니다. 몇 가지 속성 만 검색해야하는 경우 컬렉션을 대신 사용해야합니다.

함수의 순환 복잡도 (X)는 10을 초과합니다. 함수 리팩토링 고려

순환 복잡성에 익숙하지 않은 경우 https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html을 읽어보십시오 . 이 경고는 기본적으로 함수에 루프와 조건이 너무 많다는 것을 의미합니다.

Magento 2에서 직접 객체 인스턴스화는 권장되지 않습니다

클래스를 호출하여 객체를 직접 인스턴스화하고 있기 때문입니다. 예를 들면 다음과 같습니다.

new \Zend_Filter_LocalizedToNormalized

의존성 주입이나 최후의 수단 인 객체 관리자를 사용해야합니다.

주석은 TODO 작업을 나타냅니다

귀하의 의견 중 하나에 다음 @TODO플래그 가 포함되어 있습니다 .

항상 참 또는 거짓 IF 문을 피하십시오

항상 참 또는 거짓으로 보이는 조건을 작성했습니다.

예를 들면 다음과 같습니다.

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

오류

\ "Class \"클래스의 네임 스페이스가 지정되지 않았습니다.

use Path\To\Class;수업 시작시 문장 이 누락되었습니다 .


1
내가 이것을 올바르게 이해했다면, 이러한 권장 사항은 모든 개인용 M2 확장을 참조합니까?
Siarhey Uchukhlebau

@SiarheyUchukhlebau 예 그것은 당신이 한 번 얻는 기술 보고서는 마 젠토 시장에 확장 업로드입니다
디지털 Pianism에서 라파엘을

1
You should keep the opening brace on the same line:다른 방법이 아닙니까?
그건

@ClaudiuCreanga 나는 당신이 옳은지 다시 한번 확인 하자고 생각합니다.)
디지털 피아니즘의 Raphael

경고 메시지가 10k를 초과하는 확장 프로그램을 통과 할 수 있습니까? 아니면 경고가있는 모든 것을 거부합니까?
Roland Soós

9

Magento 버전에 따라 MEQP1 또는 MEQP2 규칙 세트와 함께 Codeniffer를 사용하면 Magento 규칙 세트에 대한 아이디어를 얻을 수 있습니다. https://github.com/magento/marketplace-eqp/tree/master/

이 규칙 세트와 Marketplace의 제출 프로세스에서 실행되는 규칙 세트는 항상 완벽하게 동기화되지는 않습니다 (물론 이상적임). 따라서 Github의 최신 버전을 통과하더라도 코드 스니퍼 오류가 거부 될 수 있습니다.

보다 일반적인 "심각도 -10"오류 (확장 프로그램이 거부되는 유일한 오류) 및 나열된 권장 사항은 다음과 같습니다.

PHP 파일의 끝에는 닫는 태그가 허용되지 않습니다

권장 사항 : PHP 닫기 태그를 제거하십시오.

통화 시간 기준 통화는 금지되어 있습니다.

권장 사항 : PHP 5의 참조 문서를 읽고 코드를 리 팩터하십시오. 참조 : http://php.net/manual/en/language.references.pass.php

$ _ENV Superglobal의 직접적인 사용이 감지되었습니다.

$ _GET Superglobal의 직접적인 사용이 감지되었습니다.

$ _POST Superglobal의 직접적인 사용이 감지되었습니다.

$ _REQUEST Superglobal의 직접적인 사용이 감지되었습니다.

$ _SESSION Superglobal의 직접적인 사용이 감지되었습니다.

$ GLOBALS Superglobal의 직접적인 사용이 감지되었습니다.

권장 사항 : 쿠키, 세션 또는 요청 데이터를 얻으려면 해당 랩퍼 오브젝트를 사용하십시오.

set_magic_quotes_runtime () 함수는 더 이상 사용되지 않습니다

권장 사항 : 더 이상 사용되지 않는 기능은 향후 버전에서 언제든지 제거 될 수 있으므로 사용해서는 안됩니다. [모든 지원 중단에 대한 일반 오류 일 수 있음]

strpos 함수의 리턴 값을 테스트하는 데 동일한 연산자 ===가 사용되지 않습니다.

동일한 연산자 ===는 stripos 함수의 반환 값을 테스트하는 데 사용되지 않습니다

권장 사항 :이 함수의 리턴 값을 테스트하려면 === 연산자를 사용하십시오.

역 따옴표 문자열 상수를 잘못 사용했습니다. 큰 따옴표는 항상 문자열 안에 있어야합니다.

추천 : [별도의 추천은 없습니다. 나는 이것이 따옴표를 통한 exec를 막는 것이라고 생각한다.]

[ClassName] 클래스에서 _isAllowed () ACL 메소드가 누락되었습니다.

권장 사항 : 권한 설정, 관리 및 처리를 매우 신중하게 관리하십시오. ACL 자원은 각 adminhtml 컨트롤러에 대해 adminhtml.xml 파일에 정의되어야하며 _isAllowed () 메소드가 구현되어야합니다.

[ExceptionClassName] 클래스의 네임 스페이스가 지정되지 않았습니다.

권장 사항 : 예외 네임 스페이스를 지정하십시오.

PHP 구문 오류 : 호출시 패스 바이 패스가 제거되었습니다.

권장 사항 : 구문 오류를 수정하십시오. [이것은 위와 함께 제공됩니다. 다른 모든 PHP 구문 오류에도 비슷한 일반 오류가 발생한다고 생각합니다.]

가능한 마 젠토 2 디자인 위반. 전형적인 마 젠토 1 구성을 감지했습니다.

권장 사항 : [권장 사항은 없지만 Mage :: blah 또는 Mage_blah_blah :: blah와 같은 클래스 사용이 감지되는 코드를 설명합니다.이 클래스는 Magento 1에만 존재하며 Magento 2에서는 작동하지 않는 클래스입니다. Mage(\b|_)M1 사용법을 사전 확인하기 위해 정규식 에 대한 M2 확장을 검색하십시오 .]

resource는 PHP 7에서 예약어입니다.

추천 : [별도의 추천은 없습니다. 단어를 다른 것으로 바꾸는 것만으로도 효과가 있습니다. 이 오류는 모든 예약어에 존재한다고 생각합니다.]

여는 PHP 태그는 파일의 첫 번째 내용이어야합니다

권장 사항 : PHP Opening Tag 전에 모든 문자를 제거하십시오.

다이 언어 구성을 사용하지 않는 것이 좋습니다.

종료 언어 구문을 사용하지 않는 것이 좋습니다.

권장 사항 : setBody () 응답 오브젝트 메소드를 사용해야합니다.

에코 언어 구성을 사용하지 않는 것이 좋습니다.

인쇄 언어 구성을 사용하지 않는 것이 좋습니다.

권장 사항 : 클래스에서 에코, 헤더 등을 사용하지 않으려면 확장 아키텍처를 변경해야합니다. 응답 객체의 setBody () 메소드 사용을 고려하십시오.

eval () 사용을 권장하지 않습니다

권장 사항 : eval ()을 사용하지 마십시오.


확장 프로그램이 거부되는 이러한 오류와 달리, 경고는 확장 프로그램의 코드를 개선하는 데 도움이되도록 단지 예의로만 표시됩니다. 기술 검토에서 경고를 거부하지는 않지만 많은 경고가 있습니다.

물론이 규칙은 향후에 강화 될 수 있으며 코드 스니퍼 규칙 세트는 지속적으로 검토 중이므로 해결할 수있는 경고 수를 확인하는 것이 항상 좋은 계획입니다. 경고는 코드베이스의 시스템 문제를 나타낼 수도 있습니다.


기술 검토 거부에 대한 몇 가지 이유는 현재 온라인 보고서에 표시되지 않으며 이메일로만 제공됩니다.

복사-붙여 넣기 위반 및 탐지 된 맬웨어와 같은 항목에는 확장 프로그램이 수락되지 않았 음을 알리는 메시지 만 전자 메일에 표시되므로 전자 메일을주의 깊게 읽으십시오 .

이러한 이메일의 아카이브는 현재 개발자 포털에서 볼 수 없으므로 읽지 않고 삭제하거나 정크 파일을 정리하면 사라집니다.

Magento의 레벨 1 검토 자들은 때때로이 이메일에 추가 정보를 넣었습니다. "이 어레이 키 '서버'는 아마도 '서버'여야합니다. '와 같이 알고 싶어 할만한 유용한 정보 또는 거부 및 제안에 대한 근거 "전체 Magento 코어 파일을 복사하고 클래스 경로를 변경했습니다. 대신 클래스 환경 설정으로 바꿀 수 있습니다."또는 "Magento 코어 파일 전체를 복사하여 공용 함수 : 대신 플러그인을 사용할 수 있습니다. "

이 내용을 읽지 않고 코드 스니퍼 보고서 만 보면 잘못된 문제를 해결하려고 시도 할 수 있습니다.


점을 유의 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

오류:

이스케이프되지 않은 출력 감지

.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;">

http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates에 대한 템플릿 XSS 보안을 참조하십시오.


이것은 매우 열악한 프로그래밍 스타일입니다. 이런 식으로 @noEscape@escapeNotValidated명령을 남용하지 마십시오 . 사용하는 경우 MEQP 시스템에서 더 이상 사용되지 않을 수 있습니다. 데이터를 피할 수있는 더 나은 방법에 대한 내 답변의 맨 아래를 참조하십시오.
Dewi Morgan

1
@Dewi Morgan : 소중한 정보 감사합니다.
Sankar_k
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.