DokuDetailAction.php
Pfad: src/Infrastructure/Http/DokuDetailAction.php
Ext: php
Größe: 3364 Bytes
Geändert: 2026-07-16 08:36:23+02
<?php
declare(strict_types=1);
namespace Demo\Infrastructure\Http;
use Demo\Application\Dokumentation\ListeDokumentationVersionen;
use Demo\Application\Dokumentation\ZeigeDokumentation;
use Demo\Application\Dokumentation\ZeigeDokumentationVersion;
use Demo\Infrastructure\Content\MarkdownToHtml;
/**
* Treibender Adapter: zeigt /doku/{slug} mit In-Place-Editor und Versionsliste
* sowie /doku/{slug}/{version} als read-only Snapshot (ohne Editor/Historie).
*/
final class DokuDetailAction
{
/** @var ZeigeDokumentation Aktuelle Fassung. */
private ZeigeDokumentation $zeige;
/** @var ListeDokumentationVersionen Versionsliste. */
private ListeDokumentationVersionen $listeVersionen;
/** @var ZeigeDokumentationVersion Historischer Snapshot. */
private ZeigeDokumentationVersion $zeigeVersion;
/** @var MarkdownToHtml Renderer fuer den Markdown-Body. */
private MarkdownToHtml $markdown;
/** @var TemplateRenderer Template-Renderer. */
private TemplateRenderer $view;
/** @var Navigation Hauptnavigation. */
private Navigation $nav;
/**
* @param ZeigeDokumentation $zeige Aktuelle Fassung.
* @param ListeDokumentationVersionen $listeVersionen Versionsliste.
* @param ZeigeDokumentationVersion $zeigeVersion Historischer Snapshot.
* @param MarkdownToHtml $markdown Markdown-Renderer.
* @param TemplateRenderer $view Renderer.
* @param Navigation $nav Navigation.
*/
public function __construct(
ZeigeDokumentation $zeige,
ListeDokumentationVersionen $listeVersionen,
ZeigeDokumentationVersion $zeigeVersion,
MarkdownToHtml $markdown,
TemplateRenderer $view,
Navigation $nav
) {
$this->zeige = $zeige;
$this->listeVersionen = $listeVersionen;
$this->zeigeVersion = $zeigeVersion;
$this->markdown = $markdown;
$this->view = $view;
$this->nav = $nav;
}
/**
* Baut die aktuelle Detailseite oder eine read-only Versionsseite; sonst 404.
*
* @param array<string,string> $params Routen-Parameter (slug, optional version).
* @return Response HTML-Antwort.
*/
public function __invoke(array $params): Response
{
$slug = $params['slug'] ?? '';
$version = $params['version'] ?? null;
if ($version !== null) {
$dok = $this->zeigeVersion->execute($slug, (int) $version);
$versionen = [];
$editierbar = false;
} else {
$dok = $this->zeige->execute($slug);
$versionen = $dok === null ? [] : $this->listeVersionen->execute($slug);
$editierbar = true;
}
if ($dok === null) {
return new Response(404, 'text/plain; charset=UTF-8', 'Nicht gefunden');
}
$html = $this->view->render('layout', [
'inner' => 'doku-detail',
'titel' => $dok->titel,
'aktiv' => '/doku',
'nav' => $this->nav->items(),
'dok' => $dok,
'inhaltHtml' => $this->markdown->render($dok->body),
'editierbar' => $editierbar,
'versionen' => $versionen,
]);
return new Response(200, 'text/html; charset=UTF-8', $html);
}
}