feat: add PHPUnit test infrastructure and Router tests
All checks were successful
Deploy Feature Branch to Test / deploy (push) Successful in 28s
Lint / PHP Syntax Check (push) Successful in 36s
Lint / CSS Lint (stylelint) (push) Successful in 1m18s
Lint / HTML Lint (htmlhint) (push) Successful in 1m11s
Lint / PHP Syntax Check (pull_request) Successful in 37s
Lint / CSS Lint (stylelint) (pull_request) Successful in 1m20s
Lint / HTML Lint (htmlhint) (pull_request) Successful in 1m13s
All checks were successful
Deploy Feature Branch to Test / deploy (push) Successful in 28s
Lint / PHP Syntax Check (push) Successful in 36s
Lint / CSS Lint (stylelint) (push) Successful in 1m18s
Lint / HTML Lint (htmlhint) (push) Successful in 1m11s
Lint / PHP Syntax Check (pull_request) Successful in 37s
Lint / CSS Lint (stylelint) (pull_request) Successful in 1m20s
Lint / HTML Lint (htmlhint) (pull_request) Successful in 1m13s
- Add composer.json with PHPUnit 11 and PSR-4 autoloading - Add phpunit.xml configuration - Rename app/core/ → app/Core/ and app/controllers/ → app/Controllers/ (PSR-4) - Add 18 unit tests for App\Core\Router (31 assertions) - addRoute(): default action, custom action, overwrite - dispatch(): URL normalization, direct match, legacy redirects - dispatch(): 404 handling, controller/action not found exceptions - TestableRouter subclass to intercept side-effects - Update .gitignore (vendor/, .phpunit.cache/)
This commit is contained in:
46
app/Core/View.php
Normal file
46
app/Core/View.php
Normal file
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Core;
|
||||
|
||||
class View
|
||||
{
|
||||
private string $viewsPath;
|
||||
private array $data = [];
|
||||
|
||||
public function __construct(?string $viewsPath = null)
|
||||
{
|
||||
$this->viewsPath = $viewsPath ?? dirname(__DIR__) . '/views';
|
||||
}
|
||||
|
||||
public function assign(string $key, mixed $value): void
|
||||
{
|
||||
$this->data[$key] = $value;
|
||||
}
|
||||
|
||||
public function render(string $view, string $layout = 'main'): void
|
||||
{
|
||||
$viewFile = $this->viewsPath . '/' . $view . '.php';
|
||||
$layoutFile = $this->viewsPath . '/layouts/' . $layout . '.php';
|
||||
|
||||
if (!file_exists($viewFile)) {
|
||||
throw new \RuntimeException("View {$view} nicht gefunden: {$viewFile}");
|
||||
}
|
||||
|
||||
if (!file_exists($layoutFile)) {
|
||||
throw new \RuntimeException("Layout {$layout} nicht gefunden: {$layoutFile}");
|
||||
}
|
||||
|
||||
// Extract data to variables for the view
|
||||
extract($this->data, EXTR_SKIP);
|
||||
|
||||
// Capture view content
|
||||
ob_start();
|
||||
require $viewFile;
|
||||
$content = ob_get_clean();
|
||||
|
||||
// Render layout with $content
|
||||
require $layoutFile;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user