Vorbereitungen in der htaccess
Bevor Sie jedoch den ersten PHP-Befehl für Ihr eigenes CMS schreiben, müssen Sie die Domain und das Serververzeichnis etwas vorbereiten. Dafür müssen Sie etwas über suchmaschinenfreundliche URL wissen. Sie können die verpflichtende index.php
mit den folgenden Requests implizit ansprechen:
www.domain.de/index.php?kategorie=music&beitrag=dawid-bowie
Parametrisierte URL
und
www.domain.de/music/dawid-bowie
Suchmaschinenfreundliche URL
Beide Varianten sind technisch betrachtet vollkommen korrekt und funktionieren wirklich tadellos, allerdings findet die Suchmaschine Google die erste Version der URL nicht so toll und straft solche Webseiten mit etwas schlechterem Ranking in den Suchergebnissen ab, da sie für das menschliche Auge etwas kompliziert zu entschlüsseln ist.
Suchmaschinen freundliche URL
Ihr eigenes CMS soll also eine canonische URL bzw. eine suchmaschinenfreundliche URL besitzen, daher werden alle Anfragen an die Webseite an die index.php
umgeleitet, dadurch empfängt das index.php
Script jedweden Request in der $_SERVER['REQUEST_URI'] und kann diese verarbeiten.
RewriteEngine On
RewriteBase /
# Process by index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [L]
# Prevent Filebrowsing
Options All -Indexes
die htaccess mit Umleitung auf index.php
Die Optionen -f
und -d
sorgen dafür, das die Umleitung für Files und Directorys gilt. Die Anweisung [L]
zeigt dem Interpreter, das es sich um den Letzten Befehl der RewriteCondition handelt.
Nützlicher Nebeneffekt dieser Technik ist, das Sie nach außen nicht offenbaren müssen, mit welchen internen Parametern Ihr eigenes CMS arbeitet, Sie verbergen die innere Struktur des Systems nach außen.
Das Startscript index.php
Durch die Umleitung in der htaccess
, kann das Startscript index.php
alle Anfragen des Lesers empfangen. Die Datei index.php
ist die Schaltzentrale und erste Einstiegspunkt des CMS. Mit dem Befehl require_once() werden zunächst alle weiteren PHP-Scripte dem System hinzugeladen die später gebraucht werden.
require_once('core/mvc/Controller.php');
require_once('core/mvc/Model.php');
require_once('core/mvc/View.php');
require_once('core/dipper/Dipper.php');
require_once('core/parsedown/Parsedown.php');
$url = 'content/'.$_SERVER['REQUEST_URI'];
if (substr($url, -1) == '/') $url = substr($url, 0, -1);
if (is_dir($url))
{
if(file_exists($url.'/index.md'))
{
$categorie = new Controller($url.'/index.md');
} else {
echo 'Kategorie: index.md nicht gefunden';
exit();
}
} else {
if(file_exists($url.'.md'))
{
$post = new Controller($url.'.md');
} else {
echo 'Beitrag: beitrag.md nicht gefunden';
exit();
}
}
Startscript index.php
Die Variable $url
wird den URL-Request des Lesers aufnehmen und es dem Beitragsverzeichnis content
zugewiesen. Der folgende if(substr(...)
soll dafür sorgen, das anhängende /
immer abgeschnitten werden, das macht die weitere Verarbeitung deutlich einfacher.
Im wesentlichen folgt mit if (is_dir($url))...
eine Kontrollstruktur, die untersucht, ob es sich bei der URL um eine Kategorie oder einen Beitrag handelt. In Abhängigkeit der logischen Auswertung, startet das Index-Script den dazugehörigen Controller
(derzeigt gibt es nur einen einzigen, universellen Controller).
Eine Kategorie mit der Datei
index.md
und ein Beitrag mitbeitrag.md
weisen die identische innere YAML Struktur auf und können daher von einem gemeinsamen Controller gleichermaßen verarbeitet werden, eine Trennung wäre daher nicht nötig.
Verzeichnis-Struktur
Das Projekt zur Entwicklung Ihres eigenen CMS ist in die folgende übersichtliche Verzeichnis-Struktur aufgeteilt.
root:
─────
│
├── content // hier liegt der Beitrags-Content
│ │
│ ├── kategorie-1 // eine Kategorie
│ │ │
│ │ ├── index.md // Beschreibung der Kategorie
│ │ ├── beitrag-1.md // erster Beitrag in der kategorie
│ │ └── beitrag-2.md // weitere Beiträge
│ │
│ └── kategorie-2
│ │
│ ├── index.md // Kategorie-Beschreibung
│ ├── beitrag-1.md // Beiträge
│ .
│
├── core
│ │
│ ├── dipper
│ │ │
│ │ └── Dipper.php // YAML-Parser
│ ├── parsedown
│ │ │
│ │ └── Parsedown.php // Parser zum übersetzen des Textes in HTML
│ └── mvc ┐ // In diesem Verzeichnis lagern
│ │ // die Komponenten des MVC-Patterns
│ ├── Controller.php // Controller
│ ├── Model.php // Model
│ └── View.php // und View
│
├── img // hier liegen alle Bilder
│
├── templates
│ │
│ └── basic.template // das HTML-template der Seite
│
htaccess // Umleitungen auf index.php
index.php // Startscript der Webseite
Verzeichnis-Struktur
Da die Anzahl der MVC-Komponenten überschaubar ist, reicht es aus, diese gemeinsam im Ordner mvc
abzulegen. Sollte das Projekt später größer werden, kann die Struktur weiter verändert werden.
Die Pakete Dipper und Parsedown werden in späteren Kapiteln rund um die Templates und Beiträge genauer besprochen und sind hier als Vorgriff schon zu sehen.