При открытии сайта на Joomla 5 (после обновление с 4 на 5 версию) мы увидели фатальную ошибку:
TZ_Portfolio_PlusTableContent::__construct():
Argument #1 ($db) must be of type JDatabaseDriver,
Joomla\Database\Mysqli\MysqliDriver given
Сайт полностью переставал работать — ни админка, ни публичная часть не загружались.
Наш старый компонент TZ_Portfolio_Plus (портфолио/галерея) был написан для Joomla 3. В третьей версии все базы данных передавались через класс JDatabaseDriver.
Начиная с Joomla 4, разработчики полностью переработали работу с базами данных. Теперь используется объект Joomla\Database\Mysqli\MysqliDriver (и другие драйверы в пространствах имён).
Конструктор класса TZ_Portfolio_PlusTableContent жёстко требовал именно JDatabaseDriver, а Joomla 4 передала ему новый тип данных. PHP не смог выполнить код — отсюда и ошибка.
Мы нашли файл, где определён класс TZ_Portfolio_PlusTableContent. Он находился по пути:
/administrator/components/com_tz_portfolio_plus/tables/content.php
Внутри был такой конструктор:
public function __construct(JDatabaseDriver $db)
{
parent::__construct('#__tz_portfolio_plus_content', 'id', $db);
}
Мы заменили жёсткую привязку к JDatabaseDriver на абстрактный драйвер из пространства имён Joomla 4/5:
public function __construct(\Joomla\Database\DatabaseDriver $db)
{
parent::__construct('#__tz_portfolio_plus_content', 'id', $db);
}
После этого сайт заработал мгновенно.
\Joomla\Database\DatabaseDriver — это общий абстрактный класс для всех драйверов баз данных в Joomla 4/5.MysqliDriver наследуется от DatabaseDriver, поэтому передача объекта стала корректной.public function __construct($db) — это тоже работает, но менее правильно с точки зрения архитектуры.Если у вас старый компонент для Joomla 3, при миграции на Joomla 4/5 могут возникнуть похожие проблемы. Вот таблица замен:
| Joomla 3 (старый стиль) | Joomla 4/5 (новый стиль) |
|---|---|
JFactory::getDBO() | \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver') |
JFactory::getApplication() | \Joomla\CMS\Factory::getApplication() |
JText::_() | \Joomla\CMS\Language\Text::_() |
JRoute::_() | \Joomla\CMS\Router\Route::_() |
JHtml::_() | \Joomla\CMS\HTML\HTMLHelper::_() |
Ошибка была связана с несовместимостью типов данных между Joomla 3 и Joomla 4. Исправление заняло буквально одну строчку кода — замена JDatabaseDriver на \Joomla\Database\DatabaseDriver. Сайт полностью восстановлен.
Если вы переезжаете с Joomla 3 на 4 или 5 — проверяйте конструкторы всех таблиц (Table) в сторонних компонентах. Это одна из самых частых ошибок.