web-dev-qa-db-ja.com

JFactory :: getDbo()は非推奨-何が置き換えられますか?

Joomla 3.9.5を実行していますが、JFactory::getDbo()呼び出し(非推奨)をコンテナーを使用して新しい形式に更新しようとしています。ただし、次のエラーが発生します:Call to undefined method Joomla\CMS\Factory::getContainer()

コードは次のようになります

$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');

これは、\Joomla\CMS\Factoryの非推奨メソッドで使用されているものと同じように見えます。

self::$database = self::getContainer()->get('DatabaseDriver');

新しいコンテナー化システムでDBOを取得する正しい方法は何ですか?

1
user101289

あなたの問題は、Joomla!バージョン。これらの事実は空気をきれいにするはずです:

\Joomla\CMS\Factory::getDbo()は4.0で廃止され、5.0で削除されます。 3.9でも健在です。

\Joomla\CMS\Factory::getContainer()は4.0でのみ追加されたため、3.9では存在しません。

あなたが見ていたコードは4.0からのものであり、3.9.5からのものではありません。

3.9と互換性のある拡張機能では、\Joomla\CMS\Factory::getDbo()を使用し続けます。 \Joomla\CMS\Factory::getContainer()は、4.0以上と互換性のある拡張機能でのみ使用してください。

1
Sharky

Joomla 3.9.xには、すべての古いスタイルのクラス名と新しい置換を含むファイルpublic_html/libraries/classmap.phpがあります。例えば。

JLoader::registerAlias('JFactory', '\\Joomla\\CMS\\Factory', '5.0');

JFactoryは実際には非推奨です。あなたは書き直すことができます

// JFactory is deprecated
$db = JFactory::getDbo();

// Put at the top of your file 
use Joomla\CMS\Factory;

// Just remove the J 
$db = Factory::getDbo();

ところで、ファクトリークラスがすでにロードされている場合は、そのまま使用できます

$db = $this->getDbo();

IDE使用しますか?一部IDEソフトウェアパッケージでできます適切なクラスを見つけるのに役立ちます

PHPStorm(商用ソフトウェア)をCodeSnifferおよびJoomlaコード標準と一緒に使用しています。 PHPStormは、すべての非推奨クラスを示します。 CTRL +クリックしてJFactoryをポイントすると、my IDEによってポップアップ「抽象クラスFactoryのエイリアスJFactory」が表示されます。CTRL+クリックしてJFactoryをクリックすると、my IDEは、古い/新しいクラス名でクラスマップファイルを開きます。JFactoryを新しいファクトリー名で簡単に置き換えるには、それをクリックし、ALT + ENTERを押して「クラスのインポート」を選択し、Joomla\CMS\Factoryを選択します、正しい名前の間隔がファイルの上に配置されます。

4
pe7er

あなたのコメントは、getDbo()が健在であるという私の信念を疑わせました。以下の手法をJoomla3.9.5でテストしましたが、問題はありません。

元の回答...

このドキュメントに基づく:

https://api.joomla.org/cms-3/classes/Joomla.CMS.Factory.html#method_getDbo

グローバルな\ JDatabaseDriverオブジェクトを返し、まだ存在しない場合にのみ作成します。

getDbo() `を使用できるはずです。

次のようになります。

use \Joomla\CMS\Factory;  // at the top of your file
$db = Factory::getDbo();

または 完全修飾名前空間の静的呼び出し を実行できます。

$db = \Joomla\CMS\Factory::getDbo();

後で回答...

コンテナにDatabaseDriverが設定されていると仮定します。次のように言いましょう:

$container = new Joomla\DI\Container;
$container->set('DatabaseDriver', Factory::getDbo());  // this is just what I used to set the driver

その後、次のようにフェッチするだけです。

$db = $container->get('DatabaseDriver');

私は$dbをテストして、ローカルでのクエリを正常に許可しました。

いくつかの参照:


DIに行った理由を説明するために、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