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 ! 🙂