Files
Backend/init_mvc.php
T
2026-05-21 14:13:05 +02:00

311 lines
11 KiB
PHP

<?php
/**
* Ultimate MVC Project Bootstrapper (Fixed Version with Header)
* Erstellt ein voll funktionsfähiges Projekt inkl. Dev-Server, Header, DarkMode & freiem Zugriff.
*/
if (php_sapi_name() !== 'cli') {
die("Dieses Script muss über die CLI ausgeführt werden.\n");
}
$projectName = $argv[1] ?? null;
if (!$projectName) {
echo "Bitte gib einen Projektnamen an: ";
$handle = fopen("php://stdin", "r");
$projectName = trim(fgets($handle));
fclose($handle);
}
if (!$projectName) die("Fehler: Kein Name angegeben.\n");
$baseDir = getcwd() . DIRECTORY_SEPARATOR . $projectName;
// 1. Verzeichnisstruktur erstellen
$dirs = [
'',
'WEBROOT',
'WEBROOT/api',
'WEBROOT/api/v1',
'WEBROOT/static',
'WEBROOT/src',
'WEBROOT/src/config',
'WEBROOT/src/database',
'WEBROOT/src/MVC',
'WEBROOT/src/MVC/Core',
'WEBROOT/src/MVC/Controller',
'WEBROOT/src/MVC/Model',
'WEBROOT/src/MVC/View',
'WEBROOT/src/MVC/Layout',
'WEBROOT/src/MVC/Layout/Templates',
];
foreach ($dirs as $dir) {
$path = $baseDir . ($dir ? DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $dir) : '');
if (!is_dir($path)) {
mkdir($path, 0755, true);
echo "📁 Ordner erstellt: $dir\n";
}
}
$files = [];
// --- DEV SERVER: server.php ---
$files['server.php'] = <<<'PHP'
<?php
$port = 8000;
$host = 'localhost';
$root = __DIR__ . '/WEBROOT';
echo "\n🚀 Starte MVC Dev-Server auf http://$host:$port\n";
echo "Drücke STRG+C zum Beenden.\n\n";
passthru("php -S $host:$port -t \"$root\"");
PHP;
// --- CONFIG: env.ini ---
$files['WEBROOT/src/config/env.ini'] = <<<INI
[database]
APP_ENV = "dev"
DB_DEV_HOST = "localhost"
DB_DEV_USERNAME = "root"
DB_DEV_PASSWORD = ""
DB_DEV_DATABASE = "mein_projekt"
INI;
// --- DB: databaseConnect.php ---
$files['WEBROOT/src/database/databaseConnect.php'] = <<<'PHP'
<?php
function db_connect() {
$config = parse_ini_file(__DIR__ . '/../config/env.ini');
$env = strtoupper($config['APP_ENV']);
try {
$conn = new mysqli($config["DB_{$env}_HOST"], $config["DB_{$env}_USERNAME"], $config["DB_{$env}_PASSWORD"], $config["DB_{$env}_DATABASE"]);
$conn->set_charset("utf8mb4");
return $conn;
} catch (Exception $e) { return null; }
}
PHP;
// --- CORE ---
$files['WEBROOT/src/MVC/Core/Controller.php'] = <<<'PHP'
<?php
namespace MVC\Core;
class Controller {
protected $view;
public function __construct() { $this->view = new View(__DIR__ . '/../View'); }
protected function render($template, $data = []) {
foreach ($data as $key => $value) { $this->view->assign($key, $value); }
return $this->view->render($template);
}
protected function json($data, $status = 200) {
header('Content-Type: application/json');
http_response_code($status);
echo json_encode($data);
exit;
}
}
PHP;
$files['WEBROOT/src/MVC/Core/Model.php'] = <<<'PHP'
<?php
namespace MVC\Core;
abstract class Model {
protected static $table;
public static function query($sql, ...$params) {
require_once __DIR__ . '/../../database/databaseConnect.php';
$conn = db_connect();
if (!$conn) return null;
if (empty($params)) return $conn->query($sql);
$stmt = $conn->prepare($sql);
$types = str_repeat('s', count($params));
$stmt->bind_param($types, ...$params);
$stmt->execute();
return $stmt->get_result();
}
}
PHP;
$files['WEBROOT/src/MVC/Core/View.php'] = <<<'PHP'
<?php
namespace MVC\Core;
class View {
protected $data = [];
protected $viewPath;
public function __construct($viewPath) { $this->viewPath = $viewPath; }
public function assign($key, $value) { $this->data[$key] = $value; }
public function render($template) {
extract($this->data);
$file = $this->viewPath . '/' . $template . '.php';
if (file_exists($file)) { ob_start(); include $file; return ob_get_clean(); }
return "View $template nicht gefunden.";
}
}
PHP;
$files['WEBROOT/src/MVC/Core/Router.php'] = <<<'PHP'
<?php
namespace MVC\Core;
class Router {
protected $routes = [];
public function add($service, $controller, $method, $middlewares = []) {
$this->routes[$service] = ['controller' => $controller, 'method' => $method, 'middlewares' => $middlewares];
}
public function dispatch($service) {
if (!isset($this->routes[$service])) throw new \Exception("Service '$service' nicht gefunden.");
$route = $this->routes[$service];
$controller = new $route['controller']();
$method = $route['method'];
return $controller->$method();
}
}
PHP;
$files['WEBROOT/src/MVC/Layout/Layout.php'] = <<<'PHP'
<?php
namespace MVC\Layout;
class Layout {
protected $blocks = [];
protected $template;
public function __construct($template = 'main') { $this->template = $template; }
public function setBlock($name, $content) { $this->blocks[$name] = $content; }
public function getBlock($name) { return $this->blocks[$name] ?? ''; }
public function render() {
$layoutFile = __DIR__ . '/Templates/' . $this->template . '.php';
if (file_exists($layoutFile)) { ob_start(); include $layoutFile; return ob_get_clean(); }
return "Layout template nicht gefunden.";
}
}
PHP;
$files['WEBROOT/src/MVC/autoloader.php'] = <<<'PHP'
<?php
spl_autoload_register(function ($class) {
$prefix = 'MVC\\'; $base_dir = __DIR__ . '/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) return;
$file = $base_dir . str_replace('\\', '/', substr($class, $len)) . '.php';
if (file_exists($file)) require $file;
});
PHP;
// --- LAYOUT TEMPLATE ---
$files['WEBROOT/src/MVC/Layout/Templates/main.php'] = <<<'HTML'
<!DOCTYPE html>
<html lang="de" class="<?= ($_SESSION['theme'] ?? 'light') === 'dark' ? 'dark-mode' : '' ?>">
<head>
<meta charset="UTF-8">
<title><?= $this->getBlock('title') ?></title>
<style>
:root { --bg: #ffffff; --text: #333; --sidebar: #f4f4f4; --header: #007bff; --accent: #007bff; --border: #ddd; }
.dark-mode { --bg: #1a1a1a; --text: #f4f4f4; --sidebar: #252525; --header: #111; --accent: #3498db; --border: #333; }
body { font-family: 'Segoe UI', sans-serif; margin: 0; background: var(--bg); color: var(--text); transition: 0.3s; height: 100vh; overflow: hidden; display: flex; flex-direction: column; }
.main-header { height: 60px; background: var(--header); color: white; display: flex; align-items: center; justify-content: space-between; padding: 0 20px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); z-index: 10; }
.main-container { flex: 1; display: flex; overflow: hidden; }
.sidebar { width: 260px; background: var(--sidebar); padding: 20px; border-right: 1px solid var(--border); overflow-y: auto; }
.content { flex: 1; padding: 40px; overflow-y: auto; }
.btn-toggle { padding: 8px 15px; border: 1px solid rgba(255,255,255,0.3); border-radius: 5px; cursor: pointer; background: transparent; color: white; font-size: 0.9rem; }
.btn-toggle:hover { background: rgba(255,255,255,0.1); }
nav a { display: block; padding: 12px; text-decoration: none; color: inherit; border-radius: 5px; margin-bottom: 5px; }
nav a:hover { background: rgba(0,0,0,0.05); }
.logo { font-size: 1.4rem; font-weight: bold; }
</style>
</head>
<body>
<header class="main-header">
<div class="logo"><?= $this->getBlock('header_title') ?></div>
<div class="header-actions">
<?= $this->getBlock('header_actions') ?>
</div>
</header>
<div class="main-container">
<div class="sidebar">
<?= $this->getBlock('sidebar') ?>
</div>
<div class="content">
<?= $this->getBlock('content') ?>
</div>
</div>
<script>
function toggleTheme() { fetch('?service=toggle_theme').then(() => location.reload()); }
</script>
</body>
</html>
HTML;
// --- CONTROLLERS ---
$files['WEBROOT/src/MVC/Controller/HomeController.php'] = <<<'PHP'
<?php
namespace MVC\Controller;
use MVC\Core\Controller;
class HomeController extends Controller {
public function index() { return $this->render('home'); }
public function toggle_theme() {
$_SESSION['theme'] = ($_SESSION['theme'] ?? 'light') === 'dark' ? 'light' : 'dark';
return $this->json(['success' => true]);
}
}
PHP;
$files['WEBROOT/src/MVC/Controller/TestController.php'] = <<<'PHP'
<?php
namespace MVC\Controller;
use MVC\Core\Controller;
class TestController extends Controller {
public function service1() { return $this->render('test1', ['msg' => 'Service 1 ist bereit!']); }
public function service2() { return $this->render('test2', ['data' => ['Layout' => 'Header + Sidebar', 'Theme' => 'Auto-Toggle']]); }
}
PHP;
// --- VIEWS ---
$files['WEBROOT/src/MVC/View/home.php'] = "<h1>Dashboard</h1><p>Willkommen in deinem neuen MVC-System mit integriertem Header.</p>";
$files['WEBROOT/src/MVC/View/test1.php'] = "<h1>Service 1</h1><p><?= \$msg ?></p>";
$files['WEBROOT/src/MVC/View/test2.php'] = "<h1>System Check</h1><ul><?php foreach(\$data as \$k => \$v): ?><li><b><?= \$k ?>:</b> <?= \$v ?></li><?php endforeach; ?></ul>";
// --- API ---
$files['WEBROOT/api/v1/get.php'] = "<?php header('Content-Type: application/json'); echo json_encode(['status' => 'online']);";
// --- ENTRY POINT ---
$files['WEBROOT/index.php'] = <<<'PHP'
<?php
session_start();
require_once __DIR__ . '/src/MVC/autoloader.php';
$service = $_GET['service'] ?? 'home';
try {
$router = new \MVC\Core\Router();
$router->add('home', \MVC\Controller\HomeController::class, 'index');
$router->add('toggle_theme', \MVC\Controller\HomeController::class, 'toggle_theme');
$router->add('test1', \MVC\Controller\TestController::class, 'service1');
$router->add('test2', \MVC\Controller\TestController::class, 'service2');
$layout = new \MVC\Layout\Layout('main');
$layout->setBlock('title', 'MVC Starter');
$layout->setBlock('header_title', '🚀 MVC Dashboard');
$layout->setBlock('header_actions', '<button class="btn-toggle" onclick="toggleTheme()">🌓 Theme umschalten</button>');
// Sidebar Block
ob_start();
?>
<nav>
<a href="?service=home">🏠 Home</a>
<a href="?service=test1">🛠️ Test 1</a>
<a href="?service=test2">📊 Test 2</a>
</nav>
<?php
$layout->setBlock('sidebar', ob_get_clean());
$layout->setBlock('content', $router->dispatch($service));
echo $layout->render();
} catch (\Exception $e) {
http_response_code(404); echo "<h1>404</h1><p>" . $e->getMessage() . "</p>";
}
PHP;
// 3. Dateien schreiben
foreach ($files as $file => $content) {
$path = $baseDir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $file);
file_put_contents($path, $content);
echo "📄 Datei erstellt: $file\n";
}
echo "\n✨ Projekt '$projectName' wurde mit HEADER initialisiert!\n";
echo "1. Starten: php server.php\n";
echo "2. Öffnen: http://localhost:8000\n";