J'exécute Joomla 3.9.5 et j'essaie de mettre à jour mes appels JFactory::getDbo()
(qui sont déconseillés) au format plus récent en utilisant le conteneur. Cependant, j'obtiens l'erreur suivante: Call to undefined method Joomla\CMS\Factory::getContainer()
Le code ressemble
$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
qui ressemble à ce qui est utilisé dans la méthode obsolète dans \Joomla\CMS\Factory
:
self::$database = self::getContainer()->get('DatabaseDriver');
Quelle est la bonne façon d'obtenir un DBO dans le nouveau système conteneurisé?
Votre problème vient uniquement de la confusion à propos de Joomla! versions. Ces faits devraient purifier l'air:
\Joomla\CMS\Factory::getDbo()
est obsolète dans 4.0 et sera supprimé dans 5.0. Il est bel et bien vivant en 3.9.
\Joomla\CMS\Factory::getContainer()
n'existe pas en 3.9 car il n'a été ajouté qu'en 4.0.
Le code que vous regardiez est de 4.0, pas de 3.9.5.
Dans les extensions compatibles avec 3.9, continuez à utiliser \Joomla\CMS\Factory::getDbo()
. Utilisez \Joomla\CMS\Factory::getContainer()
uniquement dans les extensions compatibles avec 4.0 et supérieures.
Joomla 3.9.x a un fichier public_html/bibliothèques/classmap.php qui contient tous les anciens noms de classe de style et les nouveaux remplacements. Par exemple.
JLoader::registerAlias('JFactory', '\\Joomla\\CMS\\Factory', '5.0');
JFactory est en effet obsolète. Vous pouvez réécrire
// JFactory is deprecated
$db = JFactory::getDbo();
à
// Put at the top of your file
use Joomla\CMS\Factory;
// Just remove the J
$db = Factory::getDbo();
btw: parfois la classe d'usine a déjà été chargée et vous pouvez simplement utiliser
$db = $this->getDbo();
Que IDE utilisez-vous? Certains IDE) peuvent vous aider à trouver les bonnes classes.
J'utilise PHPStorm (logiciel commercial) avec CodeSniffer et le norme de code Joomla. PHPStorm indique toutes les classes obsolètes. Lorsque je clique sur CTRL + pointez la souris sur JFactory, mon IDE donne un pop-up "alias JFactory de classe abstraite Factory". Lorsque je CTRL + clique sur JFactory, mon IDE ouvre le fichier classmap avec les anciens/nouveaux noms de classe. Pour remplacer facilement la JFactory par le nouveau nom de Factory, je clique dessus, appuyez sur ALT + ENTRÉE et choisissez "Importer la classe", choisissez Joomla\CMS\Factory et l'espacement correct des noms est placé en haut de mon fichier.
Votre commentaire m'a amené à douter de ma conviction que getDbo()
est bel et bien vivant. J'ai testé mes techniques ci-dessous sur Joomla3.9.5 et il n'y a aucun problème.
Réponse originale ...
Sur la base de cette documentation:
https://api.joomla.org/cms-3/classes/Joomla.CMS.Factory.html#method_getDbo
Renvoie l'objet global\JDatabaseDriver, le créant uniquement s'il n'existe pas déjà.
Vous devriez pouvoir utiliser getDbo
() `.
Cela ressemblerait à quelque chose comme ceci:
use \Joomla\CMS\Factory; // at the top of your file
$db = Factory::getDbo();
ou vous pouvez faire appel statique sur l'espace de noms complet :
$db = \Joomla\CMS\Factory::getDbo();
Réponse ultérieure ...
En supposant que vous avez défini le DatabaseDriver
dans votre conteneur. Disons quelque chose comme:
$container = new Joomla\DI\Container;
$container->set('DatabaseDriver', Factory::getDbo()); // this is just what I used to set the driver
Ensuite, vous le récupérez simplement comme ceci:
$db = $container->get('DatabaseDriver');
J'ai testé $db
pour autoriser avec succès les requêtes sur mon local.
Quelques références:
Pour expliquer pourquoi je suis allé à DI
, j'ai vu le bloc de commentaires suivant dans libraries/src/Factory.php
:
/**
* Global database object
*
* @var DatabaseDriver
* @since 11.1
* @deprecated 5.0 Use the database service in the DI container
*/
public static $database = null;