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を取得する正しい方法は何ですか?
あなたの問題は、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以上と互換性のある拡張機能でのみ使用してください。
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を選択します、正しい名前の間隔がファイルの上に配置されます。
あなたのコメントは、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;