{{ messages|raw }}
- {{ recent_table|raw }}
{%- if is_logged_in -%}
{{ include('modals/preview_sql_modal.twig') }}
{{ include('modals/enum_set_editor.twig') }}
diff --git a/src/Application.php b/src/Application.php
index 271749c979..d76589b6b3 100644
--- a/src/Application.php
+++ b/src/Application.php
@@ -29,6 +29,7 @@ use PhpMyAdmin\Http\Middleware\OutputBuffering;
use PhpMyAdmin\Http\Middleware\PhpExtensionsChecking;
use PhpMyAdmin\Http\Middleware\PhpSettingsConfiguration;
use PhpMyAdmin\Http\Middleware\ProfilingChecking;
+use PhpMyAdmin\Http\Middleware\RecentTableHandling;
use PhpMyAdmin\Http\Middleware\RequestProblemChecking;
use PhpMyAdmin\Http\Middleware\ResponseRendererLoading;
use PhpMyAdmin\Http\Middleware\RouteParsing;
@@ -114,6 +115,7 @@ class Application
$requestHandler->add(new TokenMismatchChecking());
$requestHandler->add(new ProfilingChecking());
$requestHandler->add(new UserPreferencesLoading($this->config));
+ $requestHandler->add(new RecentTableHandling($this->config));
$runner = new RequestHandlerRunner(
$requestHandler,
diff --git a/src/Controllers/RecentTablesListController.php b/src/Controllers/RecentTablesListController.php
deleted file mode 100644
index b0538284c0..0000000000
--- a/src/Controllers/RecentTablesListController.php
+++ /dev/null
@@ -1,29 +0,0 @@
-isAjax()) {
- return null;
- }
-
- $this->response->addJSON(['list' => RecentFavoriteTables::getInstance(TableType::Recent)->getHtmlList()]);
-
- return null;
- }
-}
diff --git a/src/Favorites/RecentFavoriteTables.php b/src/Favorites/RecentFavoriteTables.php
index 89f69d490c..7cf76c875e 100644
--- a/src/Favorites/RecentFavoriteTables.php
+++ b/src/Favorites/RecentFavoriteTables.php
@@ -329,16 +329,6 @@ class RecentFavoriteTables
return $retval;
}
- /**
- * Generate Html to update recent tables.
- */
- public static function getHtmlUpdateRecentTables(): string
- {
- return '
';
- }
-
/**
* Return the name of the configuration storage table
*
diff --git a/src/Header.php b/src/Header.php
index e0c28a42ea..409571c2ca 100644
--- a/src/Header.php
+++ b/src/Header.php
@@ -9,12 +9,7 @@ namespace PhpMyAdmin;
use PhpMyAdmin\ConfigStorage\Relation;
use PhpMyAdmin\Container\ContainerBuilder;
-use PhpMyAdmin\Favorites\RecentFavoriteTable;
-use PhpMyAdmin\Favorites\RecentFavoriteTables;
-use PhpMyAdmin\Favorites\TableType;
use PhpMyAdmin\Html\Generator;
-use PhpMyAdmin\Identifiers\DatabaseName;
-use PhpMyAdmin\Identifiers\TableName;
use PhpMyAdmin\Navigation\Navigation;
use PhpMyAdmin\Theme\ThemeManager;
@@ -252,22 +247,10 @@ class Header
*/
public function getDisplay(): string
{
- if ($this->headerIsSent || ! $this->isEnabled) {
+ if ($this->headerIsSent || ! $this->isEnabled || $this->isAjax) {
return '';
}
- $recentTable = '';
- if (empty($_REQUEST['recent_table']) && Current::$table !== '') {
- $recentTable = $this->addRecentTable(
- DatabaseName::from(Current::$database),
- TableName::from(Current::$table),
- );
- }
-
- if ($this->isAjax) {
- return $recentTable;
- }
-
$this->sendHttpHeaders();
$baseDir = defined('PMA_PATH_TO_BASEDIR') ? PMA_PATH_TO_BASEDIR : '';
@@ -359,7 +342,6 @@ class Header
'menu' => $menu ?? '',
'console' => $console,
'messages' => $messages,
- 'recent_table' => $recentTable,
'theme_color_mode' => $theme->getColorMode(),
'theme_color_modes' => $theme->getColorModes(),
'theme_id' => $theme->getId(),
@@ -580,24 +562,6 @@ class Header
return $headers;
}
- /**
- * Add recently used table and reload the navigation.
- */
- private function addRecentTable(DatabaseName $db, TableName $table): string
- {
- if ($this->menuEnabled && $this->config->settings['NumRecentTables'] > 0) {
- $favoriteTable = new RecentFavoriteTable($db, $table);
- $error = RecentFavoriteTables::getInstance(TableType::Recent)->add($favoriteTable);
- if ($error === true) {
- return RecentFavoriteTables::getHtmlUpdateRecentTables();
- }
-
- return $error->getDisplay();
- }
-
- return '';
- }
-
/**
* Returns the phpMyAdmin version to be appended to the url to avoid caching
* between versions
diff --git a/src/Http/Middleware/RecentTableHandling.php b/src/Http/Middleware/RecentTableHandling.php
new file mode 100644
index 0000000000..ebcb21df26
--- /dev/null
+++ b/src/Http/Middleware/RecentTableHandling.php
@@ -0,0 +1,49 @@
+config->settings['NumRecentTables'] === 0) {
+ return $handler->handle($request);
+ }
+
+ $response = $handler->handle($request);
+
+ $db = DatabaseName::tryFrom($request->getParam('db'));
+ $table = TableName::tryFrom($request->getParam('table'));
+ if ($db !== null && $table !== null) {
+ $recentTable = new RecentFavoriteTable($db, $table);
+ $isAddedOrError = RecentFavoriteTables::getInstance(TableType::Recent)->add($recentTable);
+ if ($isAddedOrError instanceof Message) {
+ $response->getBody()->write($isAddedOrError->getMessage());
+ }
+ }
+
+ return $response;
+ }
+}
diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php
index fd664e271b..0e4f2eae96 100644
--- a/src/Routing/Routes.php
+++ b/src/Routing/Routes.php
@@ -30,7 +30,6 @@ use PhpMyAdmin\Controllers\Normalization;
use PhpMyAdmin\Controllers\Operations;
use PhpMyAdmin\Controllers\PhpInfoController;
use PhpMyAdmin\Controllers\Preferences;
-use PhpMyAdmin\Controllers\RecentTablesListController;
use PhpMyAdmin\Controllers\SchemaExportController;
use PhpMyAdmin\Controllers\Server;
use PhpMyAdmin\Controllers\Sql;
@@ -172,7 +171,6 @@ final class Routes
$routes->addRoute(['GET', 'POST'], '/sql', Preferences\SqlController::class);
$routes->addRoute(['GET', 'POST'], '/two-factor', Preferences\TwoFactorController::class);
});
- $routes->addRoute(['GET', 'POST'], '/recent-table', RecentTablesListController::class);
$routes->addRoute(['GET', 'POST'], '/schema-export', SchemaExportController::class);
$routes->addGroup('/server', static function (RouteCollector $routes): void {
$routes->addRoute(['GET', 'POST'], '/binlog', Server\BinlogController::class);
diff --git a/tests/unit/Http/Middleware/RecentTableHandlingTest.php b/tests/unit/Http/Middleware/RecentTableHandlingTest.php
new file mode 100644
index 0000000000..c7a2d49aad
--- /dev/null
+++ b/tests/unit/Http/Middleware/RecentTableHandlingTest.php
@@ -0,0 +1,59 @@
+createDbiDummy();
+ DatabaseInterface::$instance = $this->createDatabaseInterface($dbiDummy);
+
+ $dbiDummy->addResult('SELECT 1 FROM `test_db`.`test_table` LIMIT 1;', [['1']]);
+
+ $config = new Config();
+ $config->settings['NumRecentTables'] = 10;
+
+ $request = ServerRequestFactory::create()->createServerRequest('GET', 'https://example.com/')
+ ->withQueryParams(['db' => 'test_db', 'table' => 'test_table']);
+
+ $response = ResponseFactory::create()->createResponse();
+ $handler = self::createMock(RequestHandlerInterface::class);
+ $handler->method('handle')->with($request)->willReturn($response);
+
+ $reflectionProperty = new ReflectionProperty(RecentFavoriteTables::class, 'instances');
+ $reflectionProperty->setValue(null, []);
+ $recentTables = RecentFavoriteTables::getInstance(TableType::Recent);
+ self::assertSame([], $recentTables->getTables());
+
+ $actualResponse = (new RecentTableHandling($config))->process($request, $handler);
+
+ self::assertSame($response, $actualResponse);
+ self::assertSame('', (string) $actualResponse->getBody());
+ self::assertEquals(
+ [new RecentFavoriteTable(DatabaseName::from('test_db'), TableName::from('test_table'))],
+ $recentTables->getTables(),
+ );
+
+ $dbiDummy->assertAllQueriesConsumed();
+ $reflectionProperty->setValue(null, []);
+ }
+}
diff --git a/tests/unit/Routing/RoutesTest.php b/tests/unit/Routing/RoutesTest.php
index fcc7983751..88aec2b605 100644
--- a/tests/unit/Routing/RoutesTest.php
+++ b/tests/unit/Routing/RoutesTest.php
@@ -33,7 +33,6 @@ use PhpMyAdmin\Controllers\Normalization;
use PhpMyAdmin\Controllers\Operations;
use PhpMyAdmin\Controllers\PhpInfoController;
use PhpMyAdmin\Controllers\Preferences;
-use PhpMyAdmin\Controllers\RecentTablesListController;
use PhpMyAdmin\Controllers\SchemaExportController;
use PhpMyAdmin\Controllers\Server;
use PhpMyAdmin\Controllers\Sql;
@@ -100,7 +99,6 @@ final class RoutesTest extends TestCase
'/preferences/navigation' => Preferences\NavigationController::class,
'/preferences/sql' => Preferences\SqlController::class,
'/preferences/two-factor' => Preferences\TwoFactorController::class,
- '/recent-table' => RecentTablesListController::class,
'/schema-export' => SchemaExportController::class,
'/server/binlog' => Server\BinlogController::class,
'/server/collations' => Server\CollationsController::class,
@@ -238,7 +236,6 @@ final class RoutesTest extends TestCase
'/preferences/navigation' => Preferences\NavigationController::class,
'/preferences/sql' => Preferences\SqlController::class,
'/preferences/two-factor' => Preferences\TwoFactorController::class,
- '/recent-table' => RecentTablesListController::class,
'/schema-export' => SchemaExportController::class,
'/server/binlog' => Server\BinlogController::class,
'/server/databases' => Server\DatabasesController::class,