Joomlaアプリケーションなしでjdatabaseオブジェクトをインスタンス化できますか?明らかなユースケースは、APIやcronなどのサイトのスタンドアロンコードに直接エンドポイントを開き、a)1つのクラスだけが必要な場合にJoomlaアプリケーション全体をブートストラップすることによるパフォーマンスへの影響を避けたい場合です。 b)JoomlaアプリケーションとAPIエンドポイントが共有するクエリを書き換えます。
私はコードを抽出して揺らすだけのこのアプローチがあることを理解しています:
しかし、私がライブラリを掘り始める前に、誰かが私が試みていることを試みたことを願っています。
bootstrapファイルが利用できない場合、アプリケーションなしでフレームワークをロードして、appと呼ばれるフォルダーでこのようなパフォーマンスを確認しました。
$time_start = microtime(1);
define('_JEXEC', 1);
$base = str_replace("/app", "", __DIR__);
define('JPATH_BASE', $base);
require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';
$db = JFactory::getDBO();
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__users'));
$db->setQuery($query);
$users = $db->loadObjectList();
echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();
そして置く
$time_start = microtime(1);
joomlaのindex.phpファイルの先頭に移動し、ダミーコンポーネントのエントリファイルで次のスクリプトを実行して、コンポーネントのビューにルーティングするメニュー項目を追加します。
defined('_JEXEC') or die;
global $time_start;
$db = JFactory::getDBO();
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__users'));
$db->setQuery($query);
$users = $db->loadObjectList();
echo "<pre>" . print_r($users,1) . "</pre>";
echo microtime(1) - $time_start;
die();
joomlaアプリケーションなし
joomlaアプリケーション>ルーター>メニュー+コンポーネント
私はおそらく、より高速なアプローチを探すのをやめるのに十分なパフォーマンスの向上であり、プラットフォーム全体を持っていることはおそらくとにかく役に立つでしょう。しかし、誰かがcmsのビットを使用してカスタムAPIエンドポイントを提供するための別のスリム化された方法を持っている場合、私は聞きたいと思います。
はい、可能です。オートローダーを実行するbootstrap.php
を含める必要があります。これにより、名前空間付きのDatabase
フレームワークパッケージを呼び出すことができます。
次に例を示します。
define('_JEXEC', 1);
define('JPATH_BASE', __DIR__);
require JPATH_BASE . '/includes/defines.php';
require JPATH_BASE . '/libraries/bootstrap.php';
// Make the database driver
$dbFactory = new Joomla\Database\DatabaseFactory;
$db = $dbFactory->getDriver(
'mysqli', [
'Host' => 'localhost',
'user' => 'MY DATABASE USERNAME',
'password' => 'MY DATABASE PASSWORD',
'database' => 'MY DATABASE NAME',
'prefix' => 'xxx_'
]
);
$query = $db->getQuery(true)
->select('*')
->from($db->qn('#__users'));
$db->setQuery($query);
$users = $db->loadObjectList();
この例では、スタンドアロンのPHPファイルがJoomlaサイトのルートにあることを前提としているため、ファイルが存在する場所によっては、2行目を変更する必要がある場合があります。
お役に立てれば