PHP: HTML-Formulare mit Funktionen oder Klassen verarbeiten?
Im Playground verschiedene Techniken zur Ausgabe und Verarbeitung von HTML-Formularen mit PHP. Eine komfortable Variante besteht darin, die Form-Elemente in Arrays zu beschreiben und aus dieser Beschreibung die Objekte zu generieren.
Register Login
In den Beispielen wird ein HTML-Formular zum Registrieren eines Logins benutzt.
Register login Login : Password : Password repeat : Favourite languages : [Assembler, C, Fortran, ...] Computerfreak : [x] Comment :
HTML
html ist das Formular in HTML5.
<form action='index.html' method='post'> Login:<br /> <input type='text' name='login' value='' size='10' /><br /> Password:<br /> <input type='password' name='password' value='' size='10' /><br /> [...]
PHP - Direkt
In direct
werden die Eingaben direkt mit PHP verarbeitet.
Bis auf escapeHTML()
als Wrapper für htmlspecialchars()
werden keine zusätzlichen Funktionen oder Klassen benutzt.
// Login if(isset($_POST['login'])) { $user->login = trim($_POST['login']); if(!preg_match('/^[a-z]+$/', $user->login)) { $errors[] = 'Login: Only the characters a-z are allowed for the login name.'; } // TODO Check length } [...] Login:<br /> <input type='text' name='login' value='<?= escapeHTML($user->login) ?>' size='10' /><br />
Wenn gleich zu Beginn die Default-Werte für die Formular-Eingaben
gesetzt werden, können die späteren isset()
-Abfragen entfallen --
womit die Verarbeitung übersichtlicher wird.
// Login if(!preg_match('/^[a-z]+$/', $user->login)) { $errors[] = 'Login: Only the characters a-z are allowed for the login name.'; } // TODO Check length
Funktionen
In function werden Funktionen zur Verarbeitung und Ausgabe des HTML-Formulars benutzt. Bereits damit ist die Verarbeitung von HTML-Formularen komfortabel.
Nachteil ist die Nutzung von globalen Variablen wie
$errors[]
, um den Zustand zu speichern und für aussagekräftige Fehlermeldungen
müsste zusätzlich zumindest immer der displayName
des Feldes wie
'Login' übergeben werden, während ein Objekt den displayName
selbst kennt.
// Login $user->login = getPost('login', $user->login); validateMatch ($user->login, '/^[a-z]+$/', $errors, 'Login: Must contain only the characters a-z.'); validateMaxLength($user->login, 8, $errors, 'Login: Maximum length is %d characters.'); [...] Login:<br /> <?= formText('login', $user->login, 10) ?><br />
OOP - addField()
In oop_object werden Klassen zur Verarbeitung und Ausgabe des HTML-Formulars benutzt.
Die Programmierung der Klassen bedeutet zunächst einmal Overhead gegenüber den
Funktionen und die Deklaration der Formularfelder ist durch die
new FormObject(...)
-Aufrufe umständlich.
Vorteil ist die Speicherung des Zustands in den Objekten.
$form->addField(new FormText('login', $user->login, ['displayName' => 'Login', 'size' => 10]), [new ValidateMaxLength(8), new ValidateMatch('/^[a-z]+$/')]); [...] Login:<br /> <?= $form->display('login'); ?><br />
OOP - Array
In oop_array werden die Formularfelder in Arrays deklariert -- mit der Short-Array-Syntax ab PHP 5.4 ist dies übersichtlich. Aus dieser Beschreibung werden die Objekte generiert.
Die Vorteile sind die übersichtliche Beschreibung der Elemente und die Speicherung der Zustände in den Objekten.
// Field Name Value // ------------------------------------------------------ ['Text', 'login', $user->login, ['displayName' => 'Login', 'size' => 10], // Options ['maxLength' => 8, 'match' => '/^[a-z]+$/']], // Rules [...] Login:<br /> <?= $form->display('login'); ?><br />