Files
InvoiceShelf/app/Http/Controllers/Setup/DatabaseConfigurationController.php
Darko Gjorgjijoski fdd958c1e5 fix(setup): support mariadb in the installation wizard (#704)
Fixes InvoiceShelf/docker#79 — a fresh install using the shipped
docker-compose.mysql.yml cannot get past the database step, because that
compose file sets DB_CONNECTION=mariadb.

getDatabaseEnvironment() switched on sqlite, pgsql and mysql with no arm
for mariadb and no default, so it answered {"config":[]}. The wizard
chooses which form to render from database_connection in that response,
so step 4 rendered blank with no way forward — and nothing reached the
log, because the app never errored, it just replied with nothing.

Adds the mariadb arm, and a default so an unrecognised driver can never
again produce an unrenderable response: it is echoed back with the server
defaults, leaving the fields editable rather than the step empty.

MariaDB is now offered in the driver dropdown too. It was already a valid
DB_CONNECTION with its own connection in config/database.php, and the
form fields are identical to MySQL's.

Tested against the original code, where three of the new cases fail with
"Failed asserting that null is identical to 'mariadb'".
2026-07-29 12:29:01 +02:00

109 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers\Setup;
use App\Http\Controllers\Controller;
use App\Http\Requests\DatabaseEnvironmentRequest;
use App\Support\Setup\EnvironmentManager;
use App\Support\Setup\InstallUtils;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
class DatabaseConfigurationController extends Controller
{
/**
* @var EnvironmentManager
*/
protected $EnvironmentManager;
public function __construct(EnvironmentManager $environmentManager)
{
$this->environmentManager = $environmentManager;
}
public function saveDatabaseEnvironment(DatabaseEnvironmentRequest $request)
{
Artisan::call('config:clear');
Artisan::call('cache:clear');
$results = $this->environmentManager->saveDatabaseVariables($request);
if (array_key_exists('success', $results)) {
// Automatically regenerating the key is disabled to prevent complications in the wizard process.
// This can cause issues with the CSRF token, resulting in "Token Mismatch" or "Invalid CSRF Token" errors.
// It is recommended that the user manually generates the key before running the wizard to ensure application security and stability.
// Artisan::call('key:generate --force');
Artisan::call('optimize:clear');
Artisan::call('config:clear');
Artisan::call('cache:clear');
Artisan::call('storage:link');
Artisan::call('migrate --seed --force');
// Set version.
InstallUtils::setCurrentVersion();
}
return response()->json($results);
}
public function getDatabaseEnvironment(Request $request)
{
$databaseData = [];
$connection = $request->connection ?? config('database.default');
switch ($connection) {
case 'sqlite':
$databaseData = [
'database_connection' => 'sqlite',
'database_name' => config('database.connections.sqlite.database') ?: 'storage/app/database.sqlite',
];
break;
case 'pgsql':
$databaseData = [
'database_connection' => 'pgsql',
'database_host' => '127.0.0.1',
'database_port' => 5432,
];
break;
case 'mysql':
$databaseData = [
'database_connection' => 'mysql',
'database_host' => '127.0.0.1',
'database_port' => 3306,
];
break;
case 'mariadb':
$databaseData = [
'database_connection' => 'mariadb',
'database_host' => '127.0.0.1',
'database_port' => 3306,
];
break;
default:
// Never return an empty config: the wizard picks its form from
// database_connection, so an unrecognised driver used to render
// a blank step with no way forward. Echo it back with the
// server defaults instead.
$databaseData = [
'database_connection' => $connection,
'database_host' => '127.0.0.1',
'database_port' => 3306,
];
break;
}
return response()->json([
'config' => $databaseData,
'success' => true,
]);
}
}