Symfony – Yaml Dateien automatisch validieren

Jeder, der mit Symfony arbeitet, ist sicher schon mal über das Problem gestolpert, dass die Fehlermeldung bei Fehlern in Yaml Files nicht detailiert genug ist, um die Ursache des Fehlers zu erkennen.

Beispiel für die Ausgabe der Exception wenn z.B. die Datei routing.yml fehlerhaft ist.

Leider kann man nicht erkennen, in welcher Zeile sich der Fehler befindet.

Hier hilft ein kleines Konsolenkommando von Symfony:

bin/console lint:yaml app/config/routing.yaml

Anhand der Ausgabe dieses Kommandos kann man sofort erkennen wo der Fehler liegt und das Problem einfacher beheben.

Veröffentlicht unter PHP, Symfony | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Slack als Logger für Symfony nutzen

Symfony bietet zahlreiche Möglichkeiten, um Logfiles zu erstellen.
Neben den klassischen Logfiles im Dateisystems kann man z.B. auch Syslog nutzen, Mails versenden, Elastissearch oder MongoDb nutzen.

Das Problem bei den meisten Logfiles: Niemand schaut sie sich an und wenn man sie braucht, weiss kein Mensch wo sie liegen.

Eine weitere interessante Möglichkeit ist es deshalb, wichtige Systemnachrichten direkt in eigenen Slack Channel zu schicken.
So können alle zuständigen Mitarbeiter diesen Channel abonnieren und es muss nicht immer ein Entwickler auf dem Server in Logfiles wühlen.
Da die meisten Entwickler ohnehin Slack nutzen, ist die Einrichtung schnell gemacht.

Um Slack zu nutzen, muss man in der config.yml einfach den entsprechenden Handler eintragen:

 
monolog: 
...
 handlers: slack: 
 type: slack 
 token: '%slack_api_token%' 
 channel: '%slack_channel_name%' 
 bot_name: Logger 
 icon_emoji: :bangbang: 
 level: error

Das Slack Api Token und den Channel muss man direkt in seinem Slack Account erstellen.
Dazu muss man unter https://api.slack.com/apps zuerst eine App erstellen

Den App Namen kann man frei wählen, als Workspace muss der Workspace ausgewählt werden, in dem die Lognachrichten erscheinen sollen.

Auf der folgende Seite muss dann noch die Berechtigungen für die neue App einstellen.

Wichtig ist, dass die App Chatnachrichten schreiben darf:

 

Danach muss man die App in dem Workspace installieren:

Auf der folgenden Seite erhält man das OAuth Access Token.

Diese Tokens muss man in der Symfony parameters.yml als slack_api_token  eintragen.

Ist das ganze vollständig eingerichtet, so kann man Log Informationen direkt an Slack schicken, bzw. werden Systemereignisse automatisch an Slack geschickt, je nach eingestelltem Log Level.
Man sollte als Level also nicht unbedingt „debug“ einstellen, da dann einfach zu viel geloggt wird und die wichtigen Nachrichten eher untergehen.

Als kleines Bonbon kann man sogar noch ein Emoji auswählen, dass für die Lognachrichten verwendet wird.
Dazu einfach beim Konfigurationsparamer „icon_emoji“ das gewünschte Emoji eintragen.
Eine Übersichtliste gibt es hier:
https://www.webpagefx.com/tools/emoji-cheat-sheet/

Natürlich sollte man bedenken, dass man, sofern man nur einen kostenlosen Slack Account nutzt, nur eine bestimmte Anzahl von Nachrichten in der Slack History anzeigen und durchsuchen kann.

Veröffentlicht unter Symfony | Hinterlasse einen Kommentar

Streamcatcher App jetzt auch für Apple IOS

Die Streamcatcher App gibt es nun endlich auch für Appl IOS, so dass ihr auch als Apple Nutzer nun endlich die beliebte Film und Serien Suchmaschine immer dabei haben könnt.


Download IOS APP

Veröffentlicht unter Allgemein, apps, streamcatcher | Hinterlasse einen Kommentar

Streamcatcher APP für Android

Endlich ist sie da: die Streamcatcher APP für Android.
Jetzt ist die Film und Seriensuche noch einfacher, dank der bewährten Streamcatcher Filter.
Egal ob aktuelle Blockbuster, die angesagtesten Serien oder alte Filmklassiker, mit der Streamcatcher APP habt ihr immer einen Überblick, bei welchem Anbieter ihr eure Lieblingsfilme zum besten Preis findet.
Die IOS App folgt in den nächsten Wochen.

Hier geht es direkt zur kostenlosten APP.

Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

Co-Working im Denkwerk in Herford

Der Co-Working Trend scheint aktuell ungebrochen zu sein und so ist es nicht verwunderlich, dass in den Großstädten neue Co-Working Spaces wie Pilze aus dem Boden schießen.
Für viele Freiberufler und Selbständige bieten Co-Working Spaces eine flexible Möglichkeit in einen Büro zu arbeiten, ohne sich langfristig durch einen Mietvertrag an einen bestimmten Standort zu binden.
Außerdem bieten Co-Working Spaces eine Abwechslung zum Home Office und eine gute Möglichkeit, sein eigenes Netzwerk um interessante Kontakte zu erweitern.

Wer nun aber meint, ausgefallene und schöne Co-Working Space seien nur in Berlin, München oder Hamburg zu finden, der sollte mal einen Abstecher nach Ostwestfalen machen.
Im Denkwerk in Herford hat sich Oliver Flaskämper den Traum vom perfekten Büro erfüllt.
Auf 2.800 qm Nutzfläche hat er nicht nur die Firmen seiner eigenen Firmengruppe untergebracht, sondern er hat auch den ersten Co-Working Space Herford mit ca. 25 Arbeitsplätzen eröffnet.
Das Gebäude bietet alles was man im heutigen Büro Arbeitsumfeld so braucht: eine Highspeed Internetanbindung, große lichtdurchflutete Räume mit hohen Decken, einen großen Konferenzbereich, Besprechungsräume, mehrere Küchen, Schalldichte Telefonkabinen und ausreichend Parkplätze.

Co Working im Denkwerk Herforf

Blick in den Co-Working Bereich im Denkwerk Herford

Generell fällt auf, das hier Wert aufs Detail gelegt wurde, ob beim hochwertigen Parketfußboden, dem Lichtdesign, den sehr schönen Echtholzschreibtischen, dem Schmiedeeisernen Treppengelänger im zentralen Treppenhaus, den Bürostühlen der höheren Preiskategorie (der Rücken wird es danken) oder der Musik in den Sanitärbereichen, die automatisch angeht, sobald man den Raum betritt.
Eine besondere Überraschung erwartet die Herren auf dem Gäste WC, hier kann man mittels „ausgeklügelter Steuertechnik“ beim Wasserlassen versuchen, möglichst viele Elfmeter im Tor zu versenken.

Da Bilder mehr sagen als viele Worte, hier ein paar Impressionen:

Kaminzimmer

Kaminzimmer

Tetris Tisch

Tetris Tisch

Die kurzweiligste Herrentoilette Deutschlands

Die kurzweiligste Herrentoilette Deutschlands

Büro oder Hotel ?

Büro oder Hotel ?

Die Sauna und der Massage- und der Fitnessraum sollen Anfang 2016 eröffnet werden, dann gibt es noch ein paar Gründe mehr mal den Co-Working Space im Denkwerk in Herford zu testen.
Dann könnte der Satz „Schatz ich bleibe heute länger im Büro“ eine ganz neue Bedeutung bekommen.

Wer also mal einen Co-Working Space der besonderen Art ausprobieren möchte, der sollte mal hier vorbei schauen:
http://www.denkwerk-herford.de/
Denkwerk Herford Betriebs GmbH
Leopoldstraße 2-8
32051 Herford

Veröffentlicht unter Allgemein | Hinterlasse einen Kommentar

Symfony Live 2015

Am 15. und 16.10.2015 lud Sensio Labs wieder zur Symfony Live Konferenz in Berlin ein.
Das ganze fand diesmal im Golden Tulip Hotel in Tiergarten statt und stand ganz im Zeichen des 10 jährigen Symfony Jubiläums.
Die Vorträge fanden parallel in zwei Konferenzsälen statt, so dass es bei den vielen interessanten Themen nicht immer ganz einfach war, sich für einen Vortrag zu entscheiden.
Neben zahlreichen Vorträgen rund um den Einsatz von Symfony (hier gehts zum gesammten Programm) gab es auch sehr interessante Vorträge zu allgemeineren Themen (z.B. was ist neu in PHP7, welche Änderungen erwarten uns mit HTTP 2.0, Einsatz von Microservices, Global Design Principles).

Nach den offiziellen Vorträgen gab es dann im Anschuss noch jeweils zehnminütige Lightning Talks, die natürlich erfahrungsgemäß auch gerne mal in Werbepräsentationen ausarten.

DSC_0007

Diverse Aussteller und Sponsoren präsentierten sich mit kleineren Ständen, verschenkten die üblichen goodies und hielten Ausschau nach potentiellen neuen Mitarbeitern.
Es gab sogar ein kleines schwarzes Brett mit Stellenanzeigen.

Natürlich hatte auch Sensio Labs einen eigenen Stand, so dass man sich direkt z.B. über aktuelle Schulungsmöglichkeiten informieren konnte.

Insgesamt eine sehr gelungene Veranstaltung mit sehr interessanten Vorträgen.
Dass Catering war ebenfalls spitzenmäßig, angefangen beim Frühstück, über kleine Snacks zwischendurch bis zum reichhaltigen Mittagsbüffet war für jeden etwas dabei.

Eine kleiner Kritikpunkt noch zum Schluss, ich fand die Location etwas ungünstig ausgewählt.
Die nächste U Bahn Station (Wittenberplatz) ist ca. 10 Minuten entfernt, was bei ströhmendem Dauerregen doch etwas ungünstig war. Außerdem fand ich es unpraktisch, das ein Konferenzsaal im Erdgeschoss war und der andere in der 11. Etage, so dass man des öfteren an den (für eine Veranstaltung dieser Größe zu kleinen) Fahrstühlen anstehen musste.
Dafür wurde man dann allerdings in der 11. Etage mit der Aussicht über Berlin entschädigt.

Veröffentlicht unter Allgemein, PHP, Symfony2 | Hinterlasse einen Kommentar

Google Trends zu aktuellen Frameworks

Anbei mal wieder eine interessante Grafik von Google Trends zum Vergleich der Suchanfragen für die Frameworks Phalcon, Zend Framework 2 und Symfony 2.
Wie man sehr schön erkennen kann, hat Phalcon ganz schön aufgeholt und wird immer beliebter.
Erst kürzlich wurde Phalcon 2 veröffentlicht.
Es bleibt also spannend auf dem Framework Markt und der Abwartstrend beim Zend Framework schein weiterzugehen.

Bildschirmfoto 2015-08-11 um 11.22.27

Veröffentlicht unter Allgemein, Phalcon, Symfony2 | Hinterlasse einen Kommentar

Phalcon – Validierung und Filterung von Formularwerten

Da die offizielle Phalcon Dokumentation zum Thema „automatische Filterung von Formularwerten“ noch recht lückenhaft ist, folgt hier eine kurze Beschreibung zur Vorgehensweise.

Als Beispiel dient eine einfache Formularklasse mit einem Formularfeld.
Mit den Funktionen „addFilter“ und „addValidator“ werden die Filter und die Validatoren für das Formularfeld definiert.
In diesem Fall werden der ’striptag‘ Filter (Entfernt HTML Tags) und ‚trim‘ Filter (entfernt Leerzeichen) definiert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ExampleForm extends BaseForm
{
    public function getForm()
    {
       $this->add($this->getExampleFormField());
       ...
       // weitere Formularfelder einfügen	
    }
    protected function getExampleFormField()
    {
        $field = (new Text('exampleField'))
            ->setAttribute('id', 'exampleFieldId')
            ->setAttribute('name', 'exampleFieldName')
            ->addFilter('trim')
            ->addFilter('striptags')
            ->addValidator(new PresenceOf(array(
  		  'message' => 'The exampleField is required'
	    )));
        ;
        return $field;
    }

Im Controller wird das Formular erstellt und falls es per Post abgeschickt wurde, verarbeitet.
Wichtig für die automatische Filterung ist dabei, dass man beim Erstellen der Formularklasse das zugehörige Entity Model übergibt und das die Post Werte per „bind“ an das Formular übergeben werden.
Durch die „bind“ Funktion werden die gefilterten Werte automatisch an das Entity Model übergeben, so dass man im einfachsten Fall das Entity Model dann direkt speichern kann, sofern das Formalar erfolgreich validiert wurde.

1
2
3
4
5
6
7
8
9
$modelEntity = ModelEntity::findFirst('id = ' . $exampleId);
$form = (new ExampleForm($modelEntity))->getForm();
if ($this->request->isPost() {
   $form->bind($$this->request->getPost(), $form->getEntity());
   if ($form->isValid($this->request->getPost())) {
     if ($modelEntity->save() === false) {
        $this->flashSession->error('Error saving data: ' . implode(',' , $modelEntity->getErrorMessages()));
     }
}

Wenn man die Filter vernünftig konfiguriert und einsetzt, kann man z.B. die Gefahr verringern, dass man schädlichen Javscript Code ungefiltert in der Datenbank speichert.

Veröffentlicht unter Phalcon | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Symfony2 – In Repository Klasse auf Service Container zugreifen

In Symfony2 haben Repository Klassen normalerweise keinen Zugriff auf den Service Container.
Das kann jedoch durchaus sinnvoll sein, damit man in der Repository Klasse z.B. auf Konfigurationsparameter zugreifen kann.
Um dies zu ermöglichen, kann man eine eigene Parent Klasse für die Repository Klassen implementieren, die die Klasse EntityRepository erweitert.
Die jeweilige Repository Klasse, die auf den Service Container zugreifen können soll, muss dann diese Klasse erweitern, als Service definiert und als Service geladen werden, damit das ganze funktioniert.

Die Parent Klasse:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
namespace MyNamespace\lib\Symfony;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
class ContainerAwareRepository extends EntityRepository implements ContainerAwareInterface
{
    protected $container;
    /**
     * Sets the Container.
     * @param ContainerInterface|null $container A ContainerInterface instance or null
     */
    public function setContainer(ContainerInterface $container=null)
    {
        $this->container = $container;
    }
}

Die Repository Klasse muss als Service definiert werden.
Beispiel im Yaml Format:

1
2
3
4
5
6
7
8
  myservices.nameOfRepositoryClass:
    class: MyNamespace\ExampleBundle\Entity\ExampleRepository
    factory_service: doctrine.orm.entity_manager
    factory_method:  getRepository
    arguments:
        - "ExampleNamespaceExampleBundle:ExampleEntity"
    calls:
        - [ setContainer, [ @service_container ] ]

Die Repository Klasse muss die oben definierte Parent Klasse erweitern

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
namespace MyNamespace\ExampleBundle\Entity;
 
use Doctrine\ORM\EntityRepository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use MyNamespace\lib\Symfony\ContainerAwareRepository;
use MyNamespace\ExampleBundle\Entity\ExampleEntity;
 
class ExampleRepository extends ContainerAwareRepository
{
    public function exampleFunction()
    {
        ...
        // jetzt ist der Zugriff auf den Service Container möglich
        $this->container->getParameter('parametername')
        ...
    }
}

Dann muss die Repository im Controller als Klasse als Service geladen werden und bekommt im Konstruktor per Dependency Injection den Service Container als Parameter übergeben.
Somit kann man in der Repository Klasse auf den Service Container zugreifen.

1
$oRepository = $this->getContainer()->get('myservices.nameOfRepositoryClass');
Veröffentlicht unter Symfony2 | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Symfony2 – Application Pfade ändern

Symfony2 gilt als sehr flexibles und relativ einfach anzupassendes Framework.
So es ist kein Problem die Pfade für z.B. die Cachefiles oder die Logfiles zu ändern.
Das macht natürlich nicht nur in der Liveumgebung Sinn, wo man in der Regel mit einer Cluster Umgebung arbeitet und die Logfiles und die Cachefiles zentral halten möchten.
Aber auch in der Entwicklungsumgebung macht es durchaus Sinn, wenn diese Ordner nicht im Projektordner liegen, da sie ansonsten in der Regel von der IDE auch indiziert werden, was bei Suchvorgängen oder beim Starten der IDE zu Performance Einbußen führen kann.

Um die Pfade also bei Symfony2 zu ändern, muss man einfach nur in der Klasse AppKernel die jeweiligen Funktionen der Parent Klasse überschreiben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
class AppKernel extends Kernel
{
    ...
    public function getCacheDir()
    {
        return '/tmp/symfony2cache/';
    }
 
    public function getLogDir()
    {
        return '/tmp/symfony2logs_'.$this->environment;
    }
    ...
}
Veröffentlicht unter Symfony2 | Verschlagwortet mit , , , | Hinterlasse einen Kommentar