Mejora de mensajes de error para errores de compilación XML

14

Magento es bastante protector (como debería ser) con respecto a la visualización de errores. Cuando el modo de desarrollador está habilitado (como debería estarlo durante el desarrollo), la aplicación permite que los comentarios de errores en tiempo de ejecución broten hacia el usuario. Para los errores de compilación XML, aunque estos comentarios son bastante inútiles:

Error grave: excepción no detectada 'Excepción' con el mensaje 'Advertencia: simplexml_load_string (): Entidad: línea 4: error del analizador: declaración XML permitida solo al comienzo del documento en [...] / lib / Varien / Simplexml / Config. php en línea 510 'en [...] aplicación / código / core / Mage / Core / functions.php en línea 245

Esto resulta de Varien_Simplexml_Config::loadFile()presentar ::loadString()una cadena que no se puede analizar:

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    return $this->loadString($fileData, $this->_elementClass);
}

Existen varias soluciones potenciales, incluido el uso libxml_use_internal_errors, pero el método de llamada no comunica el $filePathparámetro, por lo que se perdería el contexto. Una posibilidad sería lanzar una excepción más explícita:

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    try{
        return $this->loadString($fileData, $this->_elementClass);
    }
    catch (Exception $e){
        Mage::throwException (
            sprintf(
                "%s: error parsing %s:\r\n%s",
                __METHOD__,
                $filePath,
                $e->getMessage()
            )
        );
    }
}

Esto al menos proporciona resultados como los siguientes:

Error grave: excepción no detectada 'Mage_Core_Exception' con el mensaje ' Varien_Simplexml_Config :: loadFile: error al analizar [...] / app / code / local / Some / Example / etc / config.xml : Advertencia: simplexml_load_string (): Entidad: línea 4 : error del analizador: declaración XML permitida solo al comienzo del documento en [...] / lib / Varien / Simplexml / Config.php en la línea 534 'en [...] / app / Mage.php en la línea 594

¿Hay algunas ventajas / desventajas / enfoques alternativos para considerar aquí?

puntos de referencia
fuente
Siento que un módulo de la comunidad para mejorar algunos de estos mensajes de error principales sería épico. El otro mensaje de error que es realmente malo es cuando no puede encontrar un phtml determinado.
kalenjordan

Respuestas:

14

El enfoque que siempre adopto es simple:

find . -type f -name '*.xml' -exec xmllint --noout {} \;

aunque se requieren libxml2-utils ...

Daniel Sloof
fuente
1
y muestra falsos positivos en los archivos wsi:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex
Solución alternativa: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(no dude en editar la respuesta)
Alex
Para config.xml: soy fanático defind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@ Alex Recibo el mismo error, ¿tienes una solución para eso?
Mariposa
¿Probaste la línea que publiqué?
Alex