¿Cómo corregir las advertencias / errores generados por el informe de revisión técnica de Magento Marketplace?

25

Con el nuevo Magento Marketplace, una extensión enviada pasa por varios estados de validación para ser aprobada y disponible a través del Marketplace.

Una de ellas es la revisión técnica, desde la cual puede obtener un informe técnico como el siguiente:

Informe técnico del mercado

Como puede ver, más de 200 advertencias me asustaron un poco, ¿hay algún recurso para ayudar a solucionar cada advertencia aparte de la lista disponible en los documentos: http://docs.magento.com/marketplace/user_guide/extensions/ review-code-validation.html ?

Raphael en Digital Pianism
fuente
Siento que alguien debería sugerir aquí usar PHP CodeSniffer y cualquiera que sea el estándar que utiliza Magento 2 ... ¿PSR-2? ¿¡Seguramente!?
Robbie Averill
Utiliza tanto PSR-1 como PSR-2.
Manish
@raphael, por favor vea esto, magento.stackexchange.com/questions/192506/…
abhishek
@raphael por favor vea esto: magento.stackexchange.com/questions/71399/…
abhishek

Respuestas:

31

Después de una hora de leer el informe, se me ocurrió la siguiente lista, podría ser útil para todos los que pienso.

Intentaré mantenerlo actualizado tan pronto como encuentre más advertencias / errores:

Advertencias

La línea excede los 80 caracteres; contiene X caracteres

O

La línea excede el límite máximo de 100 caracteres; contiene X caracteres

Esos son los que más he visto, se explican por sí mismos, es una buena práctica mantener pequeñas las líneas de codificación para mantener un código limpio y legible.

No se encontró espacio después de la coma en la llamada a la función

Ha llamado a una función que recibe parámetros y no ha agregado un espacio después de la coma. Ejemplo: strrchr($bla,".")debería serstrrchr($bla, ".")

Se esperaba \ "while (...) {\ n \"; encontrado \ "while (...) \ n {\ n \"

Esperado \ "foreach (...) {\ n \"; encontrado \ "foreach (...) \ n {\ n \"

Se esperaba \ "if (...) {\ n \"; encontrado \ "if (...) \ n {\ n \"

Se esperaba \ "} más {\ n \"; encontrado \ "} \ n más {\ n \"

Eso significa que ha devuelto una línea antes del paréntesis de apertura de esas declaraciones PHP.

Ejemplo de una sintaxis incorrecta con una instrucción if / else:

if (true)
{
}
else
{
}

Debiera ser

if (true) {
} else {
}

El paréntesis de cierre y la llave de apertura de una declaración de función de varias líneas deben estar en la misma línea

La mayoría de las veces, sucede en el constructor donde declaras algo como esto:

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

Mientras que debería ser:

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

El carácter de final de línea no es válido; esperado \ "\ n \" pero encontrado \ "\ r \ n \"

Ocurre la mayor parte del tiempo al comienzo del archivo, es causado por la forma en que su IDE codifica el carácter de retorno.

La variable \ "su_variable \" no está en un formato de camello válido

Cada variable debe usar el formato de camel caps, por lo que $your_variabledebe ser$yourVariable

La variable \ "one2Three \" contiene números pero no se recomienda

Evita usar números en tus variables

No se permiten estructuras de control en línea.

No debe usar estructuras de control en línea como:

else $test = true;

Deberías usar:

else {
    $test = true;
}

La llave de apertura de una clase debe estar en la línea después de la definición

Has devuelto una línea al declarar una clase:

class Test
{

Debe mantener la llave de apertura en la misma línea:

class Test {

La variable de miembro privado \ "yourVariable \" debe contener un guión bajo

La variable miembro protegida \ "yourVariable \" debe contener un guión bajo

Debe agregar un guión bajo a sus variables de miembros protegidos y privados: $_yourVariable

Como opuesto a esos dos, si agrega un guión bajo en su variable pública, puede obtener:

La variable miembro público \ "_ yourVariable \" no debe contener un guión bajo inicial.

El parámetro de método $ bla nunca se usa

Has pasado un parámetro a un método pero nunca lo usas.

La declaración de función multilínea no está sangrada correctamente; esperaba 8 espacios pero encontró X

Ha agregado demasiada sangría a sus parámetros de declaración de función:

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

Debiera ser:

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

Posible anulación de método inútil detectada

Está anulando un método sin agregar modificaciones, por ejemplo:

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

Modelo LSD método load () detectado en bucle

Está utilizando el load()método dentro de un bucle que no se recomienda y debe evitarse.

Lo más probable es que su código se vea así:

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

Si está cargando un modelo en un bucle, es bastante malo en términos de rendimiento. Si solo necesita recuperar algunos atributos, debe usar colecciones en su lugar.

La complejidad ciclomática de la función (X) excede 10; considere refactorizar la función

Si no está familiarizado con la complejidad ciclomática, le sugiero que lea esta publicación: https://pdepend.org/documentation/software-metrics/cyclomatic-complexity.html . Esta advertencia básicamente significa que hay demasiados bucles y condiciones en su función.

La instanciación directa de objetos es desalentadora en Magento 2

Se debe al hecho de que está creando una instancia de un objeto directamente llamando a la clase, por ejemplo:

new \Zend_Filter_LocalizedToNormalized

Debe usar la inyección de dependencia o un último recurso, el administrador de objetos.

Los comentarios se refieren a una tarea TODO

Uno de sus comentarios contiene la siguiente @TODObandera.

Evite las declaraciones IF que siempre son verdaderas o falsas

Ha creado una condición que parece ser siempre verdadera o falsa.

Por ejemplo:

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

Errores

El espacio de nombres para la clase \ "Clase \" no está especificado.

Te estás perdiendo la use Path\To\Class;declaración al comienzo de tu clase.

Raphael en Digital Pianism
fuente
1
En caso de que haya entendido esto correctamente, ¿estas recomendaciones se refieren a todas las extensiones M2 (incluso para uso personal)?
Siarhey Uchukhlebau
@SiarheyUchukhlebau sí, ese es el informe técnico que obtienes una vez que cargas una extensión en Magento Marketplace
Raphael en Digital Pianism
1
You should keep the opening brace on the same line:¿No es al revés? Gran post por cierto
Claudiu Creanga
@ClaudiuCreanga Creo que tienes razón, déjame verificar dos veces;)
Raphael en Digital Pianism
¿Es posible pasar a través de una extensión que tiene más de 10k mensaje de advertencia? ¿O rechazan todo lo que tiene advertencias?
Roland Soós
9

El uso de Codesniffer con el conjunto de reglas MEQP1 o MEQP2 (dependiendo de su versión de Magento) le dará una idea sobre el conjunto de reglas de Magento: https://github.com/magento/marketplace-eqp/tree/master/

Este conjunto de reglas y el que se ejecuta en el proceso de envío de Marketplace NO siempre están perfectamente sincronizados (aunque, por supuesto, ese es el ideal), por lo que puede ser rechazado por errores de codefiffer incluso si pasa la última versión en Github.

Algunos de los errores más comunes de "gravedad 10" (los únicos errores por los que se rechazará su extensión) y sus recomendaciones enumeradas incluyen:

No se permite una etiqueta de cierre al final de un archivo PHP

Recomendación: eliminar la etiqueta de cierre de PHP.

Se prohíben las llamadas de referencia por tiempo de llamada

Recomendación: Lea la documentación sobre referencias en PHP 5 y refactorice su código. Referencias: http://php.net/manual/en/language.references.pass.php

Se detectó el uso directo de $ _ENV Superglobal.

Se detectó el uso directo de $ _GET Superglobal.

Se detectó el uso directo de $ _POST Superglobal.

Se detectó el uso directo de $ _REQUEST Superglobal.

Se detectó el uso directo de $ _SESSION Superglobal.

Se detectó el uso directo de $ GLOBALS Superglobal.

Recomendación: utilice los objetos de contenedor correspondientes para obtener datos de cookies, sesiones o solicitudes.

La función set_magic_quotes_runtime () ha quedado en desuso

Recomendación: Las funciones obsoletas no deben usarse, ya que pueden eliminarse en cualquier momento de una versión futura. [Probablemente un error genérico para todas las desvalorizaciones]

El operador idéntico === no se utiliza para probar el valor de retorno de la función strpos

El operador idéntico === no se usa para probar el valor de retorno de la función stripos

Recomendación: utilice el operador === para probar el valor de retorno de esta función.

Uso incorrecto de la cadena de comillas invertidas constante. Las comillas traseras deben estar siempre dentro de las cadenas.

Recomendación: [no hay una recomendación por separado. Me imagino que esto es para evitar que el ejecutivo ejecute las comillas.]

Falta el método ACL _isAllowed () en la clase [ClassName].

Recomendación: administre con cuidado la configuración, administración y manejo de privilegios. El recurso ACL se debe definir en el archivo adminhtml.xml para cada controlador adminhtml y se debe implementar el método _isAllowed ().

El espacio de nombres para la clase [ExceptionClassName] no está especificado.

Recomendación: especifique el espacio de nombres de excepción.

Error de sintaxis de PHP: se ha eliminado la referencia de tiempo de llamada

Recomendación: Corregir error de sintaxis. [Este acompaña a lo anterior. Me imagino que se da un error genérico similar para todos los demás errores de sintaxis de PHP]

Posible violación del diseño de Magento 2. Se detectó la construcción típica de Magento 1.

Recomendación: [Esto no viene con ninguna recomendación, pero describe el código donde se detecta el uso de clases como Mage :: blah o Mage_blah_blah :: blah: estas son clases que solo existen en Magento 1 y no funcionarán en Magento 2. Una buena idea es busque en su extensión M2 la expresión regular Mage(\b|_)para verificar previamente los usos de M1.]

recurso es una palabra reservada en PHP 7.

Recomendación: [No hay una recomendación por separado. Simplemente cambiar el nombre de la palabra a otra cosa debería funcionar. Me imagino que este error existe para todas las palabras reservadas.]

La etiqueta PHP de apertura debe ser el primer contenido del archivo

Recomendación: elimine todos los caracteres antes de la etiqueta de apertura de PHP.

Se desaconseja el uso de la construcción del lenguaje.

Se desaconseja el uso del lenguaje de salida.

Recomendación: se debe utilizar el método de objeto de respuesta setBody ().

Se desaconseja el uso de la construcción del lenguaje de eco.

Se desaconseja el uso del lenguaje impreso.

Recomendación: La arquitectura de la extensión debe cambiarse para evitar el uso de echo, encabezado, etc. en las clases, considere usar el método setBody () del objeto de respuesta.

Se desaconseja el uso de eval ()

Recomendación: Evite usar eval ().


A diferencia de estos errores, que hacen que su extensión sea rechazada, las advertencias se enumeran actualmente simplemente como cortesía, para ayudar a mejorar el código de su extensión. NO será rechazado de la revisión técnica por advertencias, por muchas que haya.

Por supuesto, esta regla puede reforzarse en el futuro, y el conjunto de reglas codefiffer está en constante revisión, por lo que ver cuántas advertencias puede resolver siempre es un buen plan. Las advertencias también pueden indicar problemas sistémicos con su base de código.


Algunas razones para el rechazo de la revisión técnica no aparecen actualmente en el informe en línea, y solo se dan en el correo electrónico.

Cosas como las violaciones de copiar y pegar y el malware detectado solo mostrarán mensajes en el correo electrónico que reciba para informarle que su extensión no fue aceptada, así que lea el correo electrónico cuidadosamente .

Actualmente no se puede ver un archivo de estos correos electrónicos desde el portal del desarrollador, por lo que si los elimina sin leerlos o los archiva en basura, desaparecerán.

Los revisores de nivel 1 de Magento a veces ponen información adicional en este correo electrónico, ya sea solo cosas útiles que pensaron que querría saber, como "esta clave de matriz 'servidor' probablemente debería ser 'servidor'", o los fundamentos de su rechazo y sugerencias sobre cómo resolverlo rápidamente, como "Copiaste un archivo central completo de Magento y simplemente cambiaste el classpath: puedes reemplazarlo con una configuración de preferencia de clase en su lugar" o "Copiaste un archivo central completo de Magento solo para cambiar un par de funciones públicas: en su lugar, puede usar complementos para esto ".

Si no lee estos, y solo mira el informe de codeniffer, puede terminar tratando de solucionar los problemas incorrectos.


Tenga en cuenta que el unescaped output detectedmensaje NO debe ser esquivado usando los comentarios @escapeNotVerifiedo @noEscape. Es probable que esto no se permita en futuras versiones de Magento. En su lugar, use uno de los siguientes:

  • Cualquier cadena estática entre comillas simples.
  • Una cadena estática entre comillas dobles, sin variables en línea.
  • [recomendado] valor A escapó con uno de los métodos de escape de \Magento\Framework\View\Element\AbstractBlock( escapeHtml(), escapeUrl(), escapeQuote(), escapeXssInUrl()).
  • Un valor convertido a un tipo numérico (al menos bool e int, ¿quizás otros?)
  • Cualquier llamada a método con la palabra "html" en el nombre, como printBannerHtml(). ¡No abuses de este! Asegúrese de que su blahHtml()método realmente escape correctamente de todas las variables.
Dewi Morgan
fuente
mi extensión muestra advertencia pero ninguna de las anteriores, ¿es posible que mi extensión sea rechazada debido a una advertencia?
Sanjay Gohil
Publiqué esto hace un tiempo, puede haber nuevos agregados desde entonces. Cuando inicie sesión en su cuenta de desarrollador, haga clic en la extensión y vea el registro de errores, ¿cuál es el mensaje que está viendo y en qué nivel son errores? Si no son severidad 10, entonces puede ser rechazado por alguna otra razón. ¿Qué dice el correo electrónico de rechazo?
Dewi Morgan
6

Error:

Salida sin escapes detectada

Error en el archivo .phtml

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

Usted grita uso:

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

Consulte las plantillas de seguridad XSS para http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/templates/template-security.html#escape-functions-for-templates

Sankar_k
fuente
Este es un estilo de programación extraordinariamente pobre. No abuses de los comandos @noEscapey @escapeNotValidatedde esta manera: si lo haces, es probable que sean desaprobados y luego rechazados por el sistema MEQP. Consulte la parte inferior de mi respuesta para ver una amplia gama de mejores formas de escapar de sus datos.
Dewi Morgan el
1
@Dewi Morgan: Gracias por su valiosa información.
Sankar_k