Um Text sicher zu Filtern kann man mit dem Zend Framwork 2 Validator und einem HTML-Filter wie HTML Purifier eine Validierung des Inhaltes durchführen:
Kategorie: Zend Framework
Zend Framework
Mit Zend_Validator lässt sich eine sehr anspruchsvolle und sichere E-Mail Validierung durchführen, die man mit passenden Fehlermeldungen für den User bei Bedarf versehen kann:
<?php use Zend\Form\Element; use Zend\InputFilter\InputProviderInterface; use Zend\Validator; class EmailElement extends Element implements InputProviderInterface { protected $attributes = array( 'type' => 'email', ); private $wrongEmailMessage = 'Bitte geben Sie eine gültige E-Mail-Adresse an.'; public function getInputSpecification() { return array( 'name' => $this->getName(), 'filters' => array( array('name' => 'Zend\Filter\StringTrim'), ), 'attributes' => array( 'type' => 'email' ), 'validators' => array( array( 'name' => 'NotEmpty', 'options' => array( 'messages' => array( \Zend\Validator\NotEmpty::IS_EMPTY => $this->wrongEmailMessage ), ), ), array( 'name' => 'EmailAddress', 'options' => array( 'hostnameValidator' => null, 'messages' => array( \Zend\Validator\EmailAddress::INVALID => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_FORMAT => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_HOSTNAME => $this->wrongEmailMessage, \Zend\Validator\Hostname::CANNOT_DECODE_PUNYCODE => $this->wrongEmailMessag, \Zend\Validator\Hostname::INVALID => $this->wrongEmailMessage, \Zend\Validator\Hostname::INVALID_DASH => $this->wrongEmailMessage, \Zend\Validator\Hostname::INVALID_HOSTNAME => $this->wrongEmailMessage, \Zend\Validator\Hostname::INVALID_HOSTNAME_SCHEMA => $this->wrongEmailMessage, \Zend\Validator\Hostname::INVALID_LOCAL_NAME => $this->wrongEmailMessage, \Zend\Validator\Hostname::INVALID_URI => $this->wrongEmailMessage, \Zend\Validator\Hostname::IP_ADDRESS_NOT_ALLOWED => $this->wrongEmailMessage, \Zend\Validator\Hostname::UNDECIPHERABLE_TLD => $this->wrongEmailMessage, \Zend\Validator\Hostname::UNKNOWN_TLD => $this->wrongEmailMessage, \Zend\Validator\Hostname::LOCAL_NAME_NOT_ALLOWED => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_LOCAL_PART => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_MX_RECORD => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_SEGMENT => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::DOT_ATOM => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::QUOTED_STRING => $this->wrongEmailMessage, \Zend\Validator\EmailAddress::INVALID_LOCAL_PART => $this->wrongEmailMessage, ) ) ) ) ); } }
Für ein mehrsprachiges PHP Projekt sollte man von Anfang an alle Wörter auslagern bzw. markieren, die in einer anderen Sprache übersetzt werden sollen. Dazu bietet sich die in PHP enthaltene Funktion gettext an:
<?php echo gettext("Einen schönen Tag noch"); ?>
oder der Alias (welcher nicht zu empfehlen ist, weil man nicht danach zu kann ordentlich)
<?php echo _("Einen schönen Tag noch"); ?>
Damit kann man zu übersetzenden Text markieren und später übersetzen lassen und dann dynamisch austauschen lassen , wenn auf der englischen Webseiten gesurft wird.
Wenn man sein Projekt mit gettext programmiert hat, kann man am Ende ganz einfach tabellenartige Dateien generieren aus dem Quellcode mit Poedit. Dort kann mann sehr übersichtlich die Übersetzung der Strings eintragen bis hin zu Pluralformen von Wörtern.
Das Zend Framework enthält viele praktische Schnittstellen zu bekannten APIs:
- Google Base (Zend_Gdata)
- Open ID (Zend_OpenId)
- Zend_Service mit:
- Zend_Service_Akismet
- Zend_Service_Amazon
- Zend_Service_Amazon_EC2
- Zend_Service_Amazon_S3
- Zend_Service_Audioscrobbler
- Zend_Service_Delicious
- Zend_Service_DeveloperGarden
- Zend_Service_Ebay
- Zend_Service_Ebay_Finding
- Zend_Service_Flickr
- Zend_Service_LiveDocx
- Zend_Service_Nirvanix
- Zend_Service_ReCaptcha
- Zend_Service_ShortUrl
- Zend_Service_Simpy
- Zend_Service_SlideShare
- Zend_Service_StrikeIron
- Zend_Service_Technorati
- Zend_Service_Twitter
- Zend_Service_WindowsAzure
- Zend_Service_Yahoo
Eine komplette Liste gibt es hier.
Solche APIs können folgender Maßen eingebunden werden ohne die ganze Webseite als Zend-Projekt programmieren zu müssen (am Bsp. von GBase: Google Base):
Um schnell eine einfache Möglichkeit für Kunden zu haben, um auf die Datenbank zuzugreifen, kann man das praktische online Tool phpScaffold nutzen.
Damit lassen sich schnell Oberflächen generieren und customizen zum Ändern, Einfügen und Entfernen von Datensätzen einer Tabelle.
Für größere Projekte sollte man allerdings ein passendes Framework nutzen, welches Scaffolding unterstützt:
- Yii Framework mit Hilfe des Webbasierten Tool: Gii (standardmäßig enthalten)
- Cake PHP
- Zend Framework
- Symfony
- Ruby on Rails
Bsp Ergebnis:
Sauberen und leicht verständlichen Code zu schreiben ist das höchste Ziel in einem guten IT-Projet. Vieles hängt davon ab:
- Wartbarkeit
- Einarbeitungszeit für andere Programmierer, versteht man schnell, was einzelne Funktionen erledigen
- Robustheit bei Änderungen
- Testbarkeit, fällt alles zusammen, bei kleinen Änderungen, können schnell stabile Updates bereitgestellt werden
- Popularität bei anderen Programmierern z.B: bei Open Source Projekten, als negative Beispiel sei XT-Commerce genannt
Das sehr zu empfehlende Standardwerk zu dem Thema ist „Clean Code – Refactoring, Patterns, Testen und Techniken für sauberen Code“ von Robert C. Martin. In diesem Artikel werden Kapitel 1 bis 3 behandelt.
Aussagekräftige Namen
Der Namen einer Variable, Funktion oder Klasse sollte sofort erklären, warum Sie existiert, was sie tut und wie sie benutzt wird. Wenn eine Variable einen Kommentar benötigt, drückt Sie ihren Zweck nicht aus.
Bsp:
int d //Anzahl vergangener Tage besser ist: int daysSinceCreation;
Aussprechbare Namen verwenden
Keine Konstrukte mit unklaren Abkürzungen wie: int daSiCre anstatt von daysSinceCreation.
Suchbare Namen verwenden
Moderne IDEs machen das Suchen einfach, aber es nützt nichts, wenn man nach dem Buchstaben e einer Laufvariable suchen muss und von Ergebnissen überschwemmt wird.
Variablen Namen mit einem Buchstaben sind nur als lokale Variablen in kurzen Methoden zu verwenden.
Für das Rechtesystem in meinem Tippspiel werden die Komponenten Zend_Auth und Zend_Acl im Zendframework verwendet. Zend_Auth ist dabei für die Authentifizierung registrierter Nutzer zuständig und Zend_Acl für Verteilung und das setzen der Rechte. Es wurden drei Rollen angelegt: Guest, Member und Administrator.
Zend Test mit PhpUnit
Zum Testen wurde PHPUnit verwendet als Standard-Testing-Tool für PHP und in Netbeans intergriert.
Dazu wurde eine Bootstrap Datei angelegt, in der die Applikationsvariablen geladen werden (IndexControllerTest.php):
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public function setUp() { $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'); parent::setUp(); } }
Ein Test kann dan so aussehen (Test Files/application/controllers/IndexControllerTest.php):
require_once '/../../TestConfiguration.php'; require_once '/../../../application/models/Players.php'; class PlayersTest extends PhpUnit_Framework_TestCase{ public function setUp() { TestConfiguration::setupDatabase(); } public function testFetchAll(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchAll(); $this->assertGreaterThan(10, $TippspielAnzahl->count()); } public function testLatest(){ $TippspielObjekt = new Players(); $TippspielAnzahl = $TippspielObjekt->fetchLatest(1); $this->assertSame(1,$TippspielAnzahl->count()); } }
Design Patterns im Zend Framework
Für einen Uni Vortrag habe ich mich mit den zahlreichen Design Patterns im Zend Framework beschäftigt. Folgende Themen werden beleuchtet mit Code- Beispielen:
Gliederung:
1. MVC
2. Front-Controller
3. Singleton
4. Row-Data-Gateway und Table-Data-Gateway
5. Registry
Download: