web-dev-qa-db-fra.com

JFactory :: getDbo () obsolète - quel est le remplacement?

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é?

1
user101289

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.

1
Sharky

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.

4
pe7er

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;
2
mickmackusa