diff --git a/index.php b/index.php index 71995877be..c1a2273cd0 100644 --- a/index.php +++ b/index.php @@ -60,6 +60,7 @@ if ($routeInfo[0] === Dispatcher::NOT_FOUND) { $response->setHttpResponseCode(405); Message::error(__('Error 405! Request method not allowed.'))->display(); } elseif ($routeInfo[0] === Dispatcher::FOUND) { - $handler = $routeInfo[1]; - $handler($routeInfo[2]); + [$controllerName, $action] = $routeInfo[1]; + $controller = $containerBuilder->get($controllerName); + $controller->$action($routeInfo[2]); } diff --git a/js/database/multi_table_query.js b/js/database/multi_table_query.js index ddcaafb899..191ff26582 100644 --- a/js/database/multi_table_query.js +++ b/js/database/multi_table_query.js @@ -12,7 +12,7 @@ /* global generateFromBlock, generateWhereBlock */ // js/database/query_generator.js /** - * js file for handling AJAX and other events in /database/multi_table_query + * js file for handling AJAX and other events in /database/multi-table-query */ /** @@ -70,7 +70,7 @@ AJAX.registerOnload('database/multi_table_query.js', function () { $.ajax({ type: 'GET', async: false, - url: 'index.php?route=/database/multi_table_query/tables', + url: 'index.php?route=/database/multi-table-query/tables', data: { 'server': sessionStorage.server, 'db': $('#db_name').val(), @@ -132,7 +132,7 @@ AJAX.registerOnload('database/multi_table_query.js', function () { }; $.ajax({ type: 'POST', - url: 'index.php?route=/database/multi_table_query/query', + url: 'index.php?route=/database/multi-table-query/query', data: data, success: function (data) { var $resultsDom = $(data.message); diff --git a/js/export.js b/js/export.js index 35519ed084..0b420a25a4 100644 --- a/js/export.js +++ b/js/export.js @@ -933,7 +933,7 @@ AJAX.registerOnload('export.js', function () { 'server': CommonParams.get('server'), 'db': database, }; - var url = 'index.php?route=/ajax/list-tables/' + encodeURIComponent(database); + var url = 'index.php?route=/ajax/list-tables'; $.post(url, params, function (response) { if (response.success === true) { $.each(response.tables, function (idx, value) { @@ -958,7 +958,7 @@ AJAX.registerOnload('export.js', function () { 'db': database, 'table': table, }; - var url = 'index.php?route=/ajax/list-columns/' + encodeURIComponent(database) + '/' + encodeURIComponent(table); + var url = 'index.php?route=/ajax/list-columns'; $.post(url, params, function (response) { if (response.success === true) { $.each(response.columns, function (idx, value) { diff --git a/libraries/classes/Controllers/AjaxController.php b/libraries/classes/Controllers/AjaxController.php index 63478ad93a..16868bbb20 100644 --- a/libraries/classes/Controllers/AjaxController.php +++ b/libraries/classes/Controllers/AjaxController.php @@ -33,78 +33,70 @@ class AjaxController extends AbstractController $this->config = $config; } - /** - * @return array JSON - */ - public function databases(): array + public function databases(): void { global $dblist; - return ['databases' => $dblist->databases]; + $this->response->addJSON(['databases' => $dblist->databases]); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function tables(array $params): array + public function tables(): void { - return ['tables' => $this->dbi->getTables($params['database'])]; - } - - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function columns(array $params): array - { - return [ - 'columns' => $this->dbi->getColumnNames( - $params['database'], - $params['table'] - ), - ]; - } - - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function getConfig(array $params): array - { - if (! isset($params['key'])) { + if (! isset($_POST['db'])) { $this->response->setRequestStatus(false); - return ['message' => Message::error()]; + $this->response->addJSON(['message' => Message::error()]); + return; } - return ['value' => $this->config->get($params['key'])]; + $this->response->addJSON(['tables' => $this->dbi->getTables($_POST['db'])]); } - /** - * @param array $params Request parameters - * - * @return array - */ - public function setConfig(array $params): array + public function columns(): void { - if (! isset($params['key'], $params['value'])) { + if (! isset($_POST['db'], $_POST['table'])) { $this->response->setRequestStatus(false); - return ['message' => Message::error()]; + $this->response->addJSON(['message' => Message::error()]); + return; + } + + $this->response->addJSON([ + 'columns' => $this->dbi->getColumnNames( + $_POST['db'], + $_POST['table'] + ), + ]); + } + + public function getConfig(): void + { + if (! isset($_POST['key'])) { + $this->response->setRequestStatus(false); + $this->response->addJSON(['message' => Message::error()]); + return; + } + + $this->response->addJSON(['value' => $this->config->get($_POST['key'])]); + } + + public function setConfig(): void + { + if (! isset($_POST['key'], $_POST['value'])) { + $this->response->setRequestStatus(false); + $this->response->addJSON(['message' => Message::error()]); + return; } $result = $this->config->setUserValue( null, - $params['key'], - json_decode($params['value']) + $_POST['key'], + json_decode($_POST['value']) ); - $json = []; - if ($result !== true) { - $this->response->setRequestStatus(false); - $json['message'] = $result; + + if ($result === true) { + return; } - return $json; + + $this->response->setRequestStatus(false); + $this->response->addJSON(['message' => $result]); } } diff --git a/libraries/classes/Controllers/BrowseForeignersController.php b/libraries/classes/Controllers/BrowseForeignersController.php index 8445923552..e5da306160 100644 --- a/libraries/classes/Controllers/BrowseForeignersController.php +++ b/libraries/classes/Controllers/BrowseForeignersController.php @@ -37,15 +37,20 @@ class BrowseForeignersController extends AbstractController $this->relation = $relation; } - /** - * @param array $params Request parameters - * - * @return string HTML - */ - public function index(array $params): string + public function index(): void { + $params = [ + 'db' => $_POST['db'] ?? null, + 'table' => $_POST['table'] ?? null, + 'field' => $_POST['field'] ?? null, + 'fieldkey' => $_POST['fieldkey'] ?? null, + 'data' => $_POST['data'] ?? null, + 'foreign_showAll' => $_POST['foreign_showAll'] ?? null, + 'foreign_filter' => $_POST['foreign_filter'] ?? null, + ]; + if (! isset($params['db'], $params['table'], $params['field'])) { - return ''; + return; } $this->response->getFooter()->setMinimal(); @@ -69,13 +74,13 @@ class BrowseForeignersController extends AbstractController true ); - return $this->browseForeigners->getHtmlForRelationalFieldSelection( + $this->response->addHTML($this->browseForeigners->getHtmlForRelationalFieldSelection( $params['db'], $params['table'], $params['field'], $foreignData, $params['fieldkey'] ?? '', $params['data'] ?? '' - ); + )); } } diff --git a/libraries/classes/Controllers/CheckRelationsController.php b/libraries/classes/Controllers/CheckRelationsController.php index 85d1b2ed4e..074647fa4f 100644 --- a/libraries/classes/Controllers/CheckRelationsController.php +++ b/libraries/classes/Controllers/CheckRelationsController.php @@ -28,13 +28,16 @@ class CheckRelationsController extends AbstractController $this->relation = $relation; } - /** - * @param array $params Request parameters - */ - public function index(array $params): string + public function index(): void { global $db; + $params = [ + 'create_pmadb' => $_POST['create_pmadb'] ?? null, + 'fixall_pmadb' => $_POST['fixall_pmadb'] ?? null, + 'fix_pmadb' => $_POST['fix_pmadb'] ?? null, + ]; + // If request for creating the pmadb if (isset($params['create_pmadb']) && $this->relation->createPmaDatabase()) { $this->relation->fixPmaTables('phpmyadmin'); @@ -51,6 +54,6 @@ class CheckRelationsController extends AbstractController $this->relation->fixPmaTables($cfgRelation['db']); } - return $this->relation->getRelationsParamDiagnostic($cfgRelation); + $this->response->addHTML($this->relation->getRelationsParamDiagnostic($cfgRelation)); } } diff --git a/libraries/classes/Controllers/Database/DataDictionaryController.php b/libraries/classes/Controllers/Database/DataDictionaryController.php index da9dbea9aa..5ea0aa821f 100644 --- a/libraries/classes/Controllers/Database/DataDictionaryController.php +++ b/libraries/classes/Controllers/Database/DataDictionaryController.php @@ -39,12 +39,9 @@ class DataDictionaryController extends AbstractController $this->transformations = $transformations; } - /** - * @param array $params Request parameters - */ - public function index(array $params): string + public function index(): void { - $this->db = $params['database']; + Util::checkParameters(['db'], true); $header = $this->response->getHeader(); $header->enablePrintView(); @@ -141,10 +138,10 @@ class DataDictionaryController extends AbstractController ]; } - return $this->template->render('database/data_dictionary/index', [ + $this->response->addHTML($this->template->render('database/data_dictionary/index', [ 'database' => $this->db, 'comment' => $comment, 'tables' => $tables, - ]); + ])); } } diff --git a/libraries/classes/Controllers/Database/MultiTableQueryController.php b/libraries/classes/Controllers/Database/MultiTableQueryController.php index c3062b73b7..a07a8dca2c 100644 --- a/libraries/classes/Controllers/Database/MultiTableQueryController.php +++ b/libraries/classes/Controllers/Database/MultiTableQueryController.php @@ -13,7 +13,7 @@ use PhpMyAdmin\Database\MultiTableQuery; */ class MultiTableQueryController extends AbstractController { - public function index(): string + public function index(): void { $header = $this->response->getHeader(); $scripts = $header->getScripts(); @@ -23,16 +23,18 @@ class MultiTableQueryController extends AbstractController $queryInstance = new MultiTableQuery($this->dbi, $this->template, $this->db); - return $queryInstance->getFormHtml(); + $this->response->addHTML($queryInstance->getFormHtml()); } - /** - * @param array $params Request parameters - */ - public function displayResults(array $params): void + public function displayResults(): void { global $pmaThemeImage; + $params = [ + 'sql_query' => $_POST['sql_query'], + 'db' => $_POST['db'] ?? $_GET['db'] ?? null, + ]; + MultiTableQuery::displayResults( $params['sql_query'], $params['db'], @@ -40,18 +42,16 @@ class MultiTableQueryController extends AbstractController ); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function table(array $params): array + public function table(): void { + $params = [ + 'tables' => $_GET['tables'], + 'db' => $_GET['db'] ?? null, + ]; $constrains = $this->dbi->getForeignKeyConstrains( $params['db'], $params['tables'] ); - - return ['foreignKeyConstrains' => $constrains]; + $this->response->addJSON(['foreignKeyConstrains' => $constrains]); } } diff --git a/libraries/classes/Controllers/Database/QueryByExampleController.php b/libraries/classes/Controllers/Database/QueryByExampleController.php index cde08d897e..8cacc02b35 100644 --- a/libraries/classes/Controllers/Database/QueryByExampleController.php +++ b/libraries/classes/Controllers/Database/QueryByExampleController.php @@ -164,9 +164,9 @@ class QueryByExampleController extends AbstractController $secondaryTabs = [ 'multi' => [ - 'link' => Url::getFromRoute('/database/multi_table_query'), + 'link' => Url::getFromRoute('/database/multi-table-query'), 'text' => __('Multi-table query'), - 'active' => $route === '/database/multi_table_query', + 'active' => $route === '/database/multi-table-query', ], 'qbe' => [ 'link' => Url::getFromRoute('/database/qbe'), diff --git a/libraries/classes/Controllers/Database/RoutinesController.php b/libraries/classes/Controllers/Database/RoutinesController.php index 73bace551a..d5381af6fc 100644 --- a/libraries/classes/Controllers/Database/RoutinesController.php +++ b/libraries/classes/Controllers/Database/RoutinesController.php @@ -38,15 +38,14 @@ class RoutinesController extends AbstractController $this->checkUserPrivileges = $checkUserPrivileges; } - /** - * @param array $params Request parameters - */ - public function index(array $params): void + public function index(): void { global $_PMA_RTE, $db, $table, $tables, $num_tables, $total_num_tables, $sub_part, $is_show_stats; global $db_is_system_schema, $tooltip_truename, $tooltip_aliasname, $pos, $url_query; global $errors, $titles; + $params = ['type' => $_REQUEST['type'] ?? null]; + $this->checkUserPrivileges->getPrivileges(); $_PMA_RTE = 'RTN'; diff --git a/libraries/classes/Controllers/Database/SqlAutoCompleteController.php b/libraries/classes/Controllers/Database/SqlAutoCompleteController.php index 5cbb40e8a3..fbf4aa8823 100644 --- a/libraries/classes/Controllers/Database/SqlAutoCompleteController.php +++ b/libraries/classes/Controllers/Database/SqlAutoCompleteController.php @@ -10,10 +10,7 @@ use function json_encode; */ class SqlAutoCompleteController extends AbstractController { - /** - * @return array JSON - */ - public function index(): array + public function index(): void { global $cfg, $db, $sql_autocomplete; @@ -31,6 +28,6 @@ class SqlAutoCompleteController extends AbstractController } } } - return ['tables' => json_encode($sql_autocomplete)]; + $this->response->addJSON(['tables' => json_encode($sql_autocomplete)]); } } diff --git a/libraries/classes/Controllers/Database/SqlFormatController.php b/libraries/classes/Controllers/Database/SqlFormatController.php index 570ae42e7f..2332ae0876 100644 --- a/libraries/classes/Controllers/Database/SqlFormatController.php +++ b/libraries/classes/Controllers/Database/SqlFormatController.php @@ -11,14 +11,10 @@ use function strlen; */ class SqlFormatController extends AbstractController { - /** - * @param array $params Request parameters - * - * @return array - */ - public function index(array $params): array + public function index(): void { + $params = ['sql' => $_POST['sql'] ?? null]; $query = strlen((string) $params['sql']) > 0 ? $params['sql'] : ''; - return ['sql' => Formatter::format($query)]; + $this->response->addJSON(['sql' => Formatter::format($query)]); } } diff --git a/libraries/classes/Controllers/Database/StructureController.php b/libraries/classes/Controllers/Database/StructureController.php index 0aa6b3361d..c37b68b2cf 100644 --- a/libraries/classes/Controllers/Database/StructureController.php +++ b/libraries/classes/Controllers/Database/StructureController.php @@ -107,17 +107,15 @@ class StructureController extends AbstractController $this->isShowStats = $isShowStats; } - /** - * Index action - * - * @param array $parameters Request parameters - * - * @return string HTML - */ - public function index(array $parameters): string + public function index(): void { global $cfg; + $parameters = [ + 'sort' => $_REQUEST['sort'] ?? null, + 'sort_order' => $_REQUEST['sort_order'] ?? null, + ]; + Common::database(); $this->response->getHeader()->getScripts()->addFiles([ @@ -126,8 +124,8 @@ class StructureController extends AbstractController ]); // Drops/deletes/etc. multiple tables if required - if ((! empty($parameters['submit_mult']) && isset($parameters['selected_tbl'])) - || isset($parameters['mult_btn']) + if ((! empty($_POST['submit_mult']) && isset($_POST['selected_tbl'])) + || isset($_POST['mult_btn']) ) { $this->multiSubmitAction(); } @@ -179,31 +177,30 @@ class StructureController extends AbstractController $createTable = CreateTable::getHtml($this->db); } - return $this->template->render('database/structure/index', [ + $this->response->addHTML($this->template->render('database/structure/index', [ 'database' => $this->db, 'has_tables' => $this->numTables > 0, 'list_navigator_html' => $listNavigator ?? '', 'table_list_html' => $tableList ?? '', 'is_system_schema' => ! empty($this->dbIsSystemSchema), 'create_table_html' => $createTable, - ]); + ])); } - /** - * Add or remove favorite tables - * - * @param array $parameters Request parameters - * - * @return array - */ - public function addRemoveFavoriteTablesAction(array $parameters): ?array + public function addRemoveFavoriteTablesAction(): void { global $cfg; + $parameters = [ + 'favorite_table' => $_REQUEST['favorite_table'] ?? null, + 'favoriteTables' => $_REQUEST['favoriteTables'] ?? null, + 'sync_favorite_tables' => $_REQUEST['sync_favorite_tables'] ?? null, + ]; + Common::database(); if (! $this->response->isAjax()) { - return []; + return; } $favoriteInstance = RecentFavoriteTable::getInstance('favorite'); @@ -219,22 +216,26 @@ class StructureController extends AbstractController if (isset($parameters['sync_favorite_tables'])) { $cfgRelation = $this->relation->getRelationsParam(); if ($cfgRelation['favoritework']) { - return $this->synchronizeFavoriteTables($favoriteInstance, $user, $favoriteTables); + $this->response->addJSON($this->synchronizeFavoriteTables( + $favoriteInstance, + $user, + $favoriteTables + )); } - return []; + return; } $changes = true; $titles = Util::buildActionTitles(); $favoriteTable = $parameters['favorite_table'] ?? ''; $alreadyFavorite = $this->checkFavoriteTable($favoriteTable); - if (isset($parameters['remove_favorite'])) { + if (isset($_REQUEST['remove_favorite'])) { if ($alreadyFavorite) { // If already in favorite list, remove it. $favoriteInstance->remove($this->db, $favoriteTable); $alreadyFavorite = false; // for favorite_anchor template } - } elseif (isset($parameters['add_favorite'])) { + } elseif (isset($_REQUEST['add_favorite'])) { if (! $alreadyFavorite) { $numTables = count($favoriteInstance->getTables()); if ($numTables == $cfg['NumFavoriteTables']) { @@ -255,7 +256,8 @@ class StructureController extends AbstractController $json['message'] = $this->template->render('components/error_message', [ 'msg' => __('Favorite List is full!'), ]); - return $json; + $this->response->addJSON($json); + return; } // Check if current table is already in favorite list. $favoriteParams = [ @@ -276,22 +278,23 @@ class StructureController extends AbstractController 'titles' => $titles, ]); - return $json; + $this->response->addJSON($json); } /** * Handles request for real row count on database level view page. - * - * @param array $parameters Request parameters - * - * @return array JSON */ - public function handleRealRowCountRequestAction(array $parameters): array + public function handleRealRowCountRequestAction(): void { + $parameters = [ + 'real_row_count_all' => $_REQUEST['real_row_count_all'] ?? null, + 'table' => $_REQUEST['table'] ?? null, + ]; + Common::database(); if (! $this->response->isAjax()) { - return []; + return; } // If there is a request to update all table's row count. @@ -303,7 +306,8 @@ class StructureController extends AbstractController // Format the number. $realRowCount = Util::formatNumber($realRowCount, 0); - return ['real_row_count' => $realRowCount]; + $this->response->addJSON(['real_row_count' => $realRowCount]); + return; } // Array to store the results. @@ -319,7 +323,7 @@ class StructureController extends AbstractController ]; } - return ['real_row_count_all' => json_encode($realRowCountAll)]; + $this->response->addJSON(['real_row_count_all' => json_encode($realRowCountAll)]); } /** diff --git a/libraries/classes/Controllers/GisDataEditorController.php b/libraries/classes/Controllers/GisDataEditorController.php index 0fd7dfa518..c480d88273 100644 --- a/libraries/classes/Controllers/GisDataEditorController.php +++ b/libraries/classes/Controllers/GisDataEditorController.php @@ -23,16 +23,13 @@ use function trim; */ class GisDataEditorController extends AbstractController { - /** - * @return array - */ - public function index(): array + public function index(): void { global $gis_data, $gis_types, $start, $geom_type, $gis_obj, $srid, $wkt, $wkt_with_zero; global $result, $visualizationSettings, $data, $visualization, $open_layers, $geom_count; if (! isset($_POST['field'])) { - return []; + return; } // Get data if any posted @@ -109,12 +106,12 @@ class GisDataEditorController extends AbstractController // If the call is to update the WKT and visualization make an AJAX response if (isset($_POST['generate']) && $_POST['generate'] == true) { - $extra_data = [ - 'result' => $result, + $this->response->addJSON([ + 'result' => $result, 'visualization' => $visualization, - 'openLayers' => $open_layers, - ]; - return $extra_data; + 'openLayers' => $open_layers, + ]); + return; } $geom_count = 1; @@ -141,6 +138,7 @@ class GisDataEditorController extends AbstractController 'gis_data' => $gis_data, 'result' => $result, ]); - return ['gis_editor' => $templateOutput]; + + $this->response->addJSON(['gis_editor' => $templateOutput]); } } diff --git a/libraries/classes/Controllers/HomeController.php b/libraries/classes/Controllers/HomeController.php index 6161153ffe..6961d28c37 100644 --- a/libraries/classes/Controllers/HomeController.php +++ b/libraries/classes/Controllers/HomeController.php @@ -60,17 +60,12 @@ class HomeController extends AbstractController $this->themeManager = $themeManager; } - /** - * @param array $params Request parameters - * - * @return string HTML - */ - public function index(array $params): string + public function index(): void { global $cfg, $server, $collation_connection, $message, $show_query, $db, $table; - if ($this->response->isAjax() && ! empty($params['access_time'])) { - return ''; + if ($this->response->isAjax() && ! empty($_REQUEST['access_time'])) { + return; } $db = ''; @@ -266,7 +261,7 @@ class HomeController extends AbstractController $this->checkRequirements(); - return $this->template->render('home/index', [ + $this->response->addHTML($this->template->render('home/index', [ 'message' => $displayMessage ?? '', 'partial_logout' => $partialLogout ?? '', 'is_git_revision' => $this->config->isGitRevision(), @@ -287,69 +282,58 @@ class HomeController extends AbstractController 'is_version_checked' => $cfg['VersionCheck'], 'phpmyadmin_version' => PMA_VERSION, 'config_storage_message' => $configStorageMessage ?? '', - ]); + ])); } - /** - * @param array $params Request parameters - */ - public function setTheme(array $params): void + public function setTheme(): void { - $this->themeManager->setActiveTheme($params['set_theme']); + $this->themeManager->setActiveTheme($_POST['set_theme']); $this->themeManager->setThemeCookie(); $userPreferences = new UserPreferences(); $preferences = $userPreferences->load(); - $preferences['config_data']['ThemeDefault'] = $params['set_theme']; + $preferences['config_data']['ThemeDefault'] = $_POST['set_theme']; $userPreferences->save($preferences['config_data']); $this->response->header('Location: index.php?route=/' . Url::getCommonRaw([], '&')); } - /** - * @param array $params Request parameters - */ - public function setCollationConnection(array $params): void + public function setCollationConnection(): void { $this->config->setUserValue( null, 'DefaultConnectionCollation', - $params['collation_connection'], + $_POST['collation_connection'], 'utf8mb4_unicode_ci' ); $this->response->header('Location: index.php?route=/' . Url::getCommonRaw([], '&')); } - /** - * @return array JSON - */ - public function reloadRecentTablesList(): array + public function reloadRecentTablesList(): void { if (! $this->response->isAjax()) { - return []; + return; } - return [ + + $this->response->addJSON([ 'list' => RecentFavoriteTable::getInstance('recent')->getHtmlList(), - ]; + ]); } - /** - * @return string HTML - */ - public function gitRevision(): string + public function gitRevision(): void { global $PMA_Config; if (! $this->response->isAjax() || ! $PMA_Config->isGitRevision()) { - return ''; + return; } - return (new GitRevision( + $this->response->addHTML((new GitRevision( $this->response, $this->config, $this->template - ))->display(); + ))->display()); } private function checkRequirements(): void diff --git a/libraries/classes/Controllers/LintController.php b/libraries/classes/Controllers/LintController.php index f50de951d3..5d7d5a924f 100644 --- a/libraries/classes/Controllers/LintController.php +++ b/libraries/classes/Controllers/LintController.php @@ -15,11 +15,13 @@ use function json_encode; */ class LintController extends AbstractController { - /** - * @param array $params Request parameters - */ - public function index(array $params): void + public function index(): void { + $params = [ + 'sql_query' => $_POST['sql_query'] ?? null, + 'options' => $_POST['options'] ?? null, + ]; + /** * The SQL query to be analyzed. * diff --git a/libraries/classes/Controllers/Server/BinlogController.php b/libraries/classes/Controllers/Server/BinlogController.php index a6fd99d186..153a9a58fa 100644 --- a/libraries/classes/Controllers/Server/BinlogController.php +++ b/libraries/classes/Controllers/Server/BinlogController.php @@ -45,15 +45,16 @@ class BinlogController extends AbstractController ); } - /** - * Index action - * - * @param array $params Request params - */ - public function index(array $params): string + public function index(): void { global $cfg, $pmaThemeImage; + $params = [ + 'log' => $_POST['log'] ?? null, + 'pos' => $_POST['pos'] ?? null, + 'is_full_query' => $_POST['is_full_query'] ?? null, + ]; + Common::server(); $position = ! empty($params['pos']) ? (int) $params['pos'] : 0; @@ -105,7 +106,7 @@ class BinlogController extends AbstractController $values[] = $value; } - return $this->template->render('server/binlog/index', [ + $this->response->addHTML($this->template->render('server/binlog/index', [ 'url_params' => $urlParams, 'binary_logs' => $this->binaryLogs, 'log' => $params['log'], @@ -119,7 +120,7 @@ class BinlogController extends AbstractController 'has_icons' => Util::showIcons('TableNavigationLinksMode'), 'is_full_query' => $isFullQuery, 'image_path' => $pmaThemeImage, - ]); + ])); } /** diff --git a/libraries/classes/Controllers/Server/CollationsController.php b/libraries/classes/Controllers/Server/CollationsController.php index 4df33bd0e9..7472e156d4 100644 --- a/libraries/classes/Controllers/Server/CollationsController.php +++ b/libraries/classes/Controllers/Server/CollationsController.php @@ -54,12 +54,7 @@ class CollationsController extends AbstractController ); } - /** - * Index action - * - * @return string HTML - */ - public function index(): string + public function index(): void { Common::server(); @@ -83,8 +78,8 @@ class CollationsController extends AbstractController ]; } - return $this->template->render('server/collations/index', [ + $this->response->addHTML($this->template->render('server/collations/index', [ 'charsets' => $charsets, - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/DatabasesController.php b/libraries/classes/Controllers/Server/DatabasesController.php index dc63d9fc04..b378c52f96 100644 --- a/libraries/classes/Controllers/Server/DatabasesController.php +++ b/libraries/classes/Controllers/Server/DatabasesController.php @@ -67,18 +67,18 @@ class DatabasesController extends AbstractController $checkUserPrivileges->getPrivileges(); } - /** - * Index action - * - * @param array $params Request parameters - * - * @return string HTML - */ - public function index(array $params): string + public function index(): void { global $cfg, $server, $dblist, $is_create_db_priv; global $replication_info, $db_to_create, $pmaThemeImage, $text_dir; + $params = [ + 'statistics' => $_REQUEST['statistics'] ?? null, + 'pos' => $_REQUEST['pos'] ?? null, + 'sort_by' => $_REQUEST['sort_by'] ?? null, + 'sort_order' => $_REQUEST['sort_order'] ?? null, + ]; + $header = $this->response->getHeader(); $scripts = $header->getScripts(); $scripts->addFile('server/databases.js'); @@ -141,7 +141,7 @@ class DatabasesController extends AbstractController $headerStatistics = $this->getStatisticsColumns(); - return $this->template->render('server/databases/index', [ + $this->response->addHTML($this->template->render('server/databases/index', [ 'is_create_database_shown' => $cfg['ShowCreateDb'], 'has_create_database_privileges' => $is_create_db_priv, 'has_statistics' => $this->hasStatistics, @@ -159,22 +159,21 @@ class DatabasesController extends AbstractController 'is_drop_allowed' => $this->dbi->isSuperuser() || $cfg['AllowUserDropDatabase'], 'pma_theme_image' => $pmaThemeImage, 'text_dir' => $text_dir, - ]); + ])); } - /** - * Handles creating a new database - * - * @param array $params Request parameters - * - * @return array JSON - */ - public function create(array $params): array + public function create(): void { global $cfg, $db; + $params = [ + 'new_db' => $_POST['new_db'] ?? null, + 'db_collation' => $_POST['db_collation'] ?? null, + ]; + if (! isset($params['new_db']) || mb_strlen($params['new_db']) === 0 || ! $this->response->isAjax()) { - return ['message' => Message::error()]; + $this->response->addJSON(['message' => Message::error()]); + return; } // lower_case_table_names=1 `DB` becomes `db` @@ -238,20 +237,21 @@ class DatabasesController extends AbstractController ]; } - return $json; + $this->response->addJSON($json); } /** * Handles dropping multiple databases - * - * @param array $params Request parameters - * - * @return array JSON */ - public function destroy(array $params): array + public function destroy(): void { global $submit_mult, $mult_btn, $selected, $err_url, $cfg; + $params = [ + 'drop_selected_dbs' => $_POST['drop_selected_dbs'] ?? null, + 'selected_dbs' => $_POST['selected_dbs'] ?? null, + ]; + if (! isset($params['drop_selected_dbs']) || ! $this->response->isAjax() || (! $this->dbi->isSuperuser() && ! $cfg['AllowUserDropDatabase']) @@ -288,7 +288,7 @@ class DatabasesController extends AbstractController $this->response->setRequestStatus($message->isSuccess()); } - return $json; + $this->response->addJSON($json); } /** diff --git a/libraries/classes/Controllers/Server/EnginesController.php b/libraries/classes/Controllers/Server/EnginesController.php index 6569a31baa..2dcd9cc798 100644 --- a/libraries/classes/Controllers/Server/EnginesController.php +++ b/libraries/classes/Controllers/Server/EnginesController.php @@ -15,16 +15,13 @@ use PhpMyAdmin\StorageEngine; */ class EnginesController extends AbstractController { - /** - * Index action - */ - public function index(): string + public function index(): void { Common::server(); - return $this->template->render('server/engines/index', [ + $this->response->addHTML($this->template->render('server/engines/index', [ 'engines' => StorageEngine::getStorageEngines(), - ]); + ])); } /** @@ -32,7 +29,7 @@ class EnginesController extends AbstractController * * @param array $params Request params */ - public function show(array $params): string + public function show(array $params): void { Common::server(); @@ -53,9 +50,9 @@ class EnginesController extends AbstractController ]; } - return $this->template->render('server/engines/show', [ + $this->response->addHTML($this->template->render('server/engines/show', [ 'engine' => $engine, 'page' => $page, - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/PluginsController.php b/libraries/classes/Controllers/Server/PluginsController.php index e4fe407345..793df66419 100644 --- a/libraries/classes/Controllers/Server/PluginsController.php +++ b/libraries/classes/Controllers/Server/PluginsController.php @@ -38,10 +38,7 @@ class PluginsController extends AbstractController $this->plugins = $plugins; } - /** - * Index action - */ - public function index(): string + public function index(): void { Common::server(); @@ -65,9 +62,10 @@ class PluginsController extends AbstractController mb_strtolower($type) ); } - return $this->template->render('server/plugins/index', [ + + $this->response->addHTML($this->template->render('server/plugins/index', [ 'plugins' => $plugins, 'clean_types' => $cleanTypes, - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/ReplicationController.php b/libraries/classes/Controllers/Server/ReplicationController.php index a876ea976e..75829bcf11 100644 --- a/libraries/classes/Controllers/Server/ReplicationController.php +++ b/libraries/classes/Controllers/Server/ReplicationController.php @@ -35,13 +35,17 @@ class ReplicationController extends AbstractController $this->replicationGui = $replicationGui; } - /** - * @param array $params Request parameters - */ - public function index(array $params): string + public function index(): void { global $replication_info, $server_slave_replication, $url_params; + $params = [ + 'url_params' => $_POST['url_params'] ?? null, + 'mr_configure' => $_POST['mr_configure'] ?? null, + 'sl_configure' => $_POST['sl_configure'] ?? null, + 'repl_clear_scr' => $_POST['repl_clear_scr'] ?? null, + ]; + Common::server(); ReplicationInfo::load(); @@ -79,7 +83,7 @@ class ReplicationController extends AbstractController } } - return $this->template->render('server/replication/index', [ + $this->response->addHTML($this->template->render('server/replication/index', [ 'url_params' => $url_params, 'is_super_user' => $this->dbi->isSuperuser(), 'error_messages' => $errorMessages, @@ -91,6 +95,6 @@ class ReplicationController extends AbstractController 'master_configuration_html' => $masterConfigurationHtml ?? '', 'slave_configuration_html' => $slaveConfigurationHtml ?? '', 'change_master_html' => $changeMasterHtml ?? '', - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/SqlController.php b/libraries/classes/Controllers/Server/SqlController.php index 85d21f92d8..e1c44c60af 100644 --- a/libraries/classes/Controllers/Server/SqlController.php +++ b/libraries/classes/Controllers/Server/SqlController.php @@ -34,10 +34,7 @@ class SqlController extends AbstractController $this->sqlQueryForm = $sqlQueryForm; } - /** - * @return string HTML - */ - public function index(): string + public function index(): void { $header = $this->response->getHeader(); $scripts = $header->getScripts(); @@ -49,6 +46,6 @@ class SqlController extends AbstractController Common::server(); - return $this->sqlQueryForm->getHtml(); + $this->response->addHTML($this->sqlQueryForm->getHtml()); } } diff --git a/libraries/classes/Controllers/Server/Status/AdvisorController.php b/libraries/classes/Controllers/Server/Status/AdvisorController.php index 944597b04c..9d8fd694d9 100644 --- a/libraries/classes/Controllers/Server/Status/AdvisorController.php +++ b/libraries/classes/Controllers/Server/Status/AdvisorController.php @@ -34,7 +34,7 @@ class AdvisorController extends AbstractController $this->advisor = $advisor; } - public function index(): string + public function index(): void { $scripts = $this->response->getHeader()->getScripts(); $scripts->addFile('server/status/advisor.js'); @@ -44,8 +44,8 @@ class AdvisorController extends AbstractController $data = json_encode($this->advisor->run()); } - return $this->template->render('server/status/advisor/index', [ + $this->response->addHTML($this->template->render('server/status/advisor/index', [ 'data' => $data, - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/Status/MonitorController.php b/libraries/classes/Controllers/Server/Status/MonitorController.php index 24a9a781a8..6da1a0904c 100644 --- a/libraries/classes/Controllers/Server/Status/MonitorController.php +++ b/libraries/classes/Controllers/Server/Status/MonitorController.php @@ -34,10 +34,7 @@ class MonitorController extends AbstractController $this->monitor = $monitor; } - /** - * @return string HTML - */ - public function index(): string + public function index(): void { Common::server(); @@ -71,121 +68,115 @@ class MonitorController extends AbstractController } } - return $this->template->render('server/status/monitor/index', [ + $this->response->addHTML($this->template->render('server/status/monitor/index', [ 'image_path' => $GLOBALS['pmaThemeImage'], 'javascript_variable_names' => $javascriptVariableNames, 'form' => $form, + ])); + } + + public function chartingData(): void + { + $params = ['requiredData' => $_POST['requiredData'] ?? null]; + + Common::server(); + + if (! $this->response->isAjax()) { + return; + } + + $this->response->addJSON([ + 'message' => $this->monitor->getJsonForChartingData( + $params['requiredData'] ?? '' + ), ]); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function chartingData(array $params): array + public function logDataTypeSlow(): void { + $params = [ + 'time_start' => $_POST['time_start'] ?? null, + 'time_end' => $_POST['time_end'] ?? null, + ]; + Common::server(); if (! $this->response->isAjax()) { - return []; + return; } - $json = []; - $json['message'] = $this->monitor->getJsonForChartingData( - $params['requiredData'] ?? '' - ); - - return $json; + $this->response->addJSON([ + 'message' => $this->monitor->getJsonForLogDataTypeSlow( + (int) $params['time_start'], + (int) $params['time_end'] + ), + ]); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function logDataTypeSlow(array $params): array + public function logDataTypeGeneral(): void { + $params = [ + 'time_start' => $_POST['time_start'] ?? null, + 'time_end' => $_POST['time_end'] ?? null, + 'limitTypes' => $_POST['limitTypes'] ?? null, + 'removeVariables' => $_POST['removeVariables'] ?? null, + ]; + Common::server(); if (! $this->response->isAjax()) { - return []; + return; } - $json = []; - $json['message'] = $this->monitor->getJsonForLogDataTypeSlow( - (int) $params['time_start'], - (int) $params['time_end'] - ); - - return $json; + $this->response->addJSON([ + 'message' => $this->monitor->getJsonForLogDataTypeGeneral( + (int) $params['time_start'], + (int) $params['time_end'], + (bool) $params['limitTypes'], + (bool) $params['removeVariables'] + ), + ]); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function logDataTypeGeneral(array $params): array + public function loggingVars(): void { + $params = [ + 'varName' => $_POST['varName'] ?? null, + 'varValue' => $_POST['varValue'] ?? null, + ]; + Common::server(); if (! $this->response->isAjax()) { - return []; + return; } - $json = []; - $json['message'] = $this->monitor->getJsonForLogDataTypeGeneral( - (int) $params['time_start'], - (int) $params['time_end'], - (bool) $params['limitTypes'], - (bool) $params['removeVariables'] - ); - - return $json; + $this->response->addJSON([ + 'message' => $this->monitor->getJsonForLoggingVars( + $params['varName'], + $params['varValue'] + ), + ]); } - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function loggingVars(array $params): array + public function queryAnalyzer(): void { + $params = [ + 'database' => $_POST['database'] ?? null, + 'query' => $_POST['query'] ?? null, + ]; + Common::server(); if (! $this->response->isAjax()) { - return []; + return; } - $json = []; - $json['message'] = $this->monitor->getJsonForLoggingVars( - $params['varName'], - $params['varValue'] - ); - - return $json; - } - - /** - * @param array $params Request parameters - * - * @return array JSON - */ - public function queryAnalyzer(array $params): array - { - Common::server(); - - if (! $this->response->isAjax()) { - return []; - } - - $json = []; - $json['message'] = $this->monitor->getJsonForQueryAnalyzer( - $params['database'] ?? '', - $params['query'] ?? '' - ); - - return $json; + $this->response->addJSON([ + 'message' => $this->monitor->getJsonForQueryAnalyzer( + $params['database'] ?? '', + $params['query'] ?? '' + ), + ]); } } diff --git a/libraries/classes/Controllers/Server/Status/ProcessesController.php b/libraries/classes/Controllers/Server/Status/ProcessesController.php index 0d25df01a4..b03c688e4f 100644 --- a/libraries/classes/Controllers/Server/Status/ProcessesController.php +++ b/libraries/classes/Controllers/Server/Status/ProcessesController.php @@ -18,11 +18,16 @@ use function ucfirst; class ProcessesController extends AbstractController { - /** - * @param array $params Request parameters - */ - public function index(array $params): string + public function index(): void { + $params = [ + 'showExecuting' => $_POST['showExecuting'] ?? null, + 'full' => $_POST['full'] ?? null, + 'column_name' => $_POST['column_name'] ?? null, + 'order_by_field' => $_POST['order_by_field'] ?? null, + 'sort_order' => $_POST['sort_order'] ?? null, + ]; + Common::server(); $header = $this->response->getHeader(); @@ -44,36 +49,40 @@ class ProcessesController extends AbstractController $serverProcessList = $this->getList($params); - return $this->template->render('server/status/processes/index', [ + $this->response->addHTML($this->template->render('server/status/processes/index', [ 'url_params' => $urlParams, 'is_checked' => $isChecked, 'server_process_list' => $serverProcessList, - ]); + ])); } /** * Only sends the process list table - * - * @param array $params Request parameters */ - public function refresh(array $params): string + public function refresh(): void { + $params = [ + 'showExecuting' => $_POST['showExecuting'] ?? null, + 'full' => $_POST['full'] ?? null, + 'column_name' => $_POST['column_name'] ?? null, + 'order_by_field' => $_POST['order_by_field'] ?? null, + 'sort_order' => $_POST['sort_order'] ?? null, + ]; + if (! $this->response->isAjax()) { - return ''; + return; } - return $this->getList($params); + $this->response->addHTML($this->getList($params)); } /** * @param array $params Request parameters - * - * @return array */ - public function kill(array $params): array + public function kill(array $params): void { if (! $this->response->isAjax()) { - return []; + return; } $kill = (int) $params['id']; @@ -95,10 +104,7 @@ class ProcessesController extends AbstractController } $message->addParam($kill); - $json = []; - $json['message'] = $message; - - return $json; + $this->response->addJSON(['message' => $message]); } /** diff --git a/libraries/classes/Controllers/Server/Status/QueriesController.php b/libraries/classes/Controllers/Server/Status/QueriesController.php index 0475f38bae..86c24c5d82 100644 --- a/libraries/classes/Controllers/Server/Status/QueriesController.php +++ b/libraries/classes/Controllers/Server/Status/QueriesController.php @@ -14,10 +14,7 @@ use function str_replace; class QueriesController extends AbstractController { - /** - * @return string HTML - */ - public function index(): string + public function index(): void { Common::server(); @@ -77,11 +74,11 @@ class QueriesController extends AbstractController } } - return $this->template->render('server/status/queries/index', [ + $this->response->addHTML($this->template->render('server/status/queries/index', [ 'is_data_loaded' => $this->data->dataLoaded, 'stats' => $stats ?? null, 'queries' => $queries ?? [], 'chart' => $chart ?? [], - ]); + ])); } } diff --git a/libraries/classes/Controllers/Server/Status/StatusController.php b/libraries/classes/Controllers/Server/Status/StatusController.php index 8495ad514b..262deda334 100644 --- a/libraries/classes/Controllers/Server/Status/StatusController.php +++ b/libraries/classes/Controllers/Server/Status/StatusController.php @@ -36,7 +36,7 @@ class StatusController extends AbstractController $this->replicationGui = $replicationGui; } - public function index(): string + public function index(): void { global $replication_info; @@ -69,7 +69,7 @@ class StatusController extends AbstractController } } - return $this->template->render('server/status/status/index', [ + $this->response->addHTML($this->template->render('server/status/status/index', [ 'is_data_loaded' => $this->data->dataLoaded, 'network_traffic' => $networkTraffic ?? null, 'uptime' => $uptime ?? null, @@ -79,7 +79,7 @@ class StatusController extends AbstractController 'is_master' => $replication_info['master']['status'], 'is_slave' => $replication_info['slave']['status'], 'replication' => $replication, - ]); + ])); } private function getStartTime(): int diff --git a/libraries/classes/Controllers/Server/Status/VariablesController.php b/libraries/classes/Controllers/Server/Status/VariablesController.php index 1d19eba9de..e6d5d8c317 100644 --- a/libraries/classes/Controllers/Server/Status/VariablesController.php +++ b/libraries/classes/Controllers/Server/Status/VariablesController.php @@ -14,13 +14,16 @@ use function mb_strpos; class VariablesController extends AbstractController { - /** - * @param array $params Request parameters - * - * @return string HTML - */ - public function index(array $params): string + public function index(): void { + $params = [ + 'flush' => $_POST['flush'] ?? null, + 'filterAlert' => $_POST['filterAlert'] ?? null, + 'filterText' => $_POST['filterText'] ?? null, + 'filterCategory' => $_POST['filterCategory'] ?? null, + 'dontFormat' => $_POST['dontFormat'] ?? null, + ]; + Common::server(); $header = $this->response->getHeader(); @@ -102,7 +105,7 @@ class VariablesController extends AbstractController } } - return $this->template->render('server/status/variables/index', [ + $this->response->addHTML($this->template->render('server/status/variables/index', [ 'is_data_loaded' => $this->data->dataLoaded, 'filter_text' => ! empty($params['filterText']) ? $params['filterText'] : '', 'is_only_alerts' => ! empty($params['filterAlert']), @@ -110,7 +113,7 @@ class VariablesController extends AbstractController 'categories' => $categories ?? [], 'links' => $links ?? [], 'variables' => $variables ?? [], - ]); + ])); } /** diff --git a/libraries/classes/Controllers/Server/VariablesController.php b/libraries/classes/Controllers/Server/VariablesController.php index c987e03530..e970b8035d 100644 --- a/libraries/classes/Controllers/Server/VariablesController.php +++ b/libraries/classes/Controllers/Server/VariablesController.php @@ -29,13 +29,10 @@ use function trim; */ class VariablesController extends AbstractController { - /** - * Index action - * - * @param array $params Request parameters - */ - public function index(array $params): string + public function index(): void { + $params = ['filter' => $_GET['filter'] ?? null]; + Common::server(); $filterValue = ! empty($params['filter']) ? $params['filter'] : ''; @@ -89,25 +86,23 @@ class VariablesController extends AbstractController } } - return $this->template->render('server/variables/index', [ + $this->response->addHTML($this->template->render('server/variables/index', [ 'variables' => $variables, 'filter_value' => $filterValue, 'is_superuser' => $this->dbi->isSuperuser(), 'is_mariadb' => $this->dbi->isMariaDB(), - ]); + ])); } /** * Handle the AJAX request for a single variable value * * @param array $params Request parameters - * - * @return array */ - public function getValue(array $params): array + public function getValue(array $params): void { if (! $this->response->isAjax()) { - return []; + return; } // Send with correct charset @@ -135,20 +130,23 @@ class VariablesController extends AbstractController $json['message'] = $varValue[1]; } - return $json; + $this->response->addJSON($json); } /** * Handle the AJAX request for setting value for a single variable * - * @param array $params Request parameters - * - * @return array + * @param array $vars Request parameters */ - public function setValue(array $params): array + public function setValue(array $vars): void { + $params = [ + 'varName' => $vars['name'], + 'varValue' => $_POST['varValue'] ?? null, + ]; + if (! $this->response->isAjax()) { - return []; + return; } $value = $params['varValue']; @@ -211,7 +209,7 @@ class VariablesController extends AbstractController $json['error'] = __('Setting variable failed'); } - return $json; + $this->response->addJSON($json); } /** diff --git a/libraries/classes/Controllers/ThemesController.php b/libraries/classes/Controllers/ThemesController.php index 8f98b12ae1..82b04bd42e 100644 --- a/libraries/classes/Controllers/ThemesController.php +++ b/libraries/classes/Controllers/ThemesController.php @@ -11,7 +11,7 @@ use function preg_replace; */ class ThemesController extends AbstractController { - public function index(): string + public function index(): void { $this->response->getFooter()->setMinimal(); $header = $this->response->getHeader(); @@ -19,13 +19,13 @@ class ThemesController extends AbstractController $header->setTitle('phpMyAdmin - ' . __('Theme')); $header->disableMenuAndConsole(); - return $this->template->render('themes', [ + $this->response->addHTML($this->template->render('themes', [ 'version' => preg_replace( '/([0-9]*)\.([0-9]*)\..*/', '\1_\2', PMA_VERSION ), 'previews' => ThemeManager::getInstance()->getPrintPreviews(), - ]); + ])); } } diff --git a/libraries/classes/Controllers/TransformationOverviewController.php b/libraries/classes/Controllers/TransformationOverviewController.php index c50660418b..a8dba9274e 100644 --- a/libraries/classes/Controllers/TransformationOverviewController.php +++ b/libraries/classes/Controllers/TransformationOverviewController.php @@ -33,10 +33,7 @@ class TransformationOverviewController extends AbstractController $this->transformations = $transformations; } - /** - * @return string HTML - */ - public function index(): string + public function index(): void { $header = $this->response->getHeader(); $header->disableMenuAndConsole(); @@ -67,9 +64,9 @@ class TransformationOverviewController extends AbstractController } } - return $this->template->render('transformation_overview', [ + $this->response->addHTML($this->template->render('transformation_overview', [ 'mime_types' => $mimeTypes, 'transformations' => $transformations, - ]); + ])); } } diff --git a/libraries/classes/Database/MultiTableQuery.php b/libraries/classes/Database/MultiTableQuery.php index 8da874dac6..b5e1ac5b89 100644 --- a/libraries/classes/Database/MultiTableQuery.php +++ b/libraries/classes/Database/MultiTableQuery.php @@ -112,7 +112,7 @@ class MultiTableQuery { list(,$db,) = ParseAnalyze::sqlQuery($sqlQuery, $db); - $goto = Url::getFromRoute('/database/multi_table_query'); + $goto = Url::getFromRoute('/database/multi-table-query'); $sql = new Sql(); $sql->executeQueryAndSendQueryResponse( null, // analyzed_sql_results diff --git a/libraries/classes/Menu.php b/libraries/classes/Menu.php index ef6eada6ac..2e91f8e856 100644 --- a/libraries/classes/Menu.php +++ b/libraries/classes/Menu.php @@ -411,8 +411,8 @@ class Menu $tabs['query']['text'] = __('Query'); $tabs['query']['icon'] = 's_db'; - $tabs['query']['route'] = '/database/multi_table_query'; - $tabs['query']['active'] = $route === '/database/multi_table_query' || $route === '/database/qbe'; + $tabs['query']['route'] = '/database/multi-table-query'; + $tabs['query']['active'] = $route === '/database/multi-table-query' || $route === '/database/qbe'; if ($num_tables == 0) { $tabs['query']['warning'] = __('Database seems to be empty!'); } diff --git a/libraries/routes.php b/libraries/routes.php index 4c1acc8e77..005aad20ac 100644 --- a/libraries/routes.php +++ b/libraries/routes.php @@ -1,7 +1,5 @@ get(Response::class); - -return function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->addGroup('', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var HomeController $controller */ - $controller = $containerBuilder->get(HomeController::class); - $routes->addRoute(['GET', 'POST'], '[/]', function () use ($response, $controller) { - $response->addHTML($controller->index(['access_time' => $_REQUEST['access_time'] ?? null])); - }); - $routes->post('/set-theme', function () use ($controller) { - $controller->setTheme(['set_theme' => $_POST['set_theme']]); - }); - $routes->post('/collation-connection', function () use ($controller) { - $controller->setCollationConnection(['collation_connection' => $_POST['collation_connection']]); - }); - $routes->addRoute(['GET', 'POST'], '/recent-table', function () use ($response, $controller) { - $response->addJSON($controller->reloadRecentTablesList()); - }); - $routes->addRoute(['GET', 'POST'], '/git-revision', function () use ($response, $controller) { - $response->addHTML($controller->gitRevision()); - }); +return function (RouteCollector $routes) { + $routes->addGroup('', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '[/]', [HomeController::class, 'index']); + $routes->post('/set-theme', [HomeController::class, 'setTheme']); + $routes->post('/collation-connection', [HomeController::class, 'setCollationConnection']); + $routes->addRoute(['GET', 'POST'], '/recent-table', [HomeController::class, 'reloadRecentTablesList']); + $routes->addRoute(['GET', 'POST'], '/git-revision', [HomeController::class, 'gitRevision']); }); - $routes->addGroup('/ajax', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var AjaxController $controller */ - $controller = $containerBuilder->get(AjaxController::class); - $routes->post('/list-databases', function () use ($response, $controller) { - $response->addJSON($controller->databases()); - }); - $routes->post('/list-tables/{database}', function (array $vars) use ($response, $controller) { - $response->addJSON($controller->tables($vars)); - }); - $routes->post('/list-columns/{database}/{table}', function (array $vars) use ($response, $controller) { - $response->addJSON($controller->columns($vars)); - }); - $routes->post('/config-get', function () use ($response, $controller) { - $response->addJSON($controller->getConfig([ - 'key' => $_POST['key'] ?? null, - ])); - }); - $routes->post('/config-set', function () use ($response, $controller) { - $response->addJSON($controller->setConfig([ - 'key' => $_POST['key'] ?? null, - 'value' => $_POST['value'] ?? null, - ])); - }); + $routes->addGroup('/ajax', function (RouteCollector $routes) { + $routes->post('/list-databases', [AjaxController::class, 'databases']); + $routes->post('/list-tables', [AjaxController::class, 'tables']); + $routes->post('/list-columns', [AjaxController::class, 'columns']); + $routes->post('/config-get', [AjaxController::class, 'getConfig']); + $routes->post('/config-set', [AjaxController::class, 'setConfig']); }); - $routes->addRoute(['GET', 'POST'], '/browse-foreigners', function () use ($containerBuilder, $response) { - /** @var BrowseForeignersController $controller */ - $controller = $containerBuilder->get(BrowseForeignersController::class); - $response->addHTML($controller->index([ - 'db' => $_POST['db'] ?? null, - 'table' => $_POST['table'] ?? null, - 'field' => $_POST['field'] ?? null, - 'fieldkey' => $_POST['fieldkey'] ?? null, - 'data' => $_POST['data'] ?? null, - 'foreign_showAll' => $_POST['foreign_showAll'] ?? null, - 'foreign_filter' => $_POST['foreign_filter'] ?? null, - ])); + $routes->addRoute(['GET', 'POST'], '/browse-foreigners', [BrowseForeignersController::class, 'index']); + $routes->get('/changelog', [ChangeLogController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/check-relations', [CheckRelationsController::class, 'index']); + $routes->addGroup('/database', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/central-columns', [CentralColumnsController::class, 'index']); + $routes->get('/data-dictionary', [DataDictionaryController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/designer', [DesignerController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/events', [EventsController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/export', [DatabaseExportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import', [DatabaseImportController::class, 'index']); + $routes->addGroup('/multi-table-query', function (RouteCollector $routes) { + $routes->get('', [MultiTableQueryController::class, 'index']); + $routes->get('/tables', [MultiTableQueryController::class, 'table']); + $routes->post('/query', [MultiTableQueryController::class, 'displayResults']); + }); + $routes->addRoute(['GET', 'POST'], '/operations', [OperationsController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/qbe', [QueryByExampleController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/routines', [RoutinesController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/search', [SearchController::class, 'index']); + $routes->addGroup('/sql', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '', [DatabaseSqlController::class, 'index']); + $routes->post('/autocomplete', [SqlAutoCompleteController::class, 'index']); + $routes->post('/format', [SqlFormatController::class, 'index']); + }); + $routes->addGroup('/structure', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '', [StructureController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/favorite-table', [StructureController::class, 'addRemoveFavoriteTablesAction']); + $routes->addRoute(['GET', 'POST'], '/real-row-count', [StructureController::class, 'handleRealRowCountRequestAction']); + }); + $routes->addRoute(['GET', 'POST'], '/tracking', [TrackingController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/triggers', [TriggersController::class, 'index']); }); - $routes->get('/changelog', function () use ($containerBuilder) { - /** @var ChangeLogController $controller */ - $controller = $containerBuilder->get(ChangeLogController::class); - $controller->index(); + $routes->addRoute(['GET', 'POST'], '/error-report', [ErrorReportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/export', [ExportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/gis-data-editor', [GisDataEditorController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import', [ImportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import-status', [ImportStatusController::class, 'index']); + $routes->get('/license', [LicenseController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/lint', [LintController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/logout', [LogoutController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/navigation', [NavigationController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/normalization', [NormalizationController::class, 'index']); + $routes->get('/phpinfo', [PhpInfoController::class, 'index']); + $routes->addGroup('/preferences', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/export', [PreferencesExportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/features', [FeaturesController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import', [PreferencesImportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/main-panel', [MainPanelController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/manage', [ManageController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/navigation', [PreferencesNavigationController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/sql', [PreferencesSqlController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/two-factor', [TwoFactorController::class, 'index']); }); - $routes->addRoute(['GET', 'POST'], '/check-relations', function () use ($containerBuilder, $response) { - /** @var CheckRelationsController $controller */ - $controller = $containerBuilder->get(CheckRelationsController::class); - $response->addHTML($controller->index([ - 'create_pmadb' => $_POST['create_pmadb'] ?? null, - 'fixall_pmadb' => $_POST['fixall_pmadb'] ?? null, - 'fix_pmadb' => $_POST['fix_pmadb'] ?? null, - ])); - }); - $routes->addGroup('/database', function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->addRoute(['GET', 'POST'], '/central-columns', function () use ($containerBuilder) { - /** @var CentralColumnsController $controller */ - $controller = $containerBuilder->get(CentralColumnsController::class); - $controller->index(); + $routes->addRoute(['GET', 'POST'], '/schema-export', [SchemaExportController::class, 'index']); + $routes->addGroup('/server', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/binlog', [BinlogController::class, 'index']); + $routes->get('/collations', [CollationsController::class, 'index']); + $routes->addGroup('/databases', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '', [DatabasesController::class, 'index']); + $routes->post('/create', [DatabasesController::class, 'create']); + $routes->post('/destroy', [DatabasesController::class, 'destroy']); }); - $routes->get('/data-dictionary/{database}', function (array $vars) use ($containerBuilder, $response) { - /** @var DataDictionaryController $controller */ - $controller = $containerBuilder->get(DataDictionaryController::class); - $response->addHTML($controller->index($vars)); + $routes->addGroup('/engines', function (RouteCollector $routes) { + $routes->get('', [EnginesController::class, 'index']); + $routes->get('/{engine}[/{page}]', [EnginesController::class, 'show']); }); - $routes->addRoute(['GET', 'POST'], '/designer', function () use ($containerBuilder) { - /** @var DesignerController $controller */ - $controller = $containerBuilder->get(DesignerController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/events', function () use ($containerBuilder) { - /** @var EventsController $controller */ - $controller = $containerBuilder->get(EventsController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/export', function () use ($containerBuilder) { - /** @var DatabaseExportController $controller */ - $controller = $containerBuilder->get(DatabaseExportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/import', function () use ($containerBuilder) { - /** @var DatabaseImportController $controller */ - $controller = $containerBuilder->get(DatabaseImportController::class); - $controller->index(); - }); - $routes->addGroup('/multi_table_query', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var MultiTableQueryController $controller */ - $controller = $containerBuilder->get(MultiTableQueryController::class); - $routes->get('', function () use ($response, $controller) { - $response->addHTML($controller->index()); + $routes->addRoute(['GET', 'POST'], '/export', [ServerExportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import', [ServerImportController::class, 'index']); + $routes->get('/plugins', [PluginsController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/privileges', [PrivilegesController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/replication', [ReplicationController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/sql', [ServerSqlController::class, 'index']); + $routes->addGroup('/status', function (RouteCollector $routes) { + $routes->get('', [StatusController::class, 'index']); + $routes->get('/advisor', [AdvisorController::class, 'index']); + $routes->addGroup('/monitor', function (RouteCollector $routes) { + $routes->get('', [MonitorController::class, 'index']); + $routes->post('/chart', [MonitorController::class, 'chartingData']); + $routes->post('/slow-log', [MonitorController::class, 'logDataTypeSlow']); + $routes->post('/general-log', [MonitorController::class, 'logDataTypeGeneral']); + $routes->post('/log-vars', [MonitorController::class, 'loggingVars']); + $routes->post('/query', [MonitorController::class, 'queryAnalyzer']); }); - $routes->get('/tables', function () use ($response, $controller) { - $response->addJSON($controller->table([ - 'tables' => $_GET['tables'], - 'db' => $_GET['db'] ?? null, - ])); - }); - $routes->post('/query', function () use ($controller) { - $controller->displayResults([ - 'sql_query' => $_POST['sql_query'], - 'db' => $_POST['db'] ?? $_GET['db'] ?? null, - ]); + $routes->addGroup('/processes', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '', [ProcessesController::class, 'index']); + $routes->post('/refresh', [ProcessesController::class, 'refresh']); + $routes->post('/kill/{id:\d+}', [ProcessesController::class, 'kill']); }); + $routes->get('/queries', [QueriesController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/variables', [StatusVariables::class, 'index']); }); - $routes->addRoute(['GET', 'POST'], '/operations', function () use ($containerBuilder) { - /** @var OperationsController $controller */ - $controller = $containerBuilder->get(OperationsController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/qbe', function () use ($containerBuilder) { - /** @var QueryByExampleController $controller */ - $controller = $containerBuilder->get(QueryByExampleController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/routines', function () use ($containerBuilder) { - /** @var RoutinesController $controller */ - $controller = $containerBuilder->get(RoutinesController::class); - $controller->index([ - 'type' => $_REQUEST['type'] ?? null, - ]); - }); - $routes->addRoute(['GET', 'POST'], '/search', function () use ($containerBuilder) { - /** @var SearchController $controller */ - $controller = $containerBuilder->get(SearchController::class); - $controller->index(); - }); - $routes->addGroup('/sql', function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->addRoute(['GET', 'POST'], '', function () use ($containerBuilder) { - /** @var DatabaseSqlController $controller */ - $controller = $containerBuilder->get(DatabaseSqlController::class); - $controller->index(); - }); - $routes->post('/autocomplete', function () use ($containerBuilder, $response) { - /** @var SqlAutoCompleteController $controller */ - $controller = $containerBuilder->get(SqlAutoCompleteController::class); - $response->addJSON($controller->index()); - }); - $routes->post('/format', function () use ($containerBuilder, $response) { - /** @var SqlFormatController $controller */ - $controller = $containerBuilder->get(SqlFormatController::class); - $response->addJSON($controller->index(['sql' => $_POST['sql'] ?? null])); - }); - }); - $routes->addGroup('/structure', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var StructureController $controller */ - $controller = $containerBuilder->get(StructureController::class); - $routes->addRoute(['GET', 'POST'], '', function () use ($response, $controller) { - $response->addHTML($controller->index([ - 'submit_mult' => $_POST['submit_mult'] ?? null, - 'selected_tbl' => $_POST['selected_tbl'] ?? null, - 'mult_btn' => $_POST['mult_btn'] ?? null, - 'sort' => $_REQUEST['sort'] ?? null, - 'sort_order' => $_REQUEST['sort_order'] ?? null, - ])); - }); - $routes->addRoute(['GET', 'POST'], '/favorite-table', function () use ($response, $controller) { - $response->addJSON($controller->addRemoveFavoriteTablesAction([ - 'favorite_table' => $_REQUEST['favorite_table'] ?? null, - 'favoriteTables' => $_REQUEST['favoriteTables'] ?? null, - 'sync_favorite_tables' => $_REQUEST['sync_favorite_tables'] ?? null, - 'add_favorite' => $_REQUEST['add_favorite'] ?? null, - 'remove_favorite' => $_REQUEST['remove_favorite'] ?? null, - ])); - }); - $routes->addRoute(['GET', 'POST'], '/real-row-count', function () use ($response, $controller) { - $response->addJSON($controller->handleRealRowCountRequestAction([ - 'real_row_count_all' => $_REQUEST['real_row_count_all'] ?? null, - 'table' => $_REQUEST['table'] ?? null, - ])); - }); - }); - $routes->addRoute(['GET', 'POST'], '/tracking', function () use ($containerBuilder) { - /** @var TrackingController $controller */ - $controller = $containerBuilder->get(TrackingController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/triggers', function () use ($containerBuilder) { - /** @var TriggersController $controller */ - $controller = $containerBuilder->get(TriggersController::class); - $controller->index(); + $routes->addRoute(['GET', 'POST'], '/user-groups', [UserGroupsController::class, 'index']); + $routes->addGroup('/variables', function (RouteCollector $routes) { + $routes->get('', [VariablesController::class, 'index']); + $routes->get('/get/{name}', [VariablesController::class, 'getValue']); + $routes->post('/set/{name}', [VariablesController::class, 'setValue']); }); }); - $routes->addRoute(['GET', 'POST'], '/error-report', function () use ($containerBuilder) { - /** @var ErrorReportController $controller */ - $controller = $containerBuilder->get(ErrorReportController::class); - $controller->index(); + $routes->addGroup('/sql', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '', [SqlController::class, 'index']); + $routes->post('/get-relational-values', [SqlController::class, 'getRelationalValues']); + $routes->post('/get-enum-values', [SqlController::class, 'getEnumValues']); + $routes->post('/get-set-values', [SqlController::class, 'getSetValues']); + $routes->get('/get-default-fk-check-value', [SqlController::class, 'getDefaultForeignKeyCheckValue']); + $routes->post('/set-column-preferences', [SqlController::class, 'setColumnOrderOrVisibility']); }); - $routes->addRoute(['GET', 'POST'], '/export', function () use ($containerBuilder) { - /** @var ExportController $controller */ - $controller = $containerBuilder->get(ExportController::class); - $controller->index(); + $routes->addGroup('/table', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/add-field', [AddFieldController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/change', [ChangeController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/chart', [ChartController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/create', [CreateController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/export', [TableExportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/find-replace', [FindReplaceController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/get-field', [GetFieldController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/gis-visualization', [GisVisualizationController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/import', [TableImportController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/indexes', [IndexesController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/operations', [TableOperationsController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/recent-favorite', [RecentFavoriteController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/relation', [RelationController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/replace', [ReplaceController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/row-action', [RowActionController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/search', [TableSearchController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/sql', [TableSqlController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/structure', [TableStructureController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/tracking', [TableTrackingController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/triggers', [TableTriggersController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/zoom-search', [ZoomSearchController::class, 'index']); }); - $routes->addRoute(['GET', 'POST'], '/gis-data-editor', function () use ($containerBuilder, $response) { - /** @var GisDataEditorController $controller */ - $controller = $containerBuilder->get(GisDataEditorController::class); - $response->addJSON($controller->index()); + $routes->get('/themes', [ThemesController::class, 'index']); + $routes->addGroup('/transformation', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/overview', [TransformationOverviewController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/wrapper', [TransformationWrapperController::class, 'index']); }); - $routes->addRoute(['GET', 'POST'], '/import', function () use ($containerBuilder) { - /** @var ImportController $controller */ - $controller = $containerBuilder->get(ImportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/import-status', function () use ($containerBuilder) { - /** @var ImportStatusController $controller */ - $controller = $containerBuilder->get(ImportStatusController::class); - $controller->index(); - }); - $routes->get('/license', function () use ($containerBuilder) { - /** @var LicenseController $controller */ - $controller = $containerBuilder->get(LicenseController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/lint', function () use ($containerBuilder) { - /** @var LintController $controller */ - $controller = $containerBuilder->get(LintController::class); - $controller->index([ - 'sql_query' => $_POST['sql_query'] ?? null, - 'options' => $_POST['options'] ?? null, - ]); - }); - $routes->addRoute(['GET', 'POST'], '/logout', function () use ($containerBuilder) { - /** @var LogoutController $controller */ - $controller = $containerBuilder->get(LogoutController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/navigation', function () use ($containerBuilder) { - /** @var NavigationController $controller */ - $controller = $containerBuilder->get(NavigationController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/normalization', function () use ($containerBuilder) { - /** @var NormalizationController $controller */ - $controller = $containerBuilder->get(NormalizationController::class); - $controller->index(); - }); - $routes->get('/phpinfo', function () use ($containerBuilder) { - /** @var PhpInfoController $controller */ - $controller = $containerBuilder->get(PhpInfoController::class); - $controller->index(); - }); - $routes->addGroup('/preferences', function (RouteCollector $routes) use ($containerBuilder) { - $routes->addRoute(['GET', 'POST'], '/export', function () use ($containerBuilder) { - /** @var PreferencesExportController $controller */ - $controller = $containerBuilder->get(PreferencesExportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/features', function () use ($containerBuilder) { - /** @var FeaturesController $controller */ - $controller = $containerBuilder->get(FeaturesController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/import', function () use ($containerBuilder) { - /** @var PreferencesImportController $controller */ - $controller = $containerBuilder->get(PreferencesImportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/main-panel', function () use ($containerBuilder) { - /** @var MainPanelController $controller */ - $controller = $containerBuilder->get(MainPanelController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/manage', function () use ($containerBuilder) { - /** @var ManageController $controller */ - $controller = $containerBuilder->get(ManageController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/navigation', function () use ($containerBuilder) { - /** @var PreferencesNavigationController $controller */ - $controller = $containerBuilder->get(PreferencesNavigationController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/sql', function () use ($containerBuilder) { - /** @var PreferencesSqlController $controller */ - $controller = $containerBuilder->get(PreferencesSqlController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/two-factor', function () use ($containerBuilder) { - /** @var TwoFactorController $controller */ - $controller = $containerBuilder->get(TwoFactorController::class); - $controller->index(); - }); - }); - $routes->addRoute(['GET', 'POST'], '/schema-export', function () use ($containerBuilder) { - /** @var SchemaExportController $controller */ - $controller = $containerBuilder->get(SchemaExportController::class); - $controller->index(); - }); - $routes->addGroup('/server', function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->addRoute(['GET', 'POST'], '/binlog', function () use ($containerBuilder, $response) { - /** @var BinlogController $controller */ - $controller = $containerBuilder->get(BinlogController::class); - $response->addHTML($controller->index([ - 'log' => $_POST['log'] ?? null, - 'pos' => $_POST['pos'] ?? null, - 'is_full_query' => $_POST['is_full_query'] ?? null, - ])); - }); - $routes->get('/collations', function () use ($containerBuilder, $response) { - /** @var CollationsController $controller */ - $controller = $containerBuilder->get(CollationsController::class); - $response->addHTML($controller->index()); - }); - $routes->addGroup('/databases', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var DatabasesController $controller */ - $controller = $containerBuilder->get(DatabasesController::class); - $routes->addRoute(['GET', 'POST'], '', function () use ($response, $controller) { - $response->addHTML($controller->index([ - 'statistics' => $_REQUEST['statistics'] ?? null, - 'pos' => $_REQUEST['pos'] ?? null, - 'sort_by' => $_REQUEST['sort_by'] ?? null, - 'sort_order' => $_REQUEST['sort_order'] ?? null, - ])); - }); - $routes->post('/create', function () use ($response, $controller) { - $response->addJSON($controller->create([ - 'new_db' => $_POST['new_db'] ?? null, - 'db_collation' => $_POST['db_collation'] ?? null, - ])); - }); - $routes->post('/destroy', function () use ($response, $controller) { - $response->addJSON($controller->destroy([ - 'drop_selected_dbs' => $_POST['drop_selected_dbs'] ?? null, - 'selected_dbs' => $_POST['selected_dbs'] ?? null, - ])); - }); - }); - $routes->addGroup('/engines', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var EnginesController $controller */ - $controller = $containerBuilder->get(EnginesController::class); - $routes->get('', function () use ($response, $controller) { - $response->addHTML($controller->index()); - }); - $routes->get('/{engine}[/{page}]', function (array $vars) use ($response, $controller) { - $response->addHTML($controller->show($vars)); - }); - }); - $routes->addRoute(['GET', 'POST'], '/export', function () use ($containerBuilder) { - /** @var ServerExportController $controller */ - $controller = $containerBuilder->get(ServerExportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/import', function () use ($containerBuilder) { - /** @var ServerImportController $controller */ - $controller = $containerBuilder->get(ServerImportController::class); - $controller->index(); - }); - $routes->get('/plugins', function () use ($containerBuilder, $response) { - /** @var PluginsController $controller */ - $controller = $containerBuilder->get(PluginsController::class); - $response->addHTML($controller->index()); - }); - $routes->addRoute(['GET', 'POST'], '/privileges', function () use ($containerBuilder) { - /** @var PrivilegesController $controller */ - $controller = $containerBuilder->get(PrivilegesController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/replication', function () use ($containerBuilder, $response) { - /** @var ReplicationController $controller */ - $controller = $containerBuilder->get(ReplicationController::class); - $response->addHTML($controller->index([ - 'url_params' => $_POST['url_params'] ?? null, - 'mr_configure' => $_POST['mr_configure'] ?? null, - 'sl_configure' => $_POST['sl_configure'] ?? null, - 'repl_clear_scr' => $_POST['repl_clear_scr'] ?? null, - ])); - }); - $routes->addRoute(['GET', 'POST'], '/sql', function () use ($containerBuilder, $response) { - /** @var ServerSqlController $controller */ - $controller = $containerBuilder->get(ServerSqlController::class); - $response->addHTML($controller->index()); - }); - $routes->addGroup('/status', function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->get('', function () use ($containerBuilder, $response) { - /** @var StatusController $controller */ - $controller = $containerBuilder->get(StatusController::class); - $response->addHTML($controller->index()); - }); - $routes->get('/advisor', function () use ($containerBuilder, $response) { - /** @var AdvisorController $controller */ - $controller = $containerBuilder->get(AdvisorController::class); - $response->addHTML($controller->index()); - }); - $routes->addGroup('/monitor', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var MonitorController $controller */ - $controller = $containerBuilder->get(MonitorController::class); - $routes->get('', function () use ($response, $controller) { - $response->addHTML($controller->index()); - }); - $routes->post('/chart', function () use ($response, $controller) { - $response->addJSON($controller->chartingData([ - 'requiredData' => $_POST['requiredData'] ?? null, - ])); - }); - $routes->post('/slow-log', function () use ($response, $controller) { - $response->addJSON($controller->logDataTypeSlow([ - 'time_start' => $_POST['time_start'] ?? null, - 'time_end' => $_POST['time_end'] ?? null, - ])); - }); - $routes->post('/general-log', function () use ($response, $controller) { - $response->addJSON($controller->logDataTypeGeneral([ - 'time_start' => $_POST['time_start'] ?? null, - 'time_end' => $_POST['time_end'] ?? null, - 'limitTypes' => $_POST['limitTypes'] ?? null, - 'removeVariables' => $_POST['removeVariables'] ?? null, - ])); - }); - $routes->post('/log-vars', function () use ($response, $controller) { - $response->addJSON($controller->loggingVars([ - 'varName' => $_POST['varName'] ?? null, - 'varValue' => $_POST['varValue'] ?? null, - ])); - }); - $routes->post('/query', function () use ($response, $controller) { - $response->addJSON($controller->queryAnalyzer([ - 'database' => $_POST['database'] ?? null, - 'query' => $_POST['query'] ?? null, - ])); - }); - }); - $routes->addGroup('/processes', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var ProcessesController $controller */ - $controller = $containerBuilder->get(ProcessesController::class); - $routes->addRoute(['GET', 'POST'], '', function () use ($response, $controller) { - $response->addHTML($controller->index([ - 'showExecuting' => $_POST['showExecuting'] ?? null, - 'full' => $_POST['full'] ?? null, - 'column_name' => $_POST['column_name'] ?? null, - 'order_by_field' => $_POST['order_by_field'] ?? null, - 'sort_order' => $_POST['sort_order'] ?? null, - ])); - }); - $routes->post('/refresh', function () use ($response, $controller) { - $response->addHTML($controller->refresh([ - 'showExecuting' => $_POST['showExecuting'] ?? null, - 'full' => $_POST['full'] ?? null, - 'column_name' => $_POST['column_name'] ?? null, - 'order_by_field' => $_POST['order_by_field'] ?? null, - 'sort_order' => $_POST['sort_order'] ?? null, - ])); - }); - $routes->post('/kill/{id:\d+}', function (array $vars) use ($response, $controller) { - $response->addJSON($controller->kill($vars)); - }); - }); - $routes->get('/queries', function () use ($containerBuilder, $response) { - /** @var QueriesController $controller */ - $controller = $containerBuilder->get(QueriesController::class); - $response->addHTML($controller->index()); - }); - $routes->addRoute(['GET', 'POST'], '/variables', function () use ($containerBuilder, $response) { - /** @var StatusVariables $controller */ - $controller = $containerBuilder->get(StatusVariables::class); - $response->addHTML($controller->index([ - 'flush' => $_POST['flush'] ?? null, - 'filterAlert' => $_POST['filterAlert'] ?? null, - 'filterText' => $_POST['filterText'] ?? null, - 'filterCategory' => $_POST['filterCategory'] ?? null, - 'dontFormat' => $_POST['dontFormat'] ?? null, - ])); - }); - }); - $routes->addRoute(['GET', 'POST'], '/user-groups', function () use ($containerBuilder) { - /** @var UserGroupsController $controller */ - $controller = $containerBuilder->get(UserGroupsController::class); - $controller->index(); - }); - $routes->addGroup('/variables', function (RouteCollector $routes) use ($containerBuilder, $response) { - /** @var VariablesController $controller */ - $controller = $containerBuilder->get(VariablesController::class); - $routes->get('', function () use ($response, $controller) { - $response->addHTML($controller->index([ - 'filter' => $_GET['filter'] ?? null, - ])); - }); - $routes->get('/get/{name}', function (array $vars) use ($response, $controller) { - $response->addJSON($controller->getValue($vars)); - }); - $routes->post('/set/{name}', function (array $vars) use ($response, $controller) { - $response->addJSON($controller->setValue([ - 'varName' => $vars['name'], - 'varValue' => $_POST['varValue'] ?? null, - ])); - }); - }); - }); - $routes->addGroup('/sql', function (RouteCollector $routes) use ($containerBuilder) { - /** @var SqlController $controller */ - $controller = $containerBuilder->get(SqlController::class); - $routes->addRoute(['GET', 'POST'], '', function () use ($controller) { - $controller->index(); - }); - $routes->post('/get-relational-values', function () use ($controller) { - $controller->getRelationalValues(); - }); - $routes->post('/get-enum-values', function () use ($controller) { - $controller->getEnumValues(); - }); - $routes->post('/get-set-values', function () use ($controller) { - $controller->getSetValues(); - }); - $routes->get('/get-default-fk-check-value', function () use ($controller) { - $controller->getDefaultForeignKeyCheckValue(); - }); - $routes->post('/set-column-preferences', function () use ($controller) { - $controller->setColumnOrderOrVisibility(); - }); - }); - $routes->addGroup('/table', function (RouteCollector $routes) use ($containerBuilder) { - $routes->addRoute(['GET', 'POST'], '/add-field', function () use ($containerBuilder) { - /** @var AddFieldController $controller */ - $controller = $containerBuilder->get(AddFieldController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/change', function () use ($containerBuilder) { - /** @var ChangeController $controller */ - $controller = $containerBuilder->get(ChangeController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/chart', function () use ($containerBuilder) { - /** @var ChartController $controller */ - $controller = $containerBuilder->get(ChartController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/create', function () use ($containerBuilder) { - /** @var CreateController $controller */ - $controller = $containerBuilder->get(CreateController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/export', function () use ($containerBuilder) { - /** @var TableExportController $controller */ - $controller = $containerBuilder->get(TableExportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/find-replace', function () use ($containerBuilder) { - /** @var FindReplaceController $controller */ - $controller = $containerBuilder->get(FindReplaceController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/get-field', function () use ($containerBuilder) { - /** @var GetFieldController $controller */ - $controller = $containerBuilder->get(GetFieldController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/gis-visualization', function () use ($containerBuilder) { - /** @var GisVisualizationController $controller */ - $controller = $containerBuilder->get(GisVisualizationController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/import', function () use ($containerBuilder) { - /** @var TableImportController $controller */ - $controller = $containerBuilder->get(TableImportController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/indexes', function () use ($containerBuilder) { - /** @var IndexesController $controller */ - $controller = $containerBuilder->get(IndexesController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/operations', function () use ($containerBuilder) { - /** @var TableOperationsController $controller */ - $controller = $containerBuilder->get(TableOperationsController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/recent-favorite', function () use ($containerBuilder) { - /** @var RecentFavoriteController $controller */ - $controller = $containerBuilder->get(RecentFavoriteController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/relation', function () use ($containerBuilder) { - /** @var RelationController $controller */ - $controller = $containerBuilder->get(RelationController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/replace', function () use ($containerBuilder) { - /** @var ReplaceController $controller */ - $controller = $containerBuilder->get(ReplaceController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/row-action', function () use ($containerBuilder) { - /** @var RowActionController $controller */ - $controller = $containerBuilder->get(RowActionController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/search', function () use ($containerBuilder) { - /** @var TableSearchController $controller */ - $controller = $containerBuilder->get(TableSearchController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/sql', function () use ($containerBuilder) { - /** @var TableSqlController $controller */ - $controller = $containerBuilder->get(TableSqlController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/structure', function () use ($containerBuilder) { - /** @var TableStructureController $controller */ - $controller = $containerBuilder->get(TableStructureController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/tracking', function () use ($containerBuilder) { - /** @var TableTrackingController $controller */ - $controller = $containerBuilder->get(TableTrackingController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/triggers', function () use ($containerBuilder) { - /** @var TableTriggersController $controller */ - $controller = $containerBuilder->get(TableTriggersController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/zoom-search', function () use ($containerBuilder) { - /** @var ZoomSearchController $controller */ - $controller = $containerBuilder->get(ZoomSearchController::class); - $controller->index(); - }); - }); - $routes->get('/themes', function () use ($containerBuilder, $response) { - /** @var ThemesController $controller */ - $controller = $containerBuilder->get(ThemesController::class); - $response->addHTML($controller->index()); - }); - $routes->addGroup('/transformation', function (RouteCollector $routes) use ($containerBuilder, $response) { - $routes->addRoute(['GET', 'POST'], '/overview', function () use ($containerBuilder, $response) { - /** @var TransformationOverviewController $controller */ - $controller = $containerBuilder->get(TransformationOverviewController::class); - $response->addHTML($controller->index()); - }); - $routes->addRoute(['GET', 'POST'], '/wrapper', function () use ($containerBuilder) { - /** @var TransformationWrapperController $controller */ - $controller = $containerBuilder->get(TransformationWrapperController::class); - $controller->index(); - }); - }); - $routes->addRoute(['GET', 'POST'], '/user-password', function () use ($containerBuilder) { - /** @var UserPasswordController $controller */ - $controller = $containerBuilder->get(UserPasswordController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/version-check', function () use ($containerBuilder) { - /** @var VersionCheckController $controller */ - $controller = $containerBuilder->get(VersionCheckController::class); - $controller->index(); - }); - $routes->addGroup('/view', function (RouteCollector $routes) use ($containerBuilder) { - $routes->addRoute(['GET', 'POST'], '/create', function () use ($containerBuilder) { - /** @var ViewCreateController $controller */ - $controller = $containerBuilder->get(ViewCreateController::class); - $controller->index(); - }); - $routes->addRoute(['GET', 'POST'], '/operations', function () use ($containerBuilder) { - /** @var ViewOperationsController $controller */ - $controller = $containerBuilder->get(ViewOperationsController::class); - $controller->index(); - }); + $routes->addRoute(['GET', 'POST'], '/user-password', [UserPasswordController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/version-check', [VersionCheckController::class, 'index']); + $routes->addGroup('/view', function (RouteCollector $routes) { + $routes->addRoute(['GET', 'POST'], '/create', [ViewCreateController::class, 'index']); + $routes->addRoute(['GET', 'POST'], '/operations', [ViewOperationsController::class, 'index']); }); }; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 0a1e72daa7..ed4c42cdad 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -3227,36 +3227,11 @@ parameters: count: 1 path: test/classes/ConfigTest.php - - - message: "#^Parameter \\#1 \\$response of class PhpMyAdmin\\\\Controllers\\\\Database\\\\StructureController constructor expects PhpMyAdmin\\\\Response, PhpMyAdmin\\\\Tests\\\\Stubs\\\\Response given\\.$#" - count: 10 - path: test/classes/Controllers/Database/StructureControllerTest.php - - message: "#^Parameter \\#1 \\$string of function htmlspecialchars expects string, string\\|false given\\.$#" count: 3 path: test/classes/Controllers/Server/Status/AdvisorControllerTest.php - - - message: "#^Parameter \\#1 \\$response of class PhpMyAdmin\\\\Controllers\\\\Table\\\\IndexesController constructor expects PhpMyAdmin\\\\Response, PhpMyAdmin\\\\Tests\\\\Stubs\\\\Response given\\.$#" - count: 2 - path: test/classes/Controllers/Table/IndexesControllerTest.php - - - - message: "#^Parameter \\#1 \\$response of class PhpMyAdmin\\\\Controllers\\\\Table\\\\RelationController constructor expects PhpMyAdmin\\\\Response, PhpMyAdmin\\\\Tests\\\\Stubs\\\\Response given\\.$#" - count: 4 - path: test/classes/Controllers/Table/RelationControllerTest.php - - - - message: "#^Parameter \\#1 \\$response of class PhpMyAdmin\\\\Controllers\\\\Table\\\\SearchController constructor expects PhpMyAdmin\\\\Response, PhpMyAdmin\\\\Tests\\\\Stubs\\\\Response given\\.$#" - count: 2 - path: test/classes/Controllers/Table/SearchControllerTest.php - - - - message: "#^Parameter \\#1 \\$response of class PhpMyAdmin\\\\Controllers\\\\Table\\\\StructureController constructor expects PhpMyAdmin\\\\Response, PhpMyAdmin\\\\Tests\\\\Stubs\\\\Response given\\.$#" - count: 5 - path: test/classes/Controllers/Table/StructureControllerTest.php - - message: "#^Call to method PHPUnit\\\\Framework\\\\Assert\\:\\:assertSame\\(\\) with int and bool will always evaluate to false\\.$#" count: 1 diff --git a/templates/database/multi_table_query/form.twig b/templates/database/multi_table_query/form.twig index 929bc6dedc..ade2ab60b9 100644 --- a/templates/database/multi_table_query/form.twig +++ b/templates/database/multi_table_query/form.twig @@ -4,9 +4,9 @@ }, 'sub_tabs': [ { - 'link': url('/database/multi_table_query'), + 'link': url('/database/multi-table-query'), 'text': 'Multi-table query'|trans, - 'active': route == '/database/multi_table_query' + 'active': route == '/database/multi-table-query' }, { 'link': url('/database/qbe'), diff --git a/templates/database/structure/index.twig b/templates/database/structure/index.twig index 3ad5f9fafc..9cfe5e7d75 100644 --- a/templates/database/structure/index.twig +++ b/templates/database/structure/index.twig @@ -11,7 +11,7 @@ {{ get_icon('b_print', 'Print'|trans, true) }} - + {{ get_icon('b_tblanalyse', 'Data dictionary'|trans, true) }}
diff --git a/test/classes/Controllers/Database/StructureControllerTest.php b/test/classes/Controllers/Database/StructureControllerTest.php index baca784bfc..6357844f52 100644 --- a/test/classes/Controllers/Database/StructureControllerTest.php +++ b/test/classes/Controllers/Database/StructureControllerTest.php @@ -487,9 +487,9 @@ class StructureControllerTest extends PmaTestCase $property = $class->getProperty('tables'); $property->setAccessible(true); - $json = $controller->handleRealRowCountRequestAction([ - 'table' => 'table', - ]); + $_REQUEST['table'] = 'table'; + $controller->handleRealRowCountRequestAction(); + $json = $this->response->getJSONResult(); $this->assertEquals( 6, $json['real_row_count'] @@ -497,10 +497,9 @@ class StructureControllerTest extends PmaTestCase // Fall into another branch $property->setValue($controller, [['TABLE_NAME' => 'table']]); - $json = $controller->handleRealRowCountRequestAction([ - 'table' => 'table', - 'real_row_count_all' => 'abc', - ]); + $_REQUEST['real_row_count_all'] = 'abc'; + $controller->handleRealRowCountRequestAction(); + $json = $this->response->getJSONResult(); $expectedResult = [[ 'table' => 'table', diff --git a/test/classes/Controllers/Server/BinlogControllerTest.php b/test/classes/Controllers/Server/BinlogControllerTest.php index e58a239996..e26bbd8269 100644 --- a/test/classes/Controllers/Server/BinlogControllerTest.php +++ b/test/classes/Controllers/Server/BinlogControllerTest.php @@ -9,8 +9,8 @@ namespace PhpMyAdmin\Tests\Controllers\Server; use PhpMyAdmin\Config; use PhpMyAdmin\Controllers\Server\BinlogController; use PhpMyAdmin\DatabaseInterface; -use PhpMyAdmin\Response; use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\Stubs\Response; use PhpMyAdmin\Url; use PhpMyAdmin\Util; use PHPUnit\Framework\TestCase; @@ -94,16 +94,18 @@ class BinlogControllerTest extends TestCase $dbi->expects($this->at(4))->method('fetchAssoc') ->will($this->returnValue(false)); + $response = new Response(); + $controller = new BinlogController( - Response::getInstance(), + $response, $dbi, new Template() ); - $actual = $controller->index([ - 'log' => 'index1', - 'pos' => '3', - 'is_full_query' => null, - ]); + + $_POST['log'] = 'index1'; + $_POST['pos'] = '3'; + $controller->index(); + $actual = $response->getHTMLResult(); $this->assertStringContainsString( 'Select binary log to view', diff --git a/test/classes/Controllers/Server/CollationsControllerTest.php b/test/classes/Controllers/Server/CollationsControllerTest.php index 659b5fde80..ece6ca89fd 100644 --- a/test/classes/Controllers/Server/CollationsControllerTest.php +++ b/test/classes/Controllers/Server/CollationsControllerTest.php @@ -8,8 +8,8 @@ namespace PhpMyAdmin\Tests\Controllers\Server; use PhpMyAdmin\Config; use PhpMyAdmin\Controllers\Server\CollationsController; -use PhpMyAdmin\Response; use PhpMyAdmin\Template; +use PhpMyAdmin\Tests\Stubs\Response; use PHPUnit\Framework\TestCase; /** @@ -34,13 +34,16 @@ class CollationsControllerTest extends TestCase public function testIndexAction(): void { + $response = new Response(); + $controller = new CollationsController( - Response::getInstance(), + $response, $GLOBALS['dbi'], new Template() ); - $actual = $controller->index(); + $controller->index(); + $actual = $response->getHTMLResult(); $this->assertStringContainsString( '