Poprawianie komunikatów o błędach dotyczących błędów kompilacji XML

14

Magento jest dość ochronny (tak jak powinien) pod względem wyświetlania błędów. Gdy tryb programisty jest włączony (tak jak powinien być podczas programowania), aplikacja pozwala na przesłanie komunikatu zwrotnego dotyczącego błędu środowiska wykonawczego do użytkownika. W przypadku błędów kompilacji XML ta opinia jest jednak bezużyteczna:

Błąd krytyczny: nieprzechwycony wyjątek „Wyjątek” z komunikatem „Ostrzeżenie: simplexml_load_string (): Obiekt: wiersz 4: błąd analizatora składni: deklaracja XML dozwolona tylko na początku dokumentu w [...] / lib / Varien / Simplexml / Config. php na linii 510 'w [...] aplikacji / code / core / Mage / Core / functions.php na linii 245

Wynika to z Varien_Simplexml_Config::loadFile()prezentacji ::loadString()ciągu, którego nie można przeanalizować:

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);
}

Istnieje kilka potencjalnych rozwiązań, w tym użycie libxml_use_internal_errors, ale metoda wywołania nie przekazuje $filePathparametrów, więc kontekst zostałby utracony. Jedną z możliwości byłoby wprowadzenie bardziej wyraźnego wyjątku:

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()
            )
        );
    }
}

Zapewnia to co najmniej następujące wyniki:

Błąd krytyczny: nieprzechwycony wyjątek „Mage_Core_Exception” z komunikatem „ Varien_Simplexml_Config :: loadFile: parsowanie błędów [...] / app / code / local / Some / Example / etc / config.xml : Ostrzeżenie: simplexml_load_string (): Entity: wiersz 4 : błąd analizatora składni: deklaracja XML jest dozwolona tylko na początku dokumentu w [...] / lib / Varien / Simplexml / Config.php w linii 534 'w [...] / app / Mage.php w linii 594

Czy są tu jakieś zalety / wady / alternatywne podejścia?

zalety
źródło
Wydaje mi się, że moduł społecznościowy służący do poprawy niektórych komunikatów o błędach podstawowych rdzeni byłby niesamowity. Innym błędnym komunikatem o błędzie jest to, że nie można znaleźć danego pliku phtml.
kalenjordan

Odpowiedzi:

14

Podejście, które zawsze wybieram, jest proste, jedno-liniowe:

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

Wymagane libxml2-utils ...

Daniel Sloof
źródło
1
i pokazuje fałszywe trafienia w plikach wsi:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex
Obejście: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(edytuj odpowiedź)
Alex
Dla config.xml: Jestem fanemfind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@Alex Otrzymuję ten sam błąd, czy masz to naprawić?
Motyl
Próbowałeś linii, którą opublikowałem?
Alex