PHP Classes

File: setup-config.php

Recommend this page to a friend!
  Packages of Saro Carvello   PHP Web MVC Framework   setup-config.php   Download  
File: setup-config.php
Role: Example script
Content type: text/plain
Description: Example script
Class: PHP Web MVC Framework
MVC framework providing autogenerated MySQL models
Author: By
Last change:
Date: 3 months ago
Size: 7,333 bytes
 

Contents

Class file image Download
<?php
// -----------------
// Useful functions
// -----------------
function getOSFamily()
{
    if (
defined('PHP_OS_FAMILY')) {
        return
PHP_OS_FAMILY; // PHP >= 7.2
   
}

   
$os = strtolower(PHP_OS);
    if (
strpos($os, 'win') === 0) {
        return
'Windows';
    }
    if (
strpos($os, 'darwin') === 0) {
        return
'Darwin'; // macOS
   
}
    if (
strpos($os, 'linux') === 0) {
        return
'Linux';
    }
    return
'Unknown';
}


function
setup_php()
{
    echo
"Checking PHP installation...\n";

   
// 1. Checking PHP installation
   
$phpVersion = shell_exec("php -v 2>&1");
    if (
strpos($phpVersion, "PHP") === false) {
        echo
"\033[0;31m PHP is not installed or not in PATH.\033[0m\n";
        return
false;
    }
    echo
"\033[0;32m PHP detected:\033[0m\n$phpVersion\n";

   
// 2. Get current php.ini
   
$phpInfo = shell_exec("php -i");
   
$iniPath = null;
    foreach (
explode("\n", $phpInfo) as $line) {
        if (
stripos($line, "Loaded Configuration File") !== false) {
           
$parts = explode("=>", $line);
            if (
count($parts) == 2) {
               
$iniPath = trim($parts[1]);
            }
            break;
        }
    }

    if (!
$iniPath || $iniPath === "(None)") {
        echo
"\033[0;33m No php.ini loaded.\033[0m\n";
       
$iniPath = "";
    } else {
        echo
"Using php.ini: $iniPath\n";
    }

   
// 3. Looking for PHP executable
   
$osFamily = getOSFamily();
    if (
stripos($osFamily, 'Windows') !== false) {
       
$output = shell_exec("where php");
    } else {
       
$output = shell_exec("which php");
    }

   
$phpBin = $output ? trim($output) : PHP_BINARY;

   
// 4. User input with default values
   
echo "\n--- PHP Configuration ---\n";
    echo
"PHP binary path [{$phpBin}]: ";
   
$phpBinInput = trim(fgets(STDIN));
   
$phpBinFinal = $phpBinInput !== "" ? $phpBinInput : $phpBin;

    echo
"php.ini path [{$iniPath}]: ";
   
$iniPathInput = trim(fgets(STDIN));
   
$iniPathFinal = $iniPathInput !== "" ? $iniPathInput : $iniPath;

   
// 5. Load the config.json
   
$configFile = __DIR__ . "/config.json";
    if (!
file_exists($configFile)) {
        echo
"\033[0;31m config.json not found!\033[0m\n";
        return
false;
    }

   
$config = json_decode(file_get_contents($configFile), true);
    if (!
$config) {
        echo
"\033[0;31m Invalid config.json format!\033[0m\n";
        return
false;
    }

   
// 6. Update and save config.json
   
$config['PHP_BIN'] = $phpBinFinal;
   
$config['PHP_INI_PATH'] = $iniPathFinal;

   
file_put_contents($configFile, json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
    echo
"\n";
    echo
"\033[0;32m config.json updated successfully!\033[0m\n";
    return
true;
}

function
commandExists($cmd)
{
   
$checkCmd = (strncasecmp(PHP_OS, 'WIN', 3) === 0)
        ?
"where $cmd"
       
: "command -v $cmd";
   
exec($checkCmd, $output, $returnVar);
    return
$returnVar === 0;
}

function
getVersion($cmd)
{
   
exec("$cmd --version 2>&1", $output, $returnVar);
    return
$returnVar === 0 ? $output[0] : false;
}

// --------------
// Initialization
// --------------

$templateFile = __DIR__ . '/config/application.config.template.php';
$configFile = __DIR__ . '/config/application.config.php';
$sqlFile = __DIR__ . "/sql/mrp.sql";

if (!
file_exists($templateFile)) {
    echo
"\033[0;31m Template file not found: application.config.template.php\033[0m\n";
    exit(
1);
}

if (!
copy($templateFile, $configFile)) {
    echo
"\033[0;31m Failed to initialize application.config.php from template.\033[0m\n";
    exit(
1);
}

echo
"\033[0;36m File application.config.php reinitialized from template.\033[0m\n\n";



// -------------------------
// 1. Checking dependencies
// -------------------------


echo "Checking dependencies...\n";

$phpVersion = getVersion("php");
$npmVersion = getVersion("npm");

if (!
$phpVersion) {
    echo
"PHP was not found. Install PHP and do it again.\n";
    exit(
1);
}
if (!
$npmVersion) {
    echo
"\033[0;31m NPM was not found. Install Node.js and do it again.\033[0m\n";
    exit(
1);
}

echo
"PHP: $phpVersion\n";
echo
"NPM: $npmVersion\n";

if (!
setup_php()) {
    echo
"\033[0;31m Setup aborted due to PHP configuration error.\033[0m\n";
    exit(
1);
}

// -------------------------
// 2. Project Configuration
// -------------------------

// get the project name (current folder)
$projectName = basename(getcwd());

$placeholders = [
   
"DB_HOST" => "127.0.0.1",
   
"DB_USER" => "root",
   
"DB_PASSWORD" => "root",
   
"DB_NAME" => strtolower($projectName), // default: project name (current directory)
   
"DB_PORT" => "3306"
];

if (!
file_exists($configFile)) {
    echo
"Configuration file not found: $configFile\n";
    exit(
1);
}

$content = file_get_contents($configFile);

$params = [];
foreach (
$placeholders as $key => $default) {
    echo
"$key [$default]: ";
   
$input = trim(fgets(STDIN));
   
$value = $input !== "" ? $input : $default;
   
$params[$key] = $value;

   
// Replacing placeholder
   
$content = str_replace("{" . $key . "}", $value, $content);
}


echo
"Testing MySQL connection...\n";

try {
   
// Connessione senza specificare DB
   
$db = $params['DB_HOST'] === 'localhost' ? '127.0.0.1' : $params['DB_HOST'];
   
$mysqli = @new mysqli($db, $params["DB_USER"], $params["DB_PASSWORD"]);

    if (
$mysqli->connect_error) {
        throw new
Exception("Connection failed: " . $mysqli->connect_error);
    }

    echo
"\033[0;32m Successfully connected to MySQL server.\033[0m\n";
   
$mysqli->close();

} catch (
Exception $e) {
    echo
"\033[0;31m MySQL connection error: {$e->getMessage()}\033[0m\n";
    exit(
1);
}


// Updating config file
file_put_contents($configFile, $content);
echo
"application.config.php was successfully updated.\n";

// -------------------------
// 3. Database setup
// -------------------------

if (!file_exists($sqlFile)) {
    echo
"SQL file not found: $sqlFile\n";
    exit(
1);
}

echo
"DB Setup...\n";

try {
   
$db = $params['DB_HOST'] === 'localhost' ? '127.0.0.1' : $params['DB_HOST'];
   
$dsn = "mysql:host=" . $db . ";charset=utf8mb4";
   
$pdo = new PDO($dsn, $params["DB_USER"], $params["DB_PASSWORD"], [
       
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
       
PDO::MYSQL_ATTR_MULTI_STATEMENTS => true
   
]);

   
// Create DB if not exists
   
$pdo->exec("CREATE DATABASE IF NOT EXISTS `" . $params["DB_NAME"] . "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
   
$pdo->exec("USE `" . $params["DB_NAME"] . "`");

   
// Load the SQL script
   
$sql = file_get_contents($sqlFile);
   
$pdo->exec($sql);

    echo
"Database '{$params["DB_NAME"]}' successfully created.\n";

} catch (
PDOException $e) {
    echo
"PDO Error: " . $e->getMessage() . "\n";
    exit(
1);
}

echo
"Setup process is successfully completed!\n";

// PHP > 8.4 Fix
if (PHP_VERSION_ID >= 80400) {
    echo
"\033[0;36m PHP >= 8.4 detected, installing php-cs-fixer...\033[0m\n";

   
passthru("composer require --dev friendsofphp/php-cs-fixer");

    if (
stripos(PHP_OS, 'WIN') === 0) {
       
passthru(".\\vendor\\bin\\php-cs-fixer fix");
    } else {
       
passthru("./vendor/bin/php-cs-fixer fix");
    }

    echo
"\033[0;32m Code style fixed with php-cs-fixer.\033[0m\n";
} else {
    echo
"\033[0;33m PHP version < 8.4 ? skipping php-cs-fixer.\033[0m\n";
}