Como corrigir avisos / erros gerados pelo relatório de revisão técnica do Magento Marketplace?


25

Com o novo Magento Marketplace, uma extensão enviada passa por vários estados de validação para ser aprovada e disponível através do Marketplace.

Uma delas é a revisão técnica, da qual você pode obter um relatório técnico como o seguinte:

Relatório Técnico do Marketplace

Como você pode ver, mais de 200 avisos meio que me assustaram, existe algum recurso para ajudar a corrigir todos os avisos além da lista disponível nos documentos: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?


Eu sinto que alguém deveria sugerir aqui usando PHP CodeSniffer e qualquer que seja o padrão que o Magento 2 usa ... PSR-2? Certamente!?
Robbie Averill

Ele usa o PSR-1 e o PSR-2.
Manish


Respostas:


31

Depois de uma hora analisando o relatório, elaborei a lista a seguir, poderia ser útil para todos que eu acho.

Vou tentar mantê-lo atualizado assim que encontrar mais avisos / erros:

Advertências

A linha excede 80 caracteres; contém X caracteres

Ou

A linha excede o limite máximo de 100 caracteres; contém X caracteres

Esses são os que eu mais vi, são auto-explicativos, é uma boa prática manter as linhas de codificação pequenas para manter um código limpo e legível.

Nenhum espaço encontrado após vírgula na chamada de função

Você chamou uma função que recebe parâmetros e não adicionou um espaço após a vírgula. Exemplo: strrchr($bla,".")deve serstrrchr($bla, ".")

Esperado \ "while (...) {\ n \"; encontrado \ "enquanto (...) \ n {\ n \"

\ "Foreach esperado (...) {\ n \"; encontrado \ "foreach (...) \ n {\ n \"

Esperado \ "if (...) {\ n \"; encontrado \ "se (...) \ n {\ n \"

Esperado \ "} else {\ n \"; encontrado \ "} \ n mais {\ n \"

Isso significa que você retornou uma linha antes do colchete de abertura dessas instruções PHP.

Exemplo de uma sintaxe incorreta com uma instrução if / else:

if (true)
{
}
else
{
}

Deveria estar

if (true) {
} else {
}

O parêntese de fechamento e a chave de abertura de uma declaração de função de várias linhas devem estar na mesma linha

Na maioria das vezes, isso acontece no construtor em que você declara algo como isto:

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

Considerando que deve ser:

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

O caractere de fim de linha é inválido; esperado \ "\ n \" mas encontrado \ "\ r \ n \"

Acontece na maioria das vezes no início do arquivo, é causado pela maneira como o IDE codifica o caractere de retorno.

A variável \ "sua_variável \" não está no formato válido de camel caps

Toda variável deve usar o formato camel caps, portanto, $your_variabledeve ser$yourVariable

A variável \ "one2Three \" contém números, mas isso é desencorajado

Evite usar números em suas variáveis

Estruturas de controle em linha não são permitidas

Você não deve usar estruturas de controle em linha, como:

else $test = true;

Você deveria usar:

else {
    $test = true;
}

A chave de abertura de uma classe deve estar na linha após a definição

Você retornou uma linha ao declarar uma classe:

class Test
{

Você deve manter a chave de abertura na mesma linha:

class Test {

A variável de membro privado \ "yourVariable \" deve conter um sublinhado à esquerda

A variável de membro protegida \ "yourVariable \" deve conter um sublinhado à esquerda

Você deve adicionar um sublinhado à esquerda em suas variáveis ​​de membro protegidas e privadas: $_yourVariable

Ao contrário desses dois, se você adicionar um sublinhado em sua variável pública, poderá obter:

A variável pública do membro \ "_ yourVariable \" não deve conter um sublinhado à esquerda.

O parâmetro do método $ bla nunca é usado

Você passou um parâmetro para um método, mas nunca o usa.

Declaração de função de várias linhas não recuada corretamente; esperado 8 espaços, mas encontrou X

Você adicionou muita indentação aos seus parâmetros de declaração de função:

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

Deveria estar:

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

Possível substituição de método inútil detectada

Você está substituindo um método sem adicionar modificações, por exemplo:

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

Método LSD modelo load () detectado em loop

Você está usando o load() método dentro de um loop que não é recomendado e deve ser evitado.

Provavelmente, seu código se parece com isso:

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

Se você está carregando um modelo em loop, é realmente muito ruim em termos de desempenho. Se você precisar recuperar apenas alguns atributos, use coleções.

A complexidade ciclomática da função (X) excede 10; considere refatorar a função

Se você não conhece a complexidade ciclomática, sugiro que você leia este post: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Esse aviso basicamente significa que há muitos loops e condições em sua função.

A instanciação direta de objetos é desencorajada no Magento 2

Isso é causado pelo fato de você estar instanciando um objeto diretamente chamando a classe, por exemplo:

new \Zend_Filter_LocalizedToNormalized

Você deve usar injeção de dependência ou, por último, o gerenciador de objetos.

Comentários referem-se a uma tarefa TODO

Um dos seus comentários contém o seguinte @TODOsinalizador.

Evite declarações IF sempre verdadeiras ou falsas

Você criou uma condição que parece sempre ser verdadeira ou falsa.

Por exemplo:

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

Erros

O espaço para nome da classe \ "Class \" não está especificado.

Está faltando a use Path\To\Class;afirmação no início da sua aula.


11
Caso eu tenha entendido isso corretamente, essas recomendações se referem a todas as extensões M2 (mesmo para uso pessoal)?
Siarhey Uchukhlebau

@SiarheyUchukhlebau sim que é o relatório técnico que você começa uma vez que você fazer upload de uma extensão no Magento mercado
Raphael em Digital pianismo

11
You should keep the opening brace on the same line:não é o contrário? Ótimo post a propósito
Claudiu Creanga

@ClaudiuCreanga Eu acho que você deixe-me direito verifique;)
Raphael em Digital pianismo

É possível enviar uma extensão com mais de 10k de mensagem de aviso? Ou eles rejeitam tudo o que tem avisos?
Roland Soós 18/04/19

9

O uso do Codesniffer com o conjunto de regras MEQP1 ou MEQP2 (dependendo da sua versão do Magento) fornecerá uma idéia sobre o conjunto de regras Magento: https://github.com/magento/marketplace-eqp/tree/master/

Esse conjunto de regras e o que está sendo executado no processo de envio do Marketplace nem sempre estão perfeitamente sincronizados (embora, é claro, esse seja o ideal); portanto, você pode ser rejeitado por erros de códigos diferentes, mesmo que passe a versão mais recente no Github.

Alguns dos erros "severidade-10" mais comuns (os únicos erros pelos quais sua extensão será rejeitada) e as recomendações listadas incluem:

Uma tag de fechamento não é permitida no final de um arquivo PHP

Recomendação: Remova a tag de fechamento do PHP.

As chamadas de passagem por referência de tempo de chamada são proibidas

Recomendação: Leia a documentação sobre referências no PHP 5 e refatorar seu código. Referências: http://php.net/manual/en/language.references.pass.php

Foi detectado o uso direto de $ _ENV Superglobal.

Foi detectado o uso direto de $ _GET Superglobal.

Detecção direta do $ _POST Superglobal.

Detecção direta de $ _REQUEST Superglobal.

Uso direto de $ _SESSION Superglobal detectado.

Foi detectado o uso direto do $ GLOBALS Superglobal.

Recomendação: Use objetos de wrapper correspondentes para obter dados de cookie, sessão ou solicitação.

A função set_magic_quotes_runtime () foi preterida

Recomendação: As funções obsoletas não devem ser usadas, pois podem ser removidas a qualquer momento de uma versão futura. [Provavelmente um erro genérico para todas as reprovações]

Operador idêntico === não é usado para testar o valor de retorno da função strpos

Operador idêntico === não é usado para testar o valor de retorno da função stripos

Recomendação: Use o operador === para testar o valor de retorno desta função.

Uso incorreto da constante de sequência de aspas posteriores. As aspas devem estar sempre dentro das strings.

Recomendação: [nenhuma recomendação separada. Eu imagino que este é para impedir o executivo através de aspas.]

Falta o método ACL _isAllowed () na classe [ClassName].

Recomendação: gerencie com muito cuidado a configuração, o gerenciamento e a manipulação de privilégios. O recurso ACL deve ser definido no arquivo adminhtml.xml para cada controlador adminhtml e o método _isAllowed () deve ser implementado.

O espaço para nome da classe [ExceptionClassName] não está especificado.

Recomendação: Especifique o namespace Exception.

Erro de sintaxe do PHP: a passagem por referência do tempo de chamada foi removida

Recomendação: Corrija o erro de sintaxe. [Este acompanha o acima. Eu imagino que um erro genérico semelhante seja dado para todos os outros erros de sintaxe do PHP]

Possível violação de design do Magento 2. Detectada construção típica do Magento 1.

Recomendação: [Isso não vem com recomendação, mas descreve o código em que o uso de classe como Mage :: blah ou Mage_blah_blah :: blah é detectado - são classes que existem apenas no Magento 1 e não funcionam no Magento 2. Uma boa idéia é procure na extensão M2 o regex Mage(\b|_)para pré-verificar os usos do M1.]

resource é uma palavra reservada no PHP 7.

Recomendação: [Nenhuma recomendação separada. Simplesmente renomear a palavra para outra coisa deve funcionar. Eu imagino que esse erro exista para todas as palavras reservadas.]

A tag PHP de abertura deve ser o primeiro conteúdo do arquivo

Recomendação: Remova todos os caracteres antes da tag de abertura do PHP.

O uso da construção da linguagem da matriz é desencorajado.

O uso da construção do idioma de saída é desencorajado.

Recomendação: o método do objeto de resposta setBody () deve ser usado.

O uso da construção da linguagem de eco é desencorajado.

O uso da construção da linguagem de impressão é desencorajado.

Recomendação: A arquitetura da extensão deve ser alterada para evitar o uso de eco, cabeçalho etc. nas classes, considere usar o método setBody () do objeto de resposta.

O uso de eval () é desencorajado

Recomendação: Evite usar eval ().


Diferentemente desses erros, que fazem com que sua extensão seja rejeitada, atualmente os avisos são listados apenas como cortesia, para ajudar a melhorar o código da extensão. Você NÃO será rejeitado da revisão técnica por avisos, por mais que existam.

Obviamente, essa regra pode ser mais rígida no futuro, e o conjunto de regras diferente de código está sendo revisado constantemente; portanto, ver quantos avisos você pode resolver é sempre um bom plano. Os avisos também podem indicar problemas sistêmicos na sua base de código.


No momento, alguns motivos de rejeição da revisão técnica não aparecem no relatório on-line e são fornecidos apenas no e-mail.

Coisas como violações de copiar e colar e malware detectado terão apenas mensagens mostradas no e-mail recebido, informando que sua extensão não foi aceita, portanto, leia o e-mail com atenção .

No momento, um arquivo desses e-mails não está visível no portal do desenvolvedor; portanto, se você os excluir sem ler ou os arquivar como lixo eletrônico, eles desaparecerão.

Os revisores de nível 1 do Magento às vezes colocam informações extras neste e-mail, ou apenas coisas úteis que eles achavam que você poderia querer saber, como "essa chave de matriz 'sever' provavelmente deve ser 'servidor'" ou as razões para sua rejeição e sugestões sobre como resolvê-lo rapidamente, como "Você copiou um arquivo principal do Magento e acabou de alterar o caminho da classe: em vez disso, você pode substituí-lo por uma configuração de preferência de classe." ou "Você copiou um arquivo principal do Magento apenas para alterar algumas funções públicas: você pode usar plugins para isso. "

Se você não os ler, e apenas olhar o relatório de códigos diferentes, poderá acabar tentando corrigir os problemas errados.


Note que a unescaped output detectedmensagem não deve ser evitado usando o @escapeNotVerifiedou @noEscapecomentários. Isso provavelmente não será permitido em versões futuras do Magento. Em vez disso, use um dos seguintes:

  • Qualquer sequência estática entre aspas simples.
  • Uma sequência estática entre aspas duplas, sem variáveis ​​embutidas.
  • [recomendado] Um valor escapou com um dos métodos de escape a partir de \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Um valor convertido para um tipo numérico (pelo menos bool e int, talvez outros?)
  • Qualquer chamada de método com a palavra "html" no nome, como printBannerHtml(). Não abuse deste! Certifique-se de que seu blahHtml()método realmente escape corretamente de todas as variáveis.

meu aviso de extensão de extensão, mas nenhuma das opções acima, é possível que minha extensão seja rejeitada por causa de um aviso?
Sanjay Gohil

Eu publiquei isso há um tempo atrás - pode haver novos adicionados desde então. Ao fazer login na sua conta de desenvolvedor, clique na extensão e visualize o log de erros, qual é a mensagem que você está vendo e em que nível eles estão? Se não tiverem a gravidade 10, você poderá ser rejeitado por outro motivo. O que o email de rejeição diz?
Dewi Morgan

6

Erro:

Saída sem escape detectada

Erro no arquivo .phtml

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

Você grita:

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

Consulte a segurança de Modelos XSS em http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates


Esse é um estilo de programação extraordinariamente ruim. Por favor, não abuse dos comandos @noEscapee @escapeNotValidateddesta maneira: se o fizer, é provável que sejam preteridos e depois proibidos pelo sistema MEQP. Veja o final da minha resposta para uma grande variedade de maneiras melhores de escapar dos seus dados.
Dewi Morgan

11
@Dewi Morgan: Obrigado por suas informações valiosas.
Sankar_k
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.