Entries Tagged as 'PHP5'

Zend Framework Hostname-Routen und Pfad-Routen in der application.ini verketten

Wie man Pfad-Routen in der application.ini definiert ist recht “gut” dokumentiert in der Dokumentation des Zend-Controllers (Router) – wobei gut auch dort nicht ganz richtig ist. Irgendwie wirkt die Dokumentation des Frameworks auf mich immer ein wenig wie eine Snippet-Sammlung – sprich: Man wird in den Kontext reingeworfen und versucht rudernd nicht im Meer des Missverstehens unterzugehen.

Wie dem auch sei. In der Dokumentation findet man “prima” beschrieben, wie man das ganze in der Bootstrap.php z.B. löst:

// Erstellung zweier Routen
$hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
$pathRoute     = new Zend_Controller_Router_Route(...);

// Erster Weg, mit Verkettung über die Chain Route
$chainedRoute = new Zend_Controller_Router_Route_Chain();
$chainedRoute->chain($hostnameRoute)
             ->chain($pathRoute);

// Zweiter Weg, direkt verketten
$chainedRoute = $hostnameRoute->chain($pathRoute);

Ich würde das ganze ja noch um folgendes ergänzen: Zum einen sollte man das ganze in eine protected _initRouter()-Methode packen und zum anderen folgendes davor bzw. danach hinzufügen – nur um den Kontext abzurunden versteht sich :) .

$this->router = $this->frontController->getRouter();
$this->router->removeDefaultRoutes();

[... Code von oben ...]

$this->router->addRoute('verySpecialNameOfRoute', $chainedRoute);

Ja ich weiß kann man alles auch noch viel besser zusammenfassen, aber so kann man es nu besser erkennen. Darauf wollte ich aber eigentlich ja nicht hinaus wie ich schon weiter oben schrob geht es mir mehr um die Implementierung bzw. Definition der Verkettung einer Hostname- mit einer Pfad-Route.
Nun alle Routen in der Bootstrap.php zu definieren ist zwar ohne weiteres möglich – ich persönlich halte allerdings nicht sehr viel davon. Zumal eine ordentlich kommentierte und genutzte .ini-Datei für die meisten pflegbar ist und nicht lediglich für solche, die PHP verstehen.

Wie wir das ganze über die Zend_config mit der Definition eines Arrays lösen finden wir auch halbwegs brauchbar in der Dokumentation des Controllers bzw. des Routers der Teil des selbigen ist. Gut es wird hier kein Beispiel für den Zend_Controller_Router_Route_Hostname in Zusammenhang mit der Verkettung des selbigen mit einer Pfad-Route (Zend_Controller_Router_Route z.B.) gegeben aber immerhin werden hier zwei Routen verkettet und man kann das ja dann ohne weiteres ableiten.

$config = new Zend_Config(array(
    'chainName' => array(
        'type'   => 'Zend_Controller_Router_Route_Static',
        'route'  => 'foo',
        'chains' => array(
            'subRouteName' => array(
                'type'     => 'Zend_Controller_Router_Route_Static',
                'route'    => 'bar',
                'defaults' => array(
                    'module'      => 'module',
                     'controller' => 'controller',
                     'action'     => 'action'
                )
            )
        )
    )
));

Wie schon erwähnt, es sind zwei Pfad-Routen, die da verknüpft werden, aber es wird bestimmt fast jeder in der Lage sein die Zend_Controller_Router_Route_Static in eine für den Fall benötigte Zend_Controller_Router_Route_Hostname umzuwandeln (Tipp: Daran denken die “route” auf den richtigen Wert zu setzen ;) ). Gut! Nun aber zur .ini: Das Zend Framework bzw. die Dokumentation des Frameworks bietet uns folgendes für die .ini an:

routes.archive.route = "archive/:year/*"
routes.archive.defaults.controller = archive
routes.archive.defaults.action = show
routes.archive.defaults.year = 2000
routes.archive.reqs.year = "\d+"

routes.news.type = "Zend_Controller_Router_Route_Static"
routes.news.route = "news"
routes.news.defaults.controller = "news"
routes.news.defaults.action = "list"

routes.archive.type = "Zend_Controller_Router_Route_Regex"
routes.archive.route = "archive/(\d+)"
routes.archive.defaults.controller = "archive"
routes.archive.defaults.action = "show"
routes.archive.map.1 = "year"
; OR: routes.archive.map.year = 1

und:

$config = new Zend_Config_Ini('/path/to/config.ini', 'production');
$router = new Zend_Controller_Router_Rewrite();
$router->addConfig($config, 'routes');

Öhm?! Ja… Eben ging es noch um die Verkettung von Routen und jetzt werden hier drei der Standards definiert, aber keinerlei Hinweis auf eine Verkettung?! Komplett aus dem Kontext des vorhergegangen heraus. Prima. Um es kurz zu machen: Man kann das ganze von der Definition mir Hilfe des Arrays ableiten.

# router settings - start
[routes]
# default routes regular website - start
# hostname route
routes.defaultHost.type = "Zend_Controller_Router_Route_Hostname"
routes.defaultHost.route = "sub.domain.tld"

# longterm
routes.defaultHost.chains.longterm.type = "Zend_Controller_Router_Route"
routes.defaultHost.chains.longterm.route = ":city/long-term-forecast"
routes.defaultHost.chains.longterm.defaults.controller = "index"
routes.defaultHost.chains.longterm.defaults.action = "longtermForecast"
routes.defaultHost.chains.longterm.defaults.city = null

# contact
routes.defaultHost.chains.contact.type = "Zend_Controller_Router_Route"
routes.defaultHost.chains.contact.route = "contact/*"
routes.defaultHost.chains.contact.defaults.controller = "contact"
routes.defaultHost.chains.contact.defaults.action = "index"
# default routes regular website - end

# default routes mobile website - start
# hostname route
routes.mobileHost.type = "Zend_Controller_Router_Route_Hostname"
routes.mobileHost.route = "m.domain.tld"

routes.mobileHost.chains.longterm.type = "Zend_Controller_Router_Route"
routes.mobileHost.chains.longterm.route = ":city/long-term-forecast"
routes.mobileHost.chains.longterm.defaults.controller = "mobile"
routes.mobileHost.chains.longterm.defaults.action = "longtermForecast"
routes.mobileHost.chains.longterm.defaults.city = null

Das ganze ist nur ein Auszug aus der Definition die ich für eines unserer Projekte vorgenommen habe. Funktioniert aber ganz wunderbar und lässt sich so vor allem prima warten/pflegen.

Nur damit keine Missverständnisse aufkommen: Ich mag das Zend Framework und ich finde die meisten Sachen wirklich gut gelöst – schreibe ja auch was dazu (Beispielsweise zu hybriden Models mit/trotz Zend_Db_Table_Abstract) – nur halt die Doku ist ein wenig für den A***h ;)

Zend Framework hybrides Model mit/trotz Zend_Db_table_Abstract

Nachdem ich da ein wenig rumprobieren musste und echt froh bin, dass es nun tut muss ich es auch mal ins Netz hinaustragen.
Wenn man mit Zend_Db_Table_Abstract – was ja standardmäßig an eine Tabelle gebunden ist – auf eine andere – via JOIN z.B. oder auch einfach nur so – zugreifen möchte haut einem der Integritätscheck dazwischen und versorgt einen mit dieser netten Meldung:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Und das obwohl der SQL vollkommen in Ordnung ist, wenn man sich diesen via …

	echo $select->__tostring();

… ausgeben lässt und direkt ausführt- sprich er liefert das gewünschte Ergebnis. Das ganze verhindern kann man indem man den Intergritätscheck abschaltet.

    $select = $this->select()->setIntegrityCheck(false);
    $select->from('weather_base', 'weather_base.url')
        ->where('weather_base.id_weather_base = ?', 2);		

    // echo $select->__tostring();

    $result = $this->fetchRow($select);

Ich persönlich finde die Meldung – besonders den Teil mit You have an error in your SQL syntax etwas irreführend. Außerdem habe ich in meinem SQL eben nicht auf eine weitere Tablelle zugegriffen, sondern lediglich die ausgewählten Felder eingeschränkt.

Rückblick auf meine dritte PHP Conference in Mainz

Nun haben wir also Dienstag und die Konferenz ist schon wieder drei Tage her. Ich möchte aber trotzdem ein kurzes Resümee dazu schreiben, da sie mir alles in allem wirklich wieder sehr gut gefallen hat.

Location:
Mainz ist eine sehr nette Stadt – wobei ich außer der Altstadt und dem Bahnhof römisches Theater nicht so viel gesehen habe von Mainz. Was ich aber gesehen habe gefiel mir sehr gut – die Parkplatzsituation wiederum gefiel mir nicht. Es ist schon schade, dass wir als Teilnehmer der Konferenz nicht kostenlos oder zumindestens ermäßigt im Parkhaus der Rheingoldhalle parken konnten. 14 EUR bis 20:00 Uhr und dann noch Zuschläge ab 20:00 Uhr ist schon etwas sehr hart.

Für meine Geschmack waren deutlich zu viele Tische aufgestellt in den Aufenthaltsbereichen zwischen den Veranstaltungsräumen der Sessions.
Die letzte PHP Conference, welche ich besucht habe fand in Frankfurt in einem Hotel statt. Wir hatten dort ein Zimmer und waren dementsprechend deutlich näher am geschehen. Mal davon ab war die Bar echt klasse ;) [Read more →]

PHP Conference – zweiter Tag

phpconf tag21 PHP Conference   zweiter Tag allgemeinesNun also der zweite echte Tag bei der PHP Conference in Mainz. Ein sehr informativer und auch ruhiger Tag und ich bin tatsächlich dazu gekommen überall meine vollste Aufmerksamkeit den Sprechern zu widmen und nicht der zurückgelassenen Arbeit ;)

Heute waren wir bei folgenden Veranstaltungen/Sessions:
Re-architecting the Web with HTML 5 Communication, Fighting Charsets and Encodings, PHP Development with the NetBeans IDE, Optimizing your Frontend Performance, Lesser known Security Problems in PHP Applications, Alternativen zu XMLHttpRequest

Insgesamt sehr interessant, allerdings abzüglich der Websockets, NetBeans IDE für PHP und Security Problems wenig überraschend. Zu den Themen Websockets und Frontend-Performance (und auch Backend-Performance) werde ich demnächst etwas ausführlicher schreiben hier also nur eine Zusammenfassung von allen Sessions heute

(HTML 5 Websockets möchte ich mir vertiefend anschauen, bevor ich da richtig ins Detail gehe und zu Frontent-Perfomance kann ich glaube ich mittlerweile deutlich mehr schreiben,
als ich heute in der Session gehört habe.)


Re-architecting the Web with HTML 5 Communication

Irgendwie hatte ich mir unter “Re-architecting the Web with HTML 5 Communication” etwas völlig anderes vorgestellt. Das kann daran liegen, dass mir “Re-architecting [...] HTML 5″ deutlich mehr ins Auge gefallen ist als als “Communication”. So war ich dann doch angenehm überrascht, dass es nicht, um eine ausufernde Auflistung der neuen Features von HTML 5 ging, sondern um einen “kleine” aber doch weitreichende Neuerung: Websockets.

Bei Websockets geht es um eine weitreichende Änderung des Kommunikationsansatzes hinter einer Web-Applikation bzw. der Logik welche dahinter steckt (Browser <-> Webserver). Zur Zeit – und das schon seit langer Zeit (Hypertext Transfer Protocol – 1989?) laufen alle Verbindungen über eine halb-duplex Kommunikation) zwischen Browser/Client und Webserver.
Das bedeutet im Klartext gesprochen: Der Browser/Client schickt einen Request an den Webserver und der sendet einen Response zurück – aufeinander folgend und nicht gleichzeitig – das ist langsam und eigentlich wenig zeitgemäß. Jonas Jacobi – der Speaker der Keynote – hatte dazu einen treffenden Vergleich: [Read more →]

PHP Conference – Xdebug

phpconference xdebug PHP Conference   Xdebug allgemeinesAuf meiner ersten PHP Conference Anfang 2007 in Ludwigsburg, habe ich das erste Mal so richtig laut was von Xdebug gehört und war auch gleich sehr angetan davon.
Die Installation auf dem Mac – damals noch ein G4 Powerbook mit Tiger – war eine recht kniffelige Angelegenheit, lies sich aber lösen.

(Irgendwie habe ich – wie so oft – den Zeitpunkt, etwas dazu zu schreiben, verstreichen lassen und das will ich auch jetzt nicht verspätet nachholen, deswegen nur kurz: “Fink, Cachegrind, KCachegrind, X11, Fink Commander” sind einige Stichworte in dem Zusammenhang, welche mich ein paar Stunden meiner Lebenszeit gekostet haben.

Zu guter letzt und nachdem ich KCachegrind über Nacht auf dem Powerbook via Fink installiert hatte und kleinere bzw. größere Probleme aus dem Weg geräumt waren, habe ich Xdebug inklusive Profiling via KCachegrind komplett ans Laufen bekommen.)

Anfang diesen Jahres bekam ich dann mein neues Macbook und ein Leopard als OS dazu. Leider lies sich Xdebug nicht wirklich dazu überreden auf dem Macbook unter Leopard zu laufen und ich konnte nicht schlüssig herausfinden woran es hing. Da mir dann die nötige Zeit fehlte, verabschiedete ich mich vorerst von Xdebug auf meinem lokalen Webserver, zumal wir Xdebug unter Linux auf unserem Entwicklungsserver problemlos nutzen. [Read more →]

PHP Conference in Mainz

php small PHP Conference in Mainz allgemeinesSimon und ich sind zur Zeit in Mainz auf der PHP Conference – meine dritte mittlerweile, wenn ich mich nicht verzählt habe.

Über die Inhalte kann ich noch nicht sehr viel schreiben, da heute der erste echte Konferenztag war, aber es ist deutlich internationaler geworden. Auch zwischen den Sessions und Veranstaltungen dominiert Englisch als Sprache.

Ansonsten ist eigentlich alles wie immer. Wer zuerst kommt ergattert eine der extrem begrenzten Auftankstationen für Notebook-Akkus – auch Mehrfachsteckdosenleisten genannt – und um so tiefer man im Gebäude nach unten wandert, desto schlechter wird das WLAN – wobei das war in Frankfurt genau umgekehrt.
Aber eigentlich ist das vollkommen in Ordnung so. Wir haben bisher immer noch im letzten Moment eine Steckdose gefunden. [Read more →]

Smarty: Registrierung von Blöcken und Funktionen

Zur Zeit entwickle ich an einem Projekt, dass sehr stark in Zusammenhang mit der Template-Engine Smarty steht. Um die Strukturen innerhalb der Templates klar vom Script-Code zu trennen, aber trotzdem innerhalb der Templates einige Funktionalitäten zur Templateentwicklung – Darstellung von zugewiesenen Objekten/Arrays/Werten z.B. – und zur Behandlung von Inhalten bieten zu können, habe ich auf die Smarty-Plugin-Funktionalitäten register_block() und register_function() zurückgegriffen, welche in meinen Augen sehr gut geeignet sind, dem Template-Editor Werkzeuge an die Hand zu geben, um dynamische Daten/Informationen gut strukturiert und möglichst flexibel ausgeben zu können. [Read more →]