273 lines
7.8 KiB
PHP
273 lines
7.8 KiB
PHP
<?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);
|
|
$navItem = " '{$key}' => ['label' => '{$label}'],\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";
|
|
} |