PHP Joomla 4. Как отлавливать исключения объекта работы с базой данных или как для этой цели модифицировать класс?
Ранее был написан модуль, который умеет работать с Wordpress, Joomla и Bitrix, и который использует для подключения к БД драйвер, предусмотренный CMS.
Таким образом, при работе с любой CMS для использования указанной библиотеки требовалось для использования просто подключить класс библиотеки, и сразу можно использовать её методы, не важно какая CMS, то есть, кроссплатформенно.
Указанная библиотека при первом использовании создаёт таблицу в базе данных для хранения различных своих данных, при этом момент необходимости создания таблицы определялся в момент, когда при SELECT-запросе к несуществующей таблице срабатывало исключение.
После того, как Joomla обновилась (вышла какая то из 4-ых версий), метод $db->query() заменил на $db->execute(), это казалось бы не проблема - была дописана логика, определяющая, в зависимости от версии Joomla, какой метод использовать, при этом в в методе execute используется обработчик исключений от Joomla, который ловит ситуацию отсутствия таблицы в БД выдаёт HTML-страницу ошибки 500 и мой обработчик исключений не срабатывает - следовательно, таблица не создаётся.
Делать метод для Joomla, который на этапе начала работы с библиотекой создаст таблицу - такой себе вариант, поскольку с разными CMS с библиотекой нужно уже работать по-разному и просто бы избежать бы лишнего действия и обучения для потенциального пользователя библиотеки.
Проверять перед SQL SELECT-запросом наличие таблицы вариант так же не очень, потому что так то бы эту таблицу 1 раз создать и далее только использовать, то есть так получается запрос, который в более чем 99.99% случаев лишний, и его бы тоже избежать.
И как раз исключение для создания таблицы при её отсутствии решало эту проблему.
Рассматриваю вариант унаследовать свой класс, в котором будет метод execute и в котором не будет отлавливаться исключение и использовать его в своей библиотеке, при этом получается приличная часть кода переписывается для этой цели.
Может, есть какой то другой вариант? Например, может быть можно как-то переопределить механизм исключений Joomla 4, чтобы именно в данном случаe он не сработал, а затем (после выполнения нужного запроса) вернуть настройки в исходное состояние?
Или может быть как-то SQL запрос можно модифицировать, чтобы из результата его выполнения было понятно, что таблицы не существует?
Ответы (1 шт):
Как вариант, в Битриксе например, так проверяется существование таблицы перед установкой модуля.
global $DB, $DBType, $APPLICATION;
$bDBInstall = !$DB->Query("SELECT 'x' FROM l_table_name WHERE 1 = 0", true);
if ($bDBInstall) {
$this->errors = $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/local/modules/module_name/install/db/".$DBType."/install.sql");
}
if ($this->errors !== false) {
$APPLICATION->ThrowException(implode("<br>", $this->errors));
return false;
} else {
RegisterModule($this->MODULE_ID);
return true;
}