in testing new make.php
This commit is contained in:
1 parent
db5e9b0bd9
commit
4ea2e014cf
6 files changed
+457
-510
No files matched your search
-35
@@ -1,35 +0,0 @@
|
||||
FROM php:8.2-apache
|
||||
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
libpng-dev \
|
||||
libonig-dev \
|
||||
libxml2-dev \
|
||||
zip \
|
||||
unzip \
|
||||
curl
|
||||
|
||||
# Clear cache
|
||||
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install PHP extensions
|
||||
RUN docker-php-ext-install mysqli pdo_mysql mbstring exif pcntl bcmath gd
|
||||
|
||||
# Enable Apache mod_rewrite
|
||||
RUN a2enmod rewrite
|
||||
|
||||
# Set working directory
|
||||
WORKDIR /var/www/html
|
||||
|
||||
# Copy project files
|
||||
COPY . /var/www/html
|
||||
|
||||
# Adjust permissions for logs and other writable dirs
|
||||
RUN chown -R www-data:www-data /var/www/html
|
||||
|
||||
# Update Apache configuration to point to WEBROOT
|
||||
ENV APACHE_DOCUMENT_ROOT /var/www/html/Framework/WEBROOT
|
||||
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
|
||||
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
|
||||
|
||||
EXPOSE 80
|
||||
@@ -1,79 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* MVC Model Generator
|
||||
* Nutzung: php create_model.php <TabellenName> <Spalte1,Spalte2,...>
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Dieses Script muss über die CLI ausgeführt werden.\n");
|
||||
}
|
||||
|
||||
$tableName = $argv[1] ?? null;
|
||||
$columnsInput = $argv[2] ?? null;
|
||||
|
||||
// Interaktive Abfrage, falls Argumente fehlen
|
||||
if (!$tableName) {
|
||||
echo "Tabellenname eingeben (z.B. Benutzer): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$tableName = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
if (!$columnsInput) {
|
||||
echo "Spalten kommagetrennt eingeben (z.B. NAME,EMAIL,ROLLE): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$columnsInput = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
if (!$tableName) die("Fehler: Kein Tabellenname angegeben.\n");
|
||||
|
||||
// Namen formatieren
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower($tableName))));
|
||||
$modelFile = __DIR__ . "/WEBROOT/src/MVC/Model/{$className}.php";
|
||||
|
||||
// Spalten aufbereiten
|
||||
$columns = array_map('trim', explode(',', $columnsInput));
|
||||
$columnList = implode("', '", $columns);
|
||||
|
||||
// Model-Inhalt generieren
|
||||
$content = <<<PHPMODEL
|
||||
<?php
|
||||
|
||||
namespace MVC\Model;
|
||||
|
||||
use MVC\Core\Model;
|
||||
|
||||
/**
|
||||
* Model für die Tabelle '{$tableName}'
|
||||
* Verfügbare Spalten: '{$columnList}'
|
||||
*/
|
||||
class {$className} extends Model {
|
||||
protected static \$table = "{$tableName}";
|
||||
|
||||
// Hier kannst du spezifische Methoden für dieses Model hinzufügen
|
||||
|
||||
/**
|
||||
* Beispiel: Suche nach einer spezifischen Spalte
|
||||
*/
|
||||
public static function getByFirstColumn(\$value) {
|
||||
return self::where("{$columns[0]} = ?", \$value);
|
||||
}
|
||||
}
|
||||
PHPMODEL;
|
||||
|
||||
// Datei schreiben
|
||||
if (!is_dir(dirname($modelFile))) {
|
||||
mkdir(dirname($modelFile), 0755, true);
|
||||
}
|
||||
|
||||
if (!file_exists($modelFile)) {
|
||||
file_put_contents($modelFile, $content);
|
||||
echo "✅ Model erstellt: WEBROOT/src/MVC/Model/{$className}.php\n";
|
||||
echo "--- INFO ---\n";
|
||||
echo "Tabelle: {$tableName}\n";
|
||||
echo "Klasse: MVC\\Model\\{$className}\n";
|
||||
echo "Spalten: " . implode(', ', $columns) . "\n";
|
||||
} else {
|
||||
echo "⚠️ Model {$className}.php existiert bereits.\n";
|
||||
}
|
||||
@@ -1,175 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* MVC Module Generator for Gemini CLI Project
|
||||
* Nutzung: php create_module.php <name> [options]
|
||||
*
|
||||
* Optionen:
|
||||
* --controller, -c Nur Controller erstellen
|
||||
* --view, -v Nur View erstellen
|
||||
* --route, -r Nur Route hinzufügen
|
||||
* --nav, -n Nur Navigationspunkt hinzufügen
|
||||
* --auth, -a Route/Nav erfordert Login
|
||||
* --label, -l Label für Navigationspunkt
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Dieses Script kann nur über die Kommandozeile ausgeführt werden.\n");
|
||||
}
|
||||
|
||||
$shortopts = "cvrnal:h";
|
||||
$longopts = ["controller", "view", "route", "nav", "auth", "label:", "help"];
|
||||
// Flags und Optionen initialisieren
|
||||
$options = getopt($shortopts, $longopts);
|
||||
|
||||
// Namen und Flags aus argv extrahieren (robuster als getopt allein)
|
||||
$name = null;
|
||||
$manualFlags = [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if ($i === 0) continue;
|
||||
|
||||
if (strpos($arg, '-') === 0) {
|
||||
$flag = ltrim($arg, '-');
|
||||
$manualFlags[] = $flag;
|
||||
} else if ($name === null) {
|
||||
$name = $arg;
|
||||
}
|
||||
}
|
||||
|
||||
// Flags setzen (getopt + manuelle Suche für Flexibilität)
|
||||
$hasFlag = function($short, $long) use ($options, $manualFlags) {
|
||||
return isset($options[$short]) || isset($options[$long]) || in_array($short, $manualFlags) || in_array($long, $manualFlags);
|
||||
};
|
||||
|
||||
$doController = $hasFlag('c', 'controller');
|
||||
$doView = $hasFlag('v', 'view');
|
||||
$doRoute = $hasFlag('r', 'route');
|
||||
$doNav = $hasFlag('n', 'nav');
|
||||
$isAuth = $hasFlag('a', 'auth');
|
||||
|
||||
// Wenn gar keine spezifischen Flags gesetzt wurden, mache alles
|
||||
$doAll = !($doController || $doView || $doRoute || $doNav);
|
||||
if ($doAll) {
|
||||
$doController = $doView = $doRoute = $doNav = true;
|
||||
}
|
||||
|
||||
$label = $options['l'] ?? $options['label'] ?? null;
|
||||
// Falls -l nach dem Namen kam, könnte getopt es verfehlt haben
|
||||
if (!$label) {
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (($arg === '-l' || $arg === '--label') && isset($argv[$i+1])) {
|
||||
$label = $argv[$i+1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Namen formatieren
|
||||
$key = strtolower(str_replace(' ', '_', $name));
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
|
||||
$label = $label ?: ucwords(str_replace('_', ' ', $key));
|
||||
|
||||
$controllerFile = __DIR__ . "/WEBROOT/src/MVC/Controller/{$className}Controller.php";
|
||||
$viewFile = __DIR__ . "/WEBROOT/src/MVC/View/{$key}.php";
|
||||
$routesFile = __DIR__ . "/WEBROOT/src/config/routes.php";
|
||||
$navFile = __DIR__ . "/WEBROOT/src/config/navigation.php";
|
||||
|
||||
// 1. Controller erstellen
|
||||
if ($doController) {
|
||||
$controllerContent = <<<PHPCTRL
|
||||
<?php
|
||||
|
||||
namespace MVC\Controller;
|
||||
|
||||
use MVC\Core\Controller;
|
||||
use MVC\Classes\Client;
|
||||
use MVC\Classes\Cookie;
|
||||
use MVC\Classes\Request;
|
||||
use MVC\Classes\Server;
|
||||
// use MVC\Model\YourModel; // Importiere dein Model
|
||||
|
||||
class {$className}Controller extends Controller {
|
||||
public function {$key}() {
|
||||
// Nutze Models für den Datenbankzugriff
|
||||
// \$data = YourModel::all();
|
||||
|
||||
return \$this->render('{$key}', [
|
||||
'title' => '{$className} Modul',
|
||||
'message' => 'Willkommen in deinem neuen Modul {$className}!'
|
||||
]);
|
||||
}
|
||||
}
|
||||
PHPCTRL;
|
||||
|
||||
if (!file_exists($controllerFile)) {
|
||||
file_put_contents($controllerFile, $controllerContent);
|
||||
echo "✅ Controller erstellt: WEBROOT/src/MVC/Controller/{$className}Controller.php\n";
|
||||
} else {
|
||||
echo "⚠️ Controller existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 2. View erstellen
|
||||
if ($doView) {
|
||||
$viewContent = <<<HTML
|
||||
<h2><?= htmlspecialchars(\$title) ?></h2>
|
||||
<div class="card">
|
||||
<p><?= htmlspecialchars(\$message) ?></p>
|
||||
<p>Hier kannst du nun dein Projekt aufbauen.</p>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.card {
|
||||
background: var(--card-bg);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid var(--card-border);
|
||||
}
|
||||
</style>
|
||||
HTML;
|
||||
|
||||
if (!file_exists($viewFile)) {
|
||||
file_put_contents($viewFile, $viewContent);
|
||||
echo "✅ View erstellt: WEBROOT/src/MVC/View/{$key}.php\n";
|
||||
} else {
|
||||
echo "⚠️ View existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Route hinzufügen
|
||||
if ($doRoute) {
|
||||
if (file_exists($routesFile)) {
|
||||
$routesContent = file_get_contents($routesFile);
|
||||
$routeLine = "\$router->add('{$key}', \\MVC\\Controller\\{$className}Controller::class, '{$key}'" . ($isAuth ? ", ['auth']" : "") . ");\n";
|
||||
|
||||
if (strpos($routesContent, "'{$key}'") === false) {
|
||||
file_put_contents($routesFile, $routesContent . $routeLine);
|
||||
echo "✅ Route hinzugefügt: {$routesFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Route für '{$key}' existiert bereits in routes.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: routes.php nicht gefunden!\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Navigation hinzufügen
|
||||
if ($doNav) {
|
||||
if (file_exists($navFile)) {
|
||||
$navContent = file_get_contents($navFile);
|
||||
$authStr = $isAuth ? 'true' : 'false';
|
||||
$navItem = " '{$key}' => ['label' => '{$label}', 'auth' => {$authStr}],\n";
|
||||
|
||||
if (strpos($navContent, "'{$key}'") === false) {
|
||||
// Wir suchen nach dem Ende des Arrays ];
|
||||
$newNavContent = preg_replace('/(\];\s*)$/', $navItem . '$1', trim($navContent));
|
||||
file_put_contents($navFile, $newNavContent . "\n");
|
||||
echo "✅ Navigation hinzugefügt: {$navFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: navigation.php nicht gefunden!\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\nFertig!\n";
|
||||
@@ -0,0 +1,271 @@
|
||||
<?php
|
||||
/**
|
||||
* MVC Unified CLI Tool
|
||||
* Nutzung: php make.php <command> [args]
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Dieses Script muss über die CLI ausgeführt werden.\n");
|
||||
}
|
||||
|
||||
$command = $argv[1] ?? null;
|
||||
|
||||
if (!$command || in_array($command, ['help', '-h', '--help'])) {
|
||||
showHelp();
|
||||
exit;
|
||||
}
|
||||
|
||||
switch ($command) {
|
||||
case 'model':
|
||||
createModel(array_slice($argv, 2));
|
||||
break;
|
||||
case 'module':
|
||||
createModule(array_slice($argv, 2));
|
||||
break;
|
||||
default:
|
||||
echo "❌ Unbekannter Befehl: $command\n";
|
||||
showHelp();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
function showHelp() {
|
||||
echo "MVC CLI Tool\n";
|
||||
echo "-----------\n";
|
||||
echo "Nutzung: php make.php <befehl> [optionen]\n\n";
|
||||
echo "Befehle:\n";
|
||||
echo " model Erstellt ein neues Model basierend auf einer Datenbanktabelle\n";
|
||||
echo " module Erstellt ein neues Modul (Controller, View, Route, Navigation)\n\n";
|
||||
echo "Details zu model:\n";
|
||||
echo " php make.php model <TabellenName> <Spalte1,Spalte2,...>\n\n";
|
||||
echo "Details zu module:\n";
|
||||
echo " php make.php module <Name> [optionen]\n";
|
||||
echo " Optionen:\n";
|
||||
echo " -c, --controller Nur Controller erstellen\n";
|
||||
echo " -v, --view Nur View erstellen\n";
|
||||
echo " -r, --route Nur Route hinzufügen\n";
|
||||
echo " -n, --nav Nur Navigationspunkt hinzufügen\n";
|
||||
echo " -a, --auth Route/Nav erfordert Login\n";
|
||||
echo " -l, --label Label für Navigationspunkt\n";
|
||||
}
|
||||
|
||||
function createModel($args) {
|
||||
$tableName = $args[0] ?? null;
|
||||
$columnsInput = $args[1] ?? null;
|
||||
|
||||
// Interaktive Abfrage, falls Argumente fehlen
|
||||
if (!$tableName) {
|
||||
echo "Tabellenname eingeben (z.B. Benutzer): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$tableName = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
if (!$columnsInput) {
|
||||
echo "Spalten kommagetrennt eingeben (z.B. NAME,EMAIL,ROLLE): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$columnsInput = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
if (!$tableName) die("❌ Fehler: Kein Tabellenname angegeben.\n");
|
||||
|
||||
// Namen formatieren
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower($tableName))));
|
||||
$modelFile = __DIR__ . "/WEBROOT/src/MVC/Model/{$className}.php";
|
||||
|
||||
// Spalten aufbereiten
|
||||
$columns = array_map('trim', explode(',', $columnsInput));
|
||||
$columnList = implode("', '", $columns);
|
||||
|
||||
// Model-Inhalt generieren
|
||||
$content = <<<PHPMODEL
|
||||
<?php
|
||||
|
||||
namespace MVC\Model;
|
||||
|
||||
use MVC\Core\Model;
|
||||
|
||||
/**
|
||||
* Model für die Tabelle '{$tableName}'
|
||||
* Verfügbare Spalten: '{$columnList}'
|
||||
*/
|
||||
class {$className} extends Model {
|
||||
protected static \$table = "{$tableName}";
|
||||
|
||||
// Hier kannst du spezifische Methoden für dieses Model hinzufügen
|
||||
|
||||
/**
|
||||
* Beispiel: Suche nach einer spezifischen Spalte
|
||||
*/
|
||||
public static function getByFirstColumn(\$value) {
|
||||
return self::where("{$columns[0]} = ?", \$value);
|
||||
}
|
||||
}
|
||||
PHPMODEL;
|
||||
|
||||
// Datei schreiben
|
||||
if (!is_dir(dirname($modelFile))) {
|
||||
mkdir(dirname($modelFile), 0755, true);
|
||||
}
|
||||
|
||||
if (!file_exists($modelFile)) {
|
||||
file_put_contents($modelFile, $content);
|
||||
echo "✅ Model erstellt: WEBROOT/src/MVC/Model/{$className}.php\n";
|
||||
echo "--- INFO ---\n";
|
||||
echo "Tabelle: {$tableName}\n";
|
||||
echo "Klasse: MVC\\Model\\{$className}\n";
|
||||
echo "Spalten: " . implode(', ', $columns) . "\n";
|
||||
} else {
|
||||
echo "⚠️ Model {$className}.php existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
function createModule($args) {
|
||||
// Da wir args als Slice übergeben, müssen wir sie manuell parsen
|
||||
$name = null;
|
||||
$manualFlags = [];
|
||||
$label = null;
|
||||
|
||||
for ($i = 0; $i < count($args); $i++) {
|
||||
$arg = $args[$i];
|
||||
if ($arg === '-l' || $arg === '--label') {
|
||||
$label = $args[++$i] ?? null;
|
||||
} else if (strpos($arg, '-') === 0) {
|
||||
$flag = ltrim($arg, '-');
|
||||
$manualFlags[] = $flag;
|
||||
} else if ($name === null) {
|
||||
$name = $arg;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$name) {
|
||||
echo "❌ Fehler: Kein Modulname angegeben.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
$hasFlag = function($short, $long) use ($manualFlags) {
|
||||
return in_array($short, $manualFlags) || in_array($long, $manualFlags);
|
||||
};
|
||||
|
||||
$doController = $hasFlag('c', 'controller');
|
||||
$doView = $hasFlag('v', 'view');
|
||||
$doRoute = $hasFlag('r', 'route');
|
||||
$doNav = $hasFlag('n', 'nav');
|
||||
$isAuth = $hasFlag('a', 'auth');
|
||||
|
||||
// Wenn gar keine spezifischen Flags gesetzt wurden, mache alles
|
||||
if (!($doController || $doView || $doRoute || $doNav)) {
|
||||
$doController = $doView = $doRoute = $doNav = true;
|
||||
}
|
||||
|
||||
// Namen formatieren
|
||||
$key = strtolower(str_replace(' ', '_', $name));
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
|
||||
$label = $label ?: ucwords(str_replace('_', ' ', $key));
|
||||
|
||||
$controllerFile = __DIR__ . "/WEBROOT/src/MVC/Controller/{$className}Controller.php";
|
||||
$viewFile = __DIR__ . "/WEBROOT/src/MVC/View/{$key}.php";
|
||||
$routesFile = __DIR__ . "/WEBROOT/src/config/routes.php";
|
||||
$navFile = __DIR__ . "/WEBROOT/src/config/navigation.php";
|
||||
|
||||
// 1. Controller erstellen
|
||||
if ($doController) {
|
||||
$controllerContent = <<<PHPCTRL
|
||||
<?php
|
||||
|
||||
namespace MVC\Controller;
|
||||
|
||||
use MVC\Core\Controller;
|
||||
use MVC\Classes\Client;
|
||||
use MVC\Classes\Cookie;
|
||||
use MVC\Classes\Request;
|
||||
use MVC\Classes\Server;
|
||||
// use MVC\Model\YourModel; // Importiere dein Model
|
||||
|
||||
class {$className}Controller extends Controller {
|
||||
public function {$key}() {
|
||||
// Nutze Models für den Datenbankzugriff
|
||||
// \$data = YourModel::all();
|
||||
|
||||
return \$this->render('{$key}', [
|
||||
'title' => '{$className} Modul',
|
||||
'message' => 'Willkommen in deinem neuen Modul {$className}!'
|
||||
]);
|
||||
}
|
||||
}
|
||||
PHPCTRL;
|
||||
|
||||
if (!file_exists($controllerFile)) {
|
||||
file_put_contents($controllerFile, $controllerContent);
|
||||
echo "✅ Controller erstellt: WEBROOT/src/MVC/Controller/{$className}Controller.php\n";
|
||||
} else {
|
||||
echo "⚠️ Controller existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 2. View erstellen
|
||||
if ($doView) {
|
||||
$viewContent = <<<HTML
|
||||
<h2><?= htmlspecialchars(\$title) ?></h2>
|
||||
<div class="card">
|
||||
<p><?= htmlspecialchars(\$message) ?></p>
|
||||
<p>Hier kannst du nun dein Projekt aufbauen.</p>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.card {
|
||||
background: var(--card-bg);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid var(--card-border);
|
||||
}
|
||||
</style>
|
||||
HTML;
|
||||
|
||||
if (!file_exists($viewFile)) {
|
||||
file_put_contents($viewFile, $viewContent);
|
||||
echo "✅ View erstellt: WEBROOT/src/MVC/View/{$key}.php\n";
|
||||
} else {
|
||||
echo "⚠️ View existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Route hinzufügen
|
||||
if ($doRoute) {
|
||||
if (file_exists($routesFile)) {
|
||||
$routesContent = file_get_contents($routesFile);
|
||||
$routeLine = "\$router->add('{$key}', \\MVC\\Controller\\{$className}Controller::class, '{$key}'" . ($isAuth ? ", ['auth']" : "") . ");\n";
|
||||
|
||||
if (strpos($routesContent, "'{$key}'") === false) {
|
||||
file_put_contents($routesFile, $routesContent . $routeLine);
|
||||
echo "✅ Route hinzugefügt: {$routesFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Route für '{$key}' existiert bereits in routes.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: routes.php nicht gefunden!\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Navigation hinzufügen
|
||||
if ($doNav) {
|
||||
if (file_exists($navFile)) {
|
||||
$navContent = file_get_contents($navFile);
|
||||
$authStr = $isAuth ? 'true' : 'false';
|
||||
$navItem = " '{$key}' => ['label' => '{$label}', 'auth' => {$authStr}],\n";
|
||||
|
||||
if (strpos($navContent, "'{$key}'") === false) {
|
||||
// Wir suchen nach dem Ende des Arrays ];
|
||||
$newNavContent = preg_replace('/(\];\s*)$/', $navItem . '$1', trim($navContent));
|
||||
file_put_contents($navFile, $newNavContent . "\n");
|
||||
echo "✅ Navigation hinzugefügt: {$navFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: navigation.php nicht gefunden!\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\nFertig!\n";
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Web Server (Apache + PHP)
|
||||
web:
|
||||
build: .
|
||||
container_name: mvc_web
|
||||
ports:
|
||||
- "8080:80"
|
||||
volumes:
|
||||
- .:/var/www/html
|
||||
environment:
|
||||
- APP_ENV=dev
|
||||
depends_on:
|
||||
- db
|
||||
networks:
|
||||
- mvc_network
|
||||
|
||||
# Database (MariaDB)
|
||||
db:
|
||||
image: mariadb:10.11
|
||||
container_name: mvc_db
|
||||
restart: always
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: root_password
|
||||
MARIADB_DATABASE: mvc_database
|
||||
MARIADB_USER: mvc_user
|
||||
MARIADB_PASSWORD: mvc_password
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mvc_db_data:/var/lib/mysql
|
||||
networks:
|
||||
- mvc_network
|
||||
|
||||
networks:
|
||||
mvc_network:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
mvc_db_data:
|
||||
@@ -1245,9 +1245,9 @@ Api::jsonResponse((new ApiController())->get());
|
||||
</section>
|
||||
|
||||
<section id="generators">
|
||||
<h2>6. CLI-Generatoren</h2>
|
||||
<p><code>php create_module.php [Name]</code> - Erstellt Controller & View.</p>
|
||||
<p><code>php create_model.php [Tabelle] [Spalten]</code> - Erstellt ein Model.</p>
|
||||
<h2>6. CLI-Generator</h2>
|
||||
<p><code>php make.php module [Name]</code> - Erstellt Controller, View, Route & Nav.</p>
|
||||
<p><code>php make.php model [Tabelle] [Spalten]</code> - Erstellt ein Model.</p>
|
||||
</section>
|
||||
|
||||
<section id="mailing">
|
||||
@@ -1389,12 +1389,9 @@ try {
|
||||
|
||||
$headerActions = '<button class="btn-toggle" onclick="toggleTheme()">🌓 Theme umschalten</button>';
|
||||
if (isset($_SESSION['user_logged_in'])) {
|
||||
$headerActions = '<span style="margin-right: 15px; font-size: 0.9rem;">👤 ' . htmlspecialchars($_SESSION['username']) . '</span>' .
|
||||
'<a href="?service=logout" class="btn-toggle" style="text-decoration: none; background: rgba(255,255,255,0.2); margin-right: 10px;">🚪 Logout</a> ' .
|
||||
$headerActions;
|
||||
$headerActions = '<span style="margin-right: 15px; font-size: 0.9rem;">👤 ' . htmlspecialchars($_SESSION['username']) . '</span>' . '<a href="?service=logout" class="btn-toggle" style="text-decoration: none; background: rgba(255,255,255,0.2); margin-right: 10px;">🚪 Logout</a> ' . $headerActions;
|
||||
} else {
|
||||
$headerActions = '<a href="?service=login" class="btn-toggle" style="text-decoration: none; background: var(--accent); color: white; margin-right: 10px;">🔑 Login</a> ' .
|
||||
$headerActions;
|
||||
$headerActions = '<a href="?service=login" class="btn-toggle" style="text-decoration: none; background: var(--accent); color: white; margin-right: 10px;">🔑 Login</a> ' . $headerActions;
|
||||
}
|
||||
$layout->setBlock('header_actions', $headerActions);
|
||||
|
||||
@@ -1429,48 +1426,89 @@ try {
|
||||
}
|
||||
PHP;
|
||||
|
||||
// --- GENERATOR: create_model.php ---
|
||||
$files['create_model.php'] = <<<'PHP'
|
||||
// --- GENERATOR: make.php ---
|
||||
$files['make.php'] = <<<'PHP'
|
||||
<?php
|
||||
/**
|
||||
* MVC Model Generator
|
||||
* Nutzung: php create_model.php <TabellenName> <Spalte1,Spalte2,...>
|
||||
* MVC Unified CLI Tool
|
||||
* Nutzung: php make.php <command> [args]
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Dieses Script muss über die CLI ausgeführt werden.\n");
|
||||
}
|
||||
|
||||
$tableName = $argv[1] ?? null;
|
||||
$columnsInput = $argv[2] ?? null;
|
||||
$command = $argv[1] ?? null;
|
||||
|
||||
// Interaktive Abfrage, falls Argumente fehlen
|
||||
if (!$tableName) {
|
||||
echo "Tabellenname eingeben (z.B. Benutzer): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$tableName = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
if (!$command || in_array($command, ['help', '-h', '--help'])) {
|
||||
showHelp();
|
||||
exit;
|
||||
}
|
||||
|
||||
if (!$columnsInput) {
|
||||
echo "Spalten kommagetrennt eingeben (z.B. NAME,EMAIL,ROLLE): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$columnsInput = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
switch ($command) {
|
||||
case 'model':
|
||||
createModel(array_slice($argv, 2));
|
||||
break;
|
||||
case 'module':
|
||||
createModule(array_slice($argv, 2));
|
||||
break;
|
||||
default:
|
||||
echo "❌ Unbekannter Befehl: $command\n";
|
||||
showHelp();
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!$tableName) die("Fehler: Kein Tabellenname angegeben.\n");
|
||||
function showHelp() {
|
||||
echo "MVC CLI Tool\n";
|
||||
echo "-----------\n";
|
||||
echo "Nutzung: php make.php <befehl> [optionen]\n\n";
|
||||
echo "Befehle:\n";
|
||||
echo " model Erstellt ein neues Model basierend auf einer Datenbanktabelle\n";
|
||||
echo " module Erstellt ein neues Modul (Controller, View, Route, Navigation)\n\n";
|
||||
echo "Details zu model:\n";
|
||||
echo " php make.php model <TabellenName> <Spalte1,Spalte2,...>\n\n";
|
||||
echo "Details zu module:\n";
|
||||
echo " php make.php module <Name> [optionen]\n";
|
||||
echo " Optionen:\n";
|
||||
echo " -c, --controller Nur Controller erstellen\n";
|
||||
echo " -v, --view Nur View erstellen\n";
|
||||
echo " -r, --route Nur Route hinzufügen\n";
|
||||
echo " -n, --nav Nur Navigationspunkt hinzufügen\n";
|
||||
echo " -a, --auth Route/Nav erfordert Login\n";
|
||||
echo " -l, --label Label für Navigationspunkt\n";
|
||||
}
|
||||
|
||||
// Namen formatieren
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower($tableName))));
|
||||
$modelFile = __DIR__ . "/WEBROOT/src/MVC/Model/{$className}.php";
|
||||
function createModel($args) {
|
||||
$tableName = $args[0] ?? null;
|
||||
$columnsInput = $args[1] ?? null;
|
||||
|
||||
// Spalten aufbereiten
|
||||
$columns = array_map('trim', explode(',', $columnsInput));
|
||||
$columnList = implode("', '", $columns);
|
||||
// Interaktive Abfrage, falls Argumente fehlen
|
||||
if (!$tableName) {
|
||||
echo "Tabellenname eingeben (z.B. Benutzer): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$tableName = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
// Model-Inhalt generieren
|
||||
$content = <<<PHPMODEL
|
||||
if (!$columnsInput) {
|
||||
echo "Spalten kommagetrennt eingeben (z.B. NAME,EMAIL,ROLLE): ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$columnsInput = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
|
||||
if (!$tableName) die("❌ Fehler: Kein Tabellenname angegeben.\n");
|
||||
|
||||
// Namen formatieren
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', strtolower($tableName))));
|
||||
$modelFile = __DIR__ . "/WEBROOT/src/MVC/Model/{$className}.php";
|
||||
|
||||
// Spalten aufbereiten
|
||||
$columns = array_map('trim', explode(',', $columnsInput));
|
||||
$columnList = implode("', '", $columns);
|
||||
|
||||
// Model-Inhalt generieren
|
||||
$content = <<<PHPMODEL
|
||||
<?php
|
||||
|
||||
namespace MVC\Model;
|
||||
@@ -1495,114 +1533,74 @@ class {$className} extends Model {
|
||||
}
|
||||
PHPMODEL;
|
||||
|
||||
// Datei schreiben
|
||||
if (!is_dir(dirname($modelFile))) {
|
||||
mkdir(dirname($modelFile), 0755, true);
|
||||
}
|
||||
// Datei schreiben
|
||||
if (!is_dir(dirname($modelFile))) {
|
||||
mkdir(dirname($modelFile), 0755, true);
|
||||
}
|
||||
|
||||
if (!file_exists($modelFile)) {
|
||||
file_put_contents($modelFile, $content);
|
||||
echo "✅ Model erstellt: WEBROOT/src/MVC/Model/{$className}.php\n";
|
||||
echo "--- INFO ---\n";
|
||||
echo "Tabelle: {$tableName}\n";
|
||||
echo "Klasse: MVC\\Model\\{$className}\n";
|
||||
echo "Spalten: " . implode(', ', $columns) . "\n";
|
||||
} else {
|
||||
echo "⚠️ Model {$className}.php existiert bereits.\n";
|
||||
}
|
||||
PHP;
|
||||
|
||||
// --- GENERATOR: create_module.php ---
|
||||
$files['create_module.php'] = <<<'PHP'
|
||||
<?php
|
||||
/**
|
||||
* MVC Module Generator for Gemini CLI Project
|
||||
* Nutzung: php create_module.php <name> [options]
|
||||
*
|
||||
* Optionen:
|
||||
* --controller, -c Nur Controller erstellen
|
||||
* --view, -v Nur View erstellen
|
||||
* --route, -r Nur Route hinzufügen
|
||||
* --nav, -n Nur Navigationspunkt hinzufügen
|
||||
* --auth, -a Route/Nav erfordert Login
|
||||
* --label, -l Label für Navigationspunkt
|
||||
*/
|
||||
|
||||
if (php_sapi_name() !== 'cli') {
|
||||
die("Dieses Script kann nur über die Kommandozeile ausgeführt werden.\n");
|
||||
}
|
||||
|
||||
$shortopts = "cvrnal:h";
|
||||
$longopts = ["controller", "view", "route", "nav", "auth", "label:", "help"];
|
||||
// Flags und Optionen initialisieren
|
||||
$options = getopt($shortopts, $longopts);
|
||||
|
||||
// Namen und Flags aus argv extrahieren (robuster als getopt allein)
|
||||
$name = null;
|
||||
$manualFlags = [];
|
||||
foreach ($argv as $i => $arg) {
|
||||
if ($i === 0) continue;
|
||||
|
||||
if (strpos($arg, '-') === 0) {
|
||||
$flag = ltrim($arg, '-');
|
||||
$manualFlags[] = $flag;
|
||||
} else if ($name === null) {
|
||||
$name = $arg;
|
||||
if (!file_exists($modelFile)) {
|
||||
file_put_contents($modelFile, $content);
|
||||
echo "✅ Model erstellt: WEBROOT/src/MVC/Model/{$className}.php\n";
|
||||
echo "--- INFO ---\n";
|
||||
echo "Tabelle: {$tableName}\n";
|
||||
echo "Klasse: MVC\\Model\\{$className}\n";
|
||||
echo "Spalten: " . implode(', ', $columns) . "\n";
|
||||
} else {
|
||||
echo "⚠️ Model {$className}.php existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
|
||||
// Flags setzen (getopt + manuelle Suche für Flexibilität)
|
||||
$hasFlag = function($short, $long) use ($options, $manualFlags) {
|
||||
return isset($options[$short]) || isset($options[$long]) || in_array($short, $manualFlags) || in_array($long, $manualFlags);
|
||||
};
|
||||
function createModule($args) {
|
||||
// Da wir args als Slice übergeben, müssen wir sie manuell parsen
|
||||
$name = null;
|
||||
$manualFlags = [];
|
||||
$label = null;
|
||||
|
||||
$doController = $hasFlag('c', 'controller');
|
||||
$doView = $hasFlag('v', 'view');
|
||||
$doRoute = $hasFlag('r', 'route');
|
||||
$doNav = $hasFlag('n', 'nav');
|
||||
$isAuth = $hasFlag('a', 'auth');
|
||||
|
||||
// Wenn gar keine spezifischen Flags gesetzt wurden, mache alles
|
||||
$doAll = !($doController || $doView || $doRoute || $doNav);
|
||||
if ($doAll) {
|
||||
$doController = $doView = $doRoute = $doNav = true;
|
||||
}
|
||||
|
||||
$label = $options['l'] ?? $options['label'] ?? null;
|
||||
// Falls -l nach dem Namen kam, könnte getopt es verfehlt haben
|
||||
if (!$label) {
|
||||
foreach ($argv as $i => $arg) {
|
||||
if (($arg === '-l' || $arg === '--label') && isset($argv[$i+1])) {
|
||||
$label = $argv[$i+1];
|
||||
break;
|
||||
for ($i = 0; $i < count($args); $i++) {
|
||||
$arg = $args[$i];
|
||||
if ($arg === '-l' || $arg === '--label') {
|
||||
$label = $args[++$i] ?? null;
|
||||
} else if (strpos($arg, '-') === 0) {
|
||||
$flag = ltrim($arg, '-');
|
||||
$manualFlags[] = $flag;
|
||||
} else if ($name === null) {
|
||||
$name = $arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$name) {
|
||||
echo "Bitte gib einen Namen für das Modul an: ";
|
||||
$handle = fopen("php://stdin", "r");
|
||||
$name = trim(fgets($handle));
|
||||
fclose($handle);
|
||||
}
|
||||
if (!$name) {
|
||||
echo "❌ Fehler: Kein Modulname angegeben.\n";
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$name) {
|
||||
die("Fehler: Kein Name angegeben.\n");
|
||||
}
|
||||
$hasFlag = function($short, $long) use ($manualFlags) {
|
||||
return in_array($short, $manualFlags) || in_array($long, $manualFlags);
|
||||
};
|
||||
|
||||
// Namen formatieren
|
||||
$key = strtolower(str_replace(' ', '_', $name));
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
|
||||
$label = $label ?: ucwords(str_replace('_', ' ', $key));
|
||||
$doController = $hasFlag('c', 'controller');
|
||||
$doView = $hasFlag('v', 'view');
|
||||
$doRoute = $hasFlag('r', 'route');
|
||||
$doNav = $hasFlag('n', 'nav');
|
||||
$isAuth = $hasFlag('a', 'auth');
|
||||
|
||||
$controllerFile = __DIR__ . "/WEBROOT/src/MVC/Controller/{$className}Controller.php";
|
||||
$viewFile = __DIR__ . "/WEBROOT/src/MVC/View/{$key}.php";
|
||||
$routesFile = __DIR__ . "/WEBROOT/src/config/routes.php";
|
||||
$navFile = __DIR__ . "/WEBROOT/src/config/navigation.php";
|
||||
// Wenn gar keine spezifischen Flags gesetzt wurden, mache alles
|
||||
if (!($doController || $doView || $doRoute || $doNav)) {
|
||||
$doController = $doView = $doRoute = $doNav = true;
|
||||
}
|
||||
|
||||
// 1. Controller erstellen
|
||||
if ($doController) {
|
||||
$controllerContent = <<<PHPCTRL
|
||||
// Namen formatieren
|
||||
$key = strtolower(str_replace(' ', '_', $name));
|
||||
$className = str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
|
||||
$label = $label ?: ucwords(str_replace('_', ' ', $key));
|
||||
|
||||
$controllerFile = __DIR__ . "/WEBROOT/src/MVC/Controller/{$className}Controller.php";
|
||||
$viewFile = __DIR__ . "/WEBROOT/src/MVC/View/{$key}.php";
|
||||
$routesFile = __DIR__ . "/WEBROOT/src/config/routes.php";
|
||||
$navFile = __DIR__ . "/WEBROOT/src/config/navigation.php";
|
||||
|
||||
// 1. Controller erstellen
|
||||
if ($doController) {
|
||||
$controllerContent = <<<PHPCTRL
|
||||
<?php
|
||||
|
||||
namespace MVC\Controller;
|
||||
@@ -1627,17 +1625,17 @@ class {$className}Controller extends Controller {
|
||||
}
|
||||
PHPCTRL;
|
||||
|
||||
if (!file_exists($controllerFile)) {
|
||||
file_put_contents($controllerFile, $controllerContent);
|
||||
echo "✅ Controller erstellt: WEBROOT/src/MVC/Controller/{$className}Controller.php\\n";
|
||||
} else {
|
||||
echo "⚠️ Controller existiert bereits.\\n";
|
||||
if (!file_exists($controllerFile)) {
|
||||
file_put_contents($controllerFile, $controllerContent);
|
||||
echo "✅ Controller erstellt: WEBROOT/src/MVC/Controller/{$className}Controller.php\n";
|
||||
} else {
|
||||
echo "⚠️ Controller existiert bereits.\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. View erstellen
|
||||
if ($doView) {
|
||||
$viewContent = <<<HTML
|
||||
// 2. View erstellen
|
||||
if ($doView) {
|
||||
$viewContent = <<<HTML
|
||||
<h2><?= htmlspecialchars(\$title) ?></h2>
|
||||
<div class="card">
|
||||
<p><?= htmlspecialchars(\$message) ?></p>
|
||||
@@ -1654,52 +1652,53 @@ if ($doView) {
|
||||
</style>
|
||||
HTML;
|
||||
|
||||
if (!file_exists($viewFile)) {
|
||||
file_put_contents($viewFile, $viewContent);
|
||||
echo "✅ View erstellt: WEBROOT/src/MVC/View/{$key}.php\\n";
|
||||
} else {
|
||||
echo "⚠️ View existiert bereits.\\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Route hinzufügen
|
||||
if ($doRoute) {
|
||||
if (file_exists($routesFile)) {
|
||||
$routesContent = file_get_contents($routesFile);
|
||||
$routeLine = "\$router->add('{$key}', \\\\MVC\\\\Controller\\\\{$className}Controller::class, '{$key}'" . (\$isAuth ? ", ['auth']" : "") . ");\\n";
|
||||
|
||||
if (strpos($routesContent, "'{$key}'") === false) {
|
||||
file_put_contents($routesFile, \$routesContent . \$routeLine);
|
||||
echo "✅ Route hinzugefügt: {\$routesFile}\\n";
|
||||
if (!file_exists($viewFile)) {
|
||||
file_put_contents($viewFile, $viewContent);
|
||||
echo "✅ View erstellt: WEBROOT/src/MVC/View/{$key}.php\n";
|
||||
} else {
|
||||
echo "⚠️ Route für '{$key}' existiert bereits in routes.php\\n";
|
||||
echo "⚠️ View existiert bereits.\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: routes.php nicht gefunden!\\n";
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Navigation hinzufügen
|
||||
if ($doNav) {
|
||||
if (file_exists($navFile)) {
|
||||
$navContent = file_get_contents($navFile);
|
||||
$authStr = \$isAuth ? 'true' : 'false';
|
||||
$navItem = " '{$key}' => ['label' => '{$label}', 'auth' => {\$authStr}],\\n";
|
||||
|
||||
if (strpos($navContent, "'{$key}'") === false) {
|
||||
// Wir suchen nach dem Ende des Arrays ];
|
||||
\$newNavContent = preg_replace('/(\\];\\s*)$/', \$navItem . '$1', trim(\$navContent));
|
||||
file_put_contents($navFile, \$newNavContent . "\\n");
|
||||
echo "✅ Navigation hinzugefügt: {\$navFile}\\n";
|
||||
// 3. Route hinzufügen
|
||||
if ($doRoute) {
|
||||
if (file_exists($routesFile)) {
|
||||
$routesContent = file_get_contents($routesFile);
|
||||
$routeLine = "\$router->add('{$key}', \\MVC\\Controller\\{$className}Controller::class, '{$key}'" . ($isAuth ? ", ['auth']" : "") . ");\n";
|
||||
|
||||
if (strpos($routesContent, "'{$key}'") === false) {
|
||||
file_put_contents($routesFile, $routesContent . $routeLine);
|
||||
echo "✅ Route hinzugefügt: {$routesFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Route für '{$key}' existiert bereits in routes.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\\n";
|
||||
echo "❌ Fehler: routes.php nicht gefunden!\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: navigation.php nicht gefunden!\\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\\nFertig!\\n";
|
||||
// 4. Navigation hinzufügen
|
||||
if ($doNav) {
|
||||
if (file_exists($navFile)) {
|
||||
$navContent = file_get_contents($navFile);
|
||||
$authStr = $isAuth ? 'true' : 'false';
|
||||
$navItem = " '{$key}' => ['label' => '{$label}', 'auth' => {$authStr}],\n";
|
||||
|
||||
if (strpos($navContent, "'{$key}'") === false) {
|
||||
// Wir suchen nach dem Ende des Arrays ];
|
||||
$newNavContent = preg_replace('/(\];\s*)$/', $navItem . '$1', trim($navContent));
|
||||
file_put_contents($navFile, $newNavContent . "\n");
|
||||
echo "✅ Navigation hinzugefügt: {$navFile}\n";
|
||||
} else {
|
||||
echo "⚠️ Navigation für '{$key}' existiert bereits in navigation.php\n";
|
||||
}
|
||||
} else {
|
||||
echo "❌ Fehler: navigation.php nicht gefunden!\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\nFertig!\n";
|
||||
}
|
||||
PHP;
|
||||
|
||||
|
||||
@@ -1775,7 +1774,13 @@ PHP;
|
||||
|
||||
// 3. Dateien schreiben
|
||||
foreach ($files as $file => $content) {
|
||||
$path = $baseDir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $file);
|
||||
// Docker-Dateien und die .code-workspace Datei sollen im Verzeichnis der init.php (Root) landen
|
||||
if ($file === 'Dockerfile' || $file === 'docker-compose.yml' || str_ends_with($file, '.code-workspace')) {
|
||||
$path = getcwd() . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $file);
|
||||
} else {
|
||||
$path = $baseDir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $file);
|
||||
}
|
||||
|
||||
file_put_contents($path, $content);
|
||||
echo "📄 Datei erstellt: $file\n";
|
||||
}
|
||||
@@ -1784,5 +1789,6 @@ echo "\n✨ Projekt '$projectName' wurde initialisiert!\n";
|
||||
echo "1. Richte deine Datenbankverbindung in WEBROOT/src/config/env.ini ein.\n";
|
||||
echo "2. Datenbank installieren: php install_db.php\n";
|
||||
echo " (Ohne Tabelle werden Logs in /logs/ gespeichert)\n";
|
||||
echo "3. Starten: php server.php\n";
|
||||
echo "4. Öffnen: http://localhost:8000\n";
|
||||
echo "3. CLI-Tool nutzen: php make.php help\n";
|
||||
echo "4. Starten: php server.php\n";
|
||||
echo "5. Öffnen: http://localhost:8000\n";
|
||||
Reference in new issue
Block a user