Cover Image

Gestern fand das erste Treffen des Jahres 2017 bei netz98 in Mainz statt. Als Thema hatten wir eigentlich „Build Automatisation“ vorgesehen. Leider musste das Thema verschoben werden. Das machte aber nichts da wir immer gute „AdHoc-Themen“ finden. So auch an diesem Abend. Jan Unger fingt mit einer Projekt-Vorstellung an.

Symfony Project „Solar Panels“

Das von Jan vorgestellt Projekt „Solvation“ ist eine Symfony Applikation. Der Zweck der Anwendung ist es sich ein grobe Kostenkalkulation für die Ausstattung seines Hauses mit Solar-Panels erstellen zu lassen. Das besondere am System ist, dass der Kunde selbst sein Haus über eine Google-Map-Integration suchen kann. Danach ist es möglich im kleinsten Zoom-Level das Haus grob zu vermessen. Die Anwendung „kachelt“ dann die Solar-Panels direkt in der Google-Map auf das Dach. Es muss noch der Neigungswinkel eingestellt werden und eine Grobkalkulation kann erstellt werden. Die Anwendung ist über Services getrennt und ist auch als White-Label Lösung einsetzbar. Ein Teil der Anwendung besteht aus der Generierung von PDF-Dateien. Jan zeigte uns wie sein Vorgehen beim Testen der generierten Dateien aussieht was direkt in die nächste Diskussion über Unit-Tests mündete.

PHPUnit - Aufruf statischer Assert-Methoden

Sollen PHPUnit Asserts statisch aufgerufen werden? Das Thema wurde auch schon an anderen Stellen diskutiert. Bei PHPUnit ist auch entsprechendes Github Issuevorhanden. Die Grundaussage ist, dass man aus Gewohnheit $this anstatt self:: verwenden soll. Auf der anderen Seite schlagen dann Code-Checker in IDEs wie PHPStorm an. Hier wurde auch auf die Möglichkeit einer erweiterten Prüfung mit dem PHPStorm-Plugin „Ea Extended“ eingegangen.

Randthemen

Randthemen waren das Chrome Plugin Octotree das es ermöglicht in Github eine netten Baumansicht als Sidebar zu erhalten. Auch das PHPStorm Plugin „Power Mode 2“ sorgte für Lacher. Einach mal anschauen…. Mein Ding ist es nicht.

RoboTask

Ein Thema war RoboTask welches es auf einfache Weise ermöglicht Tasks für ein PHP-Projekt anzulegen. Im Vergleich mit anderen Task-Tools ist es hier sehr schnell möglich ein Ergebnis zu erhalten.

Beispiel-Robo-File:

<?php

/**
 * This is project's console commands configuration for Robo task runner.
 *
 * @see http://robo.li/
 */
class RoboFile extends \Robo\Tasks
{
    public function composerInstall()
    {
        $this->taskComposerInstall()
            ->preferDist()
            ->run();
    }

    /**
     * @param array $opts
     */
    public function runPhpcsfixer($opts = ['diff' => false, 'dry-run' => false])
    {
        $task = $this->taskExec('vendor/bin/php-cs-fixer')
            ->arg('fix')
            ->option('config-file', __DIR__ . '/.php_cs')
            ->option('-v');

        if ($opts['diff']) {
            $task->option('diff');
        }

        if ($opts['dry-run']) {
            $task->option('dry-run');
        }

        $task->run();
    }

    /**
     * @param array $opts
     */
    public function runTests($opts = ['debug' => false, 'coverage|c' => false, 'testdox' => false])
    {
        $pathToPhpUnit = 'vendor/bin/phpunit';

        $task = $this->taskPHPUnit($pathToPhpUnit)
            ->configFile('tests/unit');

        if ($opts['testdox']) {
            $task->option('testdox');
        }

        if ($opts['debug']) {
            $task->debug();
        }

        if ($opts['coverage']) {
            $task->configFile('tests/unit')
                ->xml('build/output/phpunit/junit.xml')
                ->option('coverage-clover', 'build/output/phpunit/clover.xml')
                ->option('coverage-html', 'build/output/phpunit/html');
        }

        $task->run();
    }

    public function composerValidate()
    {
        $this->taskComposerValidate()
            ->strict()
            ->run();
    }

    public function runCi()
    {
        $this->stopOnFail();

        $this->composerValidate();
        $this->composerInstall();
        $this->runPhpcsfixer(['diff' => true, 'dry-run' => true]);
        $this->runTests(['coverage' => true, 'debug' => true, 'testdox' => true]);
    }
}

Alle public Methoden werden direkt in ausführbare Kommandos übersetzt. Im Hintergrund arbeiten einige Symfony-Komponenten wie „Console“, „Filesystem“ oder „Process“ was das Tools in seinem eigentlich Code-Umfang schlank hält. Interessant ist auch die Nutzung als Framework oder das generieren einer eigenen CLI-Anwendung als Phar-Datei. Dieser Ansatz ist mir für CLI-Anwendungen so bisher noch nicht aufgefallen.

Pre-Commits

Nach den Tasks bot es sich an noch auf GIT Pre-Commit-Hooks einzugehen. Genauer geht es um ein Pre-Commit Framework das eine einfache und wiederverwendbare Lösung bietet. Über die Lösung ist es möglich einen Teil der QS auf den Client zu verlagern bzw. für weniger unwichtige Builds im CI-System zu sorgen. Ich hatte vor Kurzem bereits dazu im neuen dev98.de Blog einen Artikel mit dem Thema „A framework to prevent invalid stuff in your git repository“ geschrieben.

Für PHP-Entwickler ist das Hook-Repository von Hootsuite interessant. Es erweitert das Framework um PHP-Hooks.

Pre-Build PHP Hooks (Hootsuite)

Als Alternative hatten wir uns kurz GrumPHPangeschaut.

Fazit

Auch ohne feste Themen hat es gestern wieder sehr viel Spass gemacht sich über aktuelle Projekte und Tools auszutauschen. Ich freue mich schon auf das nächste Treffen.

**UPDATE**:

Scheinbar war es sogar schon das 46. Treffen. Das kommt davon, wenn man nicht zu jedem Treffen einen Blogbeitrag verfasst. Ich versuche den Überblick zu bewahren. Danke Matthias.