Tutos & Astuces

Doctrine 1.2 & php 5.4 : Array to string conversion in Abstract.php

En récupérant un ancien projet tournant sur Symfony 1.4 et Doctrine 1.2 avec la version 5.4 de PHP, j’ai vu de nombreuses fois apparaître cette erreur de type E_NOTICE lors de l’affichage du site :

Notice: Array to string conversion in /home/sullivan/www/mysite/lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php on line 1152

Après quelques recherches, j’ai trouvé la solution dans ce ticket GitHub.
Dans le fichier Abstract.php, ligne 1552, nous pouvons voir ceci :

// lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php
protected function _getDqlCallbackComponents($params = array())
{
    $componentsBefore = array();
    if ($this->isSubquery()) {
        $componentsBefore = $this->getQueryComponents();
    }

    $copy = $this->copy();
    $copy->getSqlQuery($params, false);
    $componentsAfter = $copy->getQueryComponents();

    $this->_rootAlias = $copy->getRootAlias();

    $copy->free();

    if ($componentsBefore !== $componentsAfter) {
        return array_diff($componentsAfter, $componentsBefore);
    } else {
        return $componentsAfter;
    }
}

Remplacez array_diff par array_diff_assoc et cela ne devrait régler les trois quarts de vos erreurs .. Source.

Cependant cela n’est pas optimisé, dans le cas ou votre requête DQL ne retourne pas de résultats  l’erreur risque encore d’apparaître, voici une méthode un peu plus bricolage mais qui fonctionne complètement pour ma part, avec un foreach à la main :

// lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Query/Abstract.php
protected function _getDqlCallbackComponents($params = array())
{
    $componentsBefore = array();
    if ($this->isSubquery()) {
        $componentsBefore = $this->getQueryComponents();
    }

    $copy = $this->copy();
    $copy->getSqlQuery($params, false);
    $componentsAfter = $copy->getQueryComponents();

    $this->_rootAlias = $copy->getRootAlias();

    $copy->free();

    if ($componentsBefore !== $componentsAfter) {
        $diff = array();

        foreach($componentsAfter as $key => $val) {
            if(!isset($componentsBefore[$key])) {
                $diff[$key] = $val;
            } elseif(is_array($componentsBefore[$key]) && !is_array($val)) {
                $diff[$key] = $val;
            }
        }
        return $diff;
    } else {
        return $componentsAfter;
    }
}

Avec cette méthode je n’ai plus aucun problème, voici la source d’où je me suis inspiré.

Une meilleure solution ? J’attends vos propositions avec impatience ! 🙂

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
  • daniel

    Merci

  • Nami

    Merci :-).

  • Jens Held

    Merci beaucoup! Just upgraded PHP to 5.4 from 5.3 in my development environment, and suddenly my site which is using Doctrine 1.2 started throwing theese errors array to string conversion mojo messages around. Your code solved it, thank you again.!!!

  • alexfilatov

    thanks a lot! saved me a lot of time! =)