Author: Michael Müller

Twig & localizeddate() – Darstellung bzw. Konvertierung eines Datums anhand des Symfony-Locales

19. Januar 2017 Allgemein, Blog, Log, Symfony No comments ,

Nutzung des „date()“-Filters in Twig

Anwendungsfall:
Beim Rendering eines Twig-Templates durch einen Controller in Symfony wird ein Objekt vom Typ „DateTime“ an das Template übergeben. Das Datum soll innerhalb des Templates dargestellt werden.

Lösung:
Auf das Objekt vom Typ „DateTime“ wird ein Twig-Filter angewandt:

1
{{ newspaper.dateOfIssue | date('m.F Y') }}

Dies ergibt beispielsweise die Darstellung von 01.December 2008. Die Ausgabe erfolgt standardmäßig mit „en_EN“ (Locale) unabhängig davon, ob in der config.yml von Symfony ein anderer Locale-Wert gesetzt wurde.

Anzeige des Datums mit gezielter Sprache unter Verwendung von localizeddate()

Möchte man nun die Ausgabe des Datums an den vorliegenden Locale-Wert von Symfony anpassen, so kann man folgende Anpassung vornehmen:

(alt)

1
{{ newspaper.dateOfIssue | date('m.F Y') }}

(neu)

1
{{ newspaper.dateOfIssue | localizeddate('long', 'none', app.request.locale, NULL, 'dd.MMMM Y') }}

Was hat sich geändert?
Der Filter date() wird durch localizeddate() ersetzt. Dieser kann mehrere Argumente zur Darstellung der Anzeige entgegennehmen. Wichtig für o.g. Beispiel ist der Bezug auf den Loacale-Wert der Symfony-Awendung mit „app.request.locale“ und die entsprechende Formatierung „dd.MMMM Y“. Die Formatierung des Datums mittels „localiceddate()“ unterscheidet sich vom Filter „date()“.

Bei der Anwendung von „date()“ kann bei der Formatierung diese Übersicht verwendet werden. Beim Einsatz von „localiceddate()“ ist diese Formatierungs-Übersicht zu verwenden. Welche Argumente beim „localizeddate“-Filter verwendet werden können, ist der Übersicht Argumente localizeddate zu entnehmen.

Voraussetzungen für den localizeddate mit Twig und Symfony

Für die Vermeidung von Fehlermeldungen wie:

Attempted to load class „Twig_Extensions_Extension_Intl“

oder

An exception has been thrown during the rendering of a template
(„The Symfony\Component\Locale\Stub\StubIntlDateFormatter::__construct() method’s argument $locale value ‚en_IN‘ behavior is not implemented. Only the ‚en‘ locale is supported.

sind Twig-Extensions und Symfony-Intl in das Projekt einzubeziehen. Diese können via Composer mit:

composer require twig/extensions
composer require symfony/intl

installiert werden. Weiterhin ist die services.yml um folgende Zeilen zu ergänzen:

1
2
3
4
    twig.extension.intl:
        class: Twig_Extensions_Extension_Intl
        tags:
            - { name: twig.extension }

Auf dem entsprechenden System (bei mir Ubuntu + php7) ist php7.0-intl zu installieren. Dies ist eine Erweiterung (Extension) für Internationalisierungen (siehe php.net). Die Installation erfolgt mit:

sudo apt-get install php7.0-intl

Damit kann „localizeddate()“ nun grundsätzlich wie in o.g. Beispiel angewandt werden. Der Cache von Symfony ist anschließend zu leeren und der Anwendungsserver neu zu starten.


Werbeanzeige:
extending_symfony2
Extending Symfony 2 Web Application Framework
[Author: Sebastien Armand]

Symfony – Fehlermeldung (Prod Environment) 500 Internal Server Error

21. September 2016 Allgemein, Blog, Log, PHP, Symfony No comments , ,

Symfony Internal Server Error 500 Titelbild

Man freut sich vielleicht gerade eine Anwendung fertig gestellt zu haben, will diese nun Online bringen und plötzlich meldet sich ein 500 Internal Server Error.
Häufig kommt es vor, das sich die Bildschirmausgabe des Webprojektes in der Entwicklungsumgebung ( Dev Environment ) von der Produktiv-Umgebung (Prod Environment) unterscheidet.

Beim Entwickeln überprüft man die Anwendung z.B. via Webbrowser
http://localhost:8000/unterseite/artikel

wenn o.g. URL nun wie folgt erweitert wird:

http://localhost:8000/app.php/unterseite/artikel (entscheidend ist hierbei app.php)
kann getestet werden, wie sich die Anwendung mit Prod-Environment (Produktiveinsatz) verhalten würde. Ist optisch und funktional alles wie beim 1. Link, so ist dies ein gutes Zeichen und die Anwendung ist bereit Online zu gehen.

Warum verhalten sich beide Aufrufe unterschiedlich?

Dies kann zum einen auf die Anwendungskonfoguration zurückzuführen sein, welche ggf. für das Dev-Environment ausgelegt ist oder man nutzt innerhalb der Entwicklung Module von Symfony, die lediglich für den Entwicklungsprozess gedacht sind und live bzw. im Prod-Environment nicht zur Verfügung stehen.

Triviales Beispiel für die Erzeugung eines 500 Internal Server Error – kein dump im Prod

Beim Entwicklungsprozess wird ggf. des Öfteren auf die dump-Funktion von Symfony zurückgegriffen um sich Inhalte während der Datenverarbeitung anzeigen zu lassen.
Der Dump von Inhalten funktioniert hierbei sowohl aus einem Twig-Template oder auch über einen der Controller.
Dies ist für die Entwicklung sehr nützlich, jedoch für die online geschaltete Webanwendung sehr gefährlich. Angenommen die Dumps werden nicht entfernt (Vergesslichkeit), dann würden die Ausgaben einem zukünftigen Betrachter der Webanwendung interne Strukturen offen legen, also ein gefundenes Fressen für potentielle Angreifer. Daher steht die dump-Funktion nur im dev-Environment und nicht im prod-Environment zur Verfügung.

Symfony Prod Error Log – Informationen zum Fehlverhalten der Website auslesen

Angenommen die Live geschaltete Anwendung wirft nun ein 500 Internal Server Error oder andere Fehlermeldungen, so quittiert Symfony diese innerhalb eines Logfiles ( dieses findet man unter app/logs/ ).

Eine Eintrag aus dem Logfile könnte wiefolgt aussehen:
[2016-07-20 14:28:16] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\UndefinedFunctionException: „Attempted to call function „dump“ from namespace „AppBundle\EventListener“.“ at /home/micha/git/Simplicando/src/AppBundle/EventListener/ContentUpdateListener.php line 27 {„exception“:“[object] (Symfony\\Component\\Debug\\Exception\\UndefinedFunctionException(code: 0): Attempted to call function \“dump\“ from namespace \“AppBundle\\EventListener\“. at /home/micha/git/Simplicando/src/AppBundle/EventListener/ContentUpdateListener.php:27)“} []

Beim betrachten der Log-Line stößt man nun auf UndefinedFunctionException(code: 0): Attempted to call function \“dump\“. Dies bedeutet das ein Ausnahmefehler (Exception) geworfen wird weil die dump-Funktion nicht exisitert.

Was kann man gegen den Error machen?

Das zuvor gennante Beispiel zeigt, das Dumps in im Prod-Environment nicht funktionieren. Die Anwendung muss daher auf den Einsatz dieser Ausgaben geprüft werden. Entfernen / auskommentieren und erneut testen, ob der Internal Server Error bestehen bleibt.

Handelt es sich nicht um o.g. Szenario, so ist die Ursache so pauschal nicht zu ermitteln und benötigt ggf. Untersuchungen des Quellcodes oder der Konfiguration.
Zunächst ist es jedoch Sinnvoll sich einen Überblick über die Fehlermeldungen (HTTP-Status Codes) zu verschaffen. Eine Liste mit allen Status-Codes ist hier zu finden.

So kann das Problem zumindest schon mal grob eingegrenzt werden (z.B. Inhalt nicht gefunden Error 404 oder einer 500er Meldung). Weiterhin sollten die Error-Logs unter /app/logs (Symfony Nutzer) oder Log-Files Ihres Webservers betrachtet werden. Es ist erstaunlich, wie schnell man dem Fehler durch die Log-Files auf die Schliche kommt.

Literaturempfehlung für den Umgang und Erweiterung von Symfony

Werbeanzeige:
extending_symfony2
Extending Symfony 2 Web Application Framework
[Author: Sebastien Armand]

PI – Welle Erdball und das Eintauchen die die Welt der Computerklänge

1. April 2016 motivation No comments , , , ,


Du wirst es lieben lernen!

Persönlich ein etwas gewöhnungsbedürftiger Sound für den Einstieg in das Reich von Welle Erdball,
aber mit der Zeit lernt man es lieben und kann nicht mehr von den Klängen loslassen.

Musik zum Programmieren

Wichtige Kompositionsbestandteile der Lieder sind u.a. Theremin und Commodore 64. Sie verleihen dem Sound einen unverwechselbaren computertechnischen Klang, der den Entwickler mit seinem Computer verschmelzen lässt.

Taiga.io – intuitives Projektmanagement Tool für agile Softwareentwicklung

1. April 2016 Allgemein, webtools No comments , , , , , , , ,

Projektverwaltungstool Taiga.io Logo

Programmieren ist nicht wie Sand schaufeln – Software wird agil entwickelt

Heute werde ich eine Tonne Sand schaufeln! Es lässt sich leicht ein Tagesziel bestimmen, wenn man einer gut kalkulierbaren Aufgabe nachgeht,
vorausgesetzt die Schaufel bricht nicht ab. Im Bereich der Softwareentwicklung beschäftigen sich Entwickler meist täglich mit neuen Aufgabenstellungen.
Das ist gerade der Punkt, warum Softwareentwicklung viel Freude bereitet – man dreht sich nicht ständig an der gleichen Stelle, sondern kann sich stets weiterentwickeln.
Jedoch lassen sich die spannenden neuen Aufgabenstellungen zeitlich nicht ganz so einfach bestimmen und einem linearen Zeitablauf unterordnen, denn Rücksprachen mit dem Team und dem Management sind nötig, um das Produktziel nach exakten Anforderungen zu erreichen.

Überblick und iterative Vorgänge

Es ist stets wichtig einen Überblick über aktuelle Entwicklungsprozesse zu erhalten. Der Fortschritt des Gesamtprojektes motiviert den einzelnen Entwickler bzw. Projektmitwirkenden. Weiterhin werden regelmäßig weitere Rückinformationen benötigt um seinen eigene Prozess weiter voranzutreiben. Dies können Rücksprachen oder Behebung von Bugs iterativer Form sein.

Taiga.io – ein übersichtliches Projektmanagement-Tool für agile Softwareentwicklung

Wir möchten hiermit unser Lieblingsonlinetool für agile Vorgehensweisen im Bereich Softwareentwicklung vorstellen –> taiga.io. Neben seiner intuitiven, übersichtlichen Bedienung, sowie seinem eleganten Erscheinungsbild, überzeugt es durch seine überschaubaren und nützlichen Funktionalitäten – manchmal ist weniger mehr!

Überblick über Aktionen bewahren

Übersicht Taiga.io

Bereits beim Klick auf das gewünschte Softwareprojekt wird man mit einer Übersicht der letzten Projektgeschehnisse informiert.

Benutzermanagement, Rollenverteilung und Gamification

Benutzermanagement und Rechteverwaltung

Neben der Rollenverteilung (UX, Design, Front-End, Back-End, etc …) innerhalb des Projektes, wird dem Projektmitwirkenden in Form von Gamification ein Abzeichen zugeteilt (Locain Trinker, Bugjäger, Nachtschicht).

Interaktives Taskboard

Taiga Taskboard

Nach der Erstellung eines Sprints, lässt sich dieser durch ein überschaubares und interaktives Taskboard via Drag and Drop verwalten. Aufgaben können somit leicht einem Status („in Bearbeitung“, „abgeschlossen“, etc …) zugewiesen werden.


Werbeanzeigen:

Tool für Reverse Engineering (c#, c++, Java) , Planung und Modellierung

25. März 2016 desktoptools No comments , , , ,

Reverse Engineering – Aus Quellcode Klassendiagramme erstellen (c#, c++, Java)

Wofür benötigt man das?
Vielleicht bist Du ein Student und dein Prof. fordert ein umfangreiches Klassendiagramm für eine Belegarbeit oder
Du möchtest jemanden in die Strukturen deines Programmes einweisen, da macht sich ein Klassendiagramm manchmal gar nicht so schlecht.
Scheinbar hat die Planung nicht so gut geklappt und man benötigt im Nachhinein noch ein Klassendiagramm, kein Problem mit StarUML. Dieses Tool bietet das Reverse Engineering Verfahren, dass mittels Quellcode o.g. Programmiersprachen ein Klassendiagramm bilden kann.

Planung von Anwendungen spart Zeit

Mit der Planung einer Anwendung, egal ob im Bereich Web, App oder Desktop, spart man später unglaublich viel Zeit.

Klar im Moment der Planung, Prozessmodellierung und Aufteilung der Komponenten kann man davon schon ein wenig genervt sein,
jedoch muss man sich immer vor Augen halten, dass man ggf. in einem Jahr nicht mehr viel von dem weiß, was man sich mal beim Programmieren
einer bestimmten Anwendung oder Komponente gedacht hat. Planung hilft nicht nur dem Gedächtnis im Notfall auf die Sprünge,
sondern verleitet uns durchaus modularer zu denken. Ein hilfreiches Tool für die Modellierung von Prozessen und Systemplanung ist StarUML.

Mit ein wenig sorgfalt bei der Nutzung des Tools, können aus den gefertigten Strukturen auch Quellcode erzeugt werden.