Facebook
Twitter
Google+
Kommentare
22

Eclipse-Validatoren erstellen mit PHP

Letzte Woche haben sich drei Softwareentwickler aufgemacht, den Leuten zu erklären, wie man Eclipse-Validatoren ganz einfach mit PHP schreiben kann. Die drei Entwickler waren Bastian, Sven und ich und natürlich handelt es sich um den Workshop, den wir auf der IPC gegeben haben. Ich hatte letzte Woche ja versprochen,  möglichst bald den Workshop in Textform zu bringen, das will ich mit diesem Artikel machen. Mit Validatoren könnt ihr übrigens euren Code im Eclipse analysieren und gegebenenfalls Warnungen und Errors anzeigen lassen.

Das System ist ganz einfach. Zur Vorbereitung installieren wir uns das PHP Tool Integration (PTI) Plugin von Sven Kiera. Die Updateseite lautet für die Stable-Version http://www.phpsrc.org/eclipse/pti Ich tippe mal drauf, dass ihr alle wisst wie man Plugins installiert. Einfach alles was PTI mitbringt solltet ihr anklicken. Schadet auf keinen Fall, auch wenn wir für dieses  konkrete Tutorial nur den Core benötigen. Falls alles gut ging, solltet ihr jetzt unter Window -> Preferences jetzt einen Eintrag finden mit dem Titel PHP Tools.

So genug der Vorbereitung. Mehr müssen wir nämlich gar nicht machen. Jetzt legen wir uns irgendwo eine PHP-Datei an und nennen sie validator.php. Ist ziemlich egal wo, Hauptsache ihr merkt euch den Pfad zu dem File. Jetzt können wir auch schon den Validator bei Eclipse registrieren. Dazu gehen wir wieder in die Einstellungen und suchen uns den Reiter Dynamic Languages -> Validators und klicken auf Add.

add_validator

So ähnlich sollte eurer Formular aussehen, wenn ihr damit fertig seid. Unter localhost tragt ihr die Validator.php Datei ein, sucht eure bevorzugte PHP Version aus und fügt eine Regel hinzu (Add Rule).  Den Ausdruck mit den Platzhaltern könnt ihr dann so übernehmen, wie er vorgeschlagen wird. OK drücken fertig.

Jedes mal, wenn ihr jetzt eine Datei speichert, wird euer Validator-Skript ausgeführt. Der Output wird dann geparsed und sobald irgendwas in der Form %f:%n:%m gefunden wird, interpretiert Eclipse das und setzt eine Warning an der richtigen stelle. Probieren wir das doch einfach mal aus. Schreiben wir in unsere PHP-Datei folgendes rein:

<?php
  echo $_SERVER['argv'][1].':1:Oh oh';

Wenn wir jetzt speichern, müsste die erste Zeile unserer Skripte immer mit einer Warning angezeigt werden. Da steht dann so was wie „Oh oh“ oder „C:\pfad\zum\skript\validator.php:1:Oh oh“ drinnen. Wie ihr euch sicher denken könnt ist in der Superglobalen $_SERVER im Index [‚argv‘][1] der Dateiname gespeichert, den wir validieren müssen. Jetzt kommt das komplizierteste an der ganzen Geschichte: Wir müssen uns entscheiden, was wir überhaupt validieren wollen. In unserem Workshop haben wir was ganz einfaches probiert. Der Validator sollte anspringen, sobald jemand print anstatt echo verwendet. Dazu haben wir ein nicht vollständiges Skript genommen und einfach in der zu untersuchenden Datei nach dem String „print“ gesucht. Wir wissen natürlich, dass dann auch Kommentare gefunden werden und so weiter, aber das ist erstmal egal, denn wir wollen ja nur einen Proof of Concept eines Validators. Nehmen wir also folgendes validator.php Skript.

<?php

$filename = $_SERVER['argv'][1];
$fileRows = file( $filename );
$errors   = array( );

// @ignoreNextLine
$message = 'You should use echo instead of print.';

for($i = 0; $i < count( $fileRows ); $i++ ) {
  if ( strpos( $fileRows[$i], '@ignoreNextLine' ) !== false ) {
    $i++;
    continue;
  }
  // @ignoreNextLine
  if ( strpos( $fileRows[$i], 'print' ) !== false ) {
    $errors[] = "$filename:".($i+1).": $message";
  }
}

foreach( $errors as $error ) {
  echo $error."\n";
}

Es ist kein schönes Skript, aber um zu zeigen, wie einfach es sein kann, reicht es aus. Mehr ist das auch gar nicht, Keine Hexerei und schon kann man sein Eclipse erweitern. Mich würde es freuen, wenn der ein oder andere mit einem anderen Beispiel mal die Kunst des Validieren testet und hier sein Ergebnis postet. Wer noch Ideen hat, was man umsetzen könnten, aber nicht weiß wie, der kann sich auch in den Kommentaren austoben, dann machen wir das zusammen.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

22 Comments

  1. Interessante Sache die Validatoren.
    Schade, dass man die Validatoren in eclipse nicht einzeln ausschalten kann.
    Auch mit Filter auf unsinnige Filename extension z.B. *.xyz gehts nicht.
    Validatoren im Entwurf (z.B. echo-instead-of-print, solange er auch in Kommentaren oder print_r anmeckert) muss man dann in Preferences wieder komplett löschen, weil es sonst nervt, wenn man zwischenzeitlich soviele Errors oder Warnings angezeigt bekommt.

    Reply
  2. Ok, PTI funktioniert soweit. Kann man auch irgendwie die Reports in Eclipse direkt betrachten? Sonst muss ich die ja immer aus dem tmp-Verzeichnis fischen und das Plain XML lesen …

    Reply
  3. Danke für den kurzen Artikel. Wusste gar nicht, dass sowas möglich ist.
    Ein wenig Inline-Doku wäre fein gewesen…

    Gibt es dazu auch sowas wie eine Dokumentation für verwendbare Keywords oder etwas in der Art? @ignoreNextLine beispielsweise sagt mir gar nichts. Ist das ein Keyword für PHP, Eclipse oder explizit für die Eclipse-Validatoren?

    Reply
  4. @Martin: Darum:
    if ( strpos( $fileRows[$i], ‚@ignoreNextLine‘ ) !== false ) {
    $i++;
    continue;
    }

    Wenn er den Text findet, dann überspringt er einfach die nächste Zeile mit seinem Validator.

    Reply
  5. @Martin Das habe ich mich auch gefragt. Es scheint folgendermaßen zu laufen:

    @ignoreNextLine ist ein frei erfundenes Comment-Keyword. Wenn der Validator dieses Keyword findet, dann ignoriert der Parser die darauffolgende Zeile. Ist für den Fall, dass man doch mal unbedingt print verwenden will/muss.

    Reply
  6. Das „print statt echo“-Beispiel kann man doch als Sniff für PHP_CodeSniffer umsetzen. Der Sniff könnte dann auch bei jedem Speichern einer Datei laufen.

    Reply
  7. @Stephan: Ja das könnte man auch machen. Habe nicht gesagt, dass das das beste Beispiel war. Aber wenn du den CodeSniffer verwenden würdest, dann solltest du ein anderes PTI-Tool verwenden.

    Reply
  8. @Nils: Das sollte auch keine Kritik an deinem Beispiel sein sondern lediglich ein Gedanke meinerseits 😉 Welche Anwendungsfälle könnte es noch für einen eigenen Validator geben (, die ich nicht mit einem Sniff abdecken könnte)?

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen