UX9 URL Shortener: Upgrade auf Laravel 8 – Teil 2

Bevor ich mit der eigentlichen Umstellung begonnen haben, hatte ich mir ausführlich überlegt, was ich alles umstellen muss, und wie ich die Umstellung gestalten möchte. Relativ schnell ist mir aufgefallen, dass das Projekt zwar über die letzten 10 Jahre sehr gewachsen ist, der wesentliche Kern hingegen beschränkt sich auf wenige Klassen. Ich habe mich daher für eine Upgrade Strategie entschieden, die in der Regel für kleinere Projekte sehr gut funktionieren kann, hingegen für größere Projekte viel zu Aufwändig ist.

Hast du den ersten Teil bereits gelesen? Noch nicht, kein Problem. Hier geht es zum ersten Teil: UX9 URL Shortener: Upgrade auf Laravel 8 – Teil 1

Ich nenne die Strategie „Copy-To-New“, mit der ich in den letzten Jahre sehr gut bei kleine Projekten gefahren bin. Dabei ist die eigentliche Umstellung recht schnell beschrieben:

1. Alle Projekt-Dateien in ein „Backup“-Verzeichnis verschieben
2. Neue Laravel Installation bereit stellen
3. „Alten“-Code Schritt für Schritt wieder in die neue Installation verschieben
4. Alle Änderungen Testen (Unit Tests)

Bei dieser Methode ist der 4. Punkt äußerst essentiell. Ich habe die Erfahrung gemacht, dass das Testen der Anwendung am Ende doch schwieriger ist, als man sich das zuvor überlegt hatte. Darum empfehle ich, je nach Größe und Umfang des Projekts, immer PHP-Unit Tests zu verwenden, mit welchen man die Funktion des Programmes auch nach dem Upgrade sicherstellen kann.

Leider hatte ich bis dato noch keinen (nicht einen einzigen) PHP-Unit Test für meinen URL Shortener geschrieben. Da ich aber seit einige Jahren auf das Test-Drive-Development setze, wollte ich das nun auch in diesem Projekt einführen. Also der ideale Zeitpunkt, um nun damit zu beginnen. Mein erster Schritt war also, für das gesamte Programm PHP-Unit Tests zu schreiben. Hier mal ein Beispiel, wie eine Test-Klasse bei mir aussieht. Der Test prüft einige Prozesse vom User-Dashboard:

UX9 Test Cases: URL Shortener

Für diese Phase habe ich etwa 200 Test geschrieben. Ich konnte damit eine Test-Abdeckung von ca. 73% erreichen. Bis zum Ende der Umstellung und weiterem Refactoring, möchte ich eine Test-Abdeckung von über 90% erreichen. Es werden also im Laufe und vermutlich auch direkt nach dem Upgrade noch einige weitere Tests folgen.

Im nächsten Teil dieser Serie, werde ich die ersten beiden Punkte näher beschreiben. Damit ist dann die Grundlage für jede weitere Umstellung gesetzt.

UX9 URL Shortener: Upgrade auf Laravel 8 – Teil 1

Ich habe wieder einmal meinen Urlaub genutzt, um einige meiner privaten Projekte weiter zu entwickeln. Eines meiner derzeit größten Projekten ist mein eigener URL Shortener: https://ux9.de

Das ist neben meiner eigenen Homepage mittlerweile auch das Projekt, welches am längsten läuft. Bereits Ende 2009 habe ich mit den ersten Ideen dazu angefangen und diese noch auf meinem derzeitigen Blog (kein WordPress) genutzt, um externe Verlinkungen zu analysieren und durch eine einfache Verkürzung besser darstellen zu können. Mit dem Erwerb von mehreren dreistelligen Domains, hat mein URL Shortener dann in den darauffolgenden Jahren auch seine eigene Seite bekommen.

Das Projekt wurde mit der Zeit stetig erweitert. Die ersten Jahre habe ich nur PHP ohne Framework verwendet. Seit 2015 habe ich dort dann mit Laravel 4.2 bzw. Laravel 5 als Framework begonnen. Dabei habe ich auch die Grundstruktur des Projektes neu organisiert. Neben stetigen Weiterentwicklungen gab es zuletzt ein Upgrade auf Laravel 6 im September 2019.

Die darauffolgenden Jahre war ich mir nicht sicher, ob ich das Projekt überhaupt noch weiter betreiben möchte oder nicht. Nach viel Überlegen habe ich mich aber dazu entschlossen, das Projekt weiter laufen zu lassen. Die Vorraussetzung dafür ist aber, dass das Projekt von Grund auf neu strukturiert wird, mit Unit-Test ergänzt wird und es eine vernünftige Möglichkeit gibt, dass Administratoren die einzelnen Module verwalten können.

Die Umstellung meiner Seite, möchte ich in dieser Serie von Beiträgen mit euch teilen. Ich hoffe ich kann damit einen kleinen Einblick geben, wie man Projekte sinnvoll umstellen kann. Die Teile werden in den nächsten 1-2 Wochen erscheinen.

Laracon: Übersicht Laravel 5.3

Gestern hat Taylor Otwell auf der LaraconUS einige neue Features von Laravel 5.3 präsentiert. Die Präsentation beinhaltete die vier Hauptpunkte: Laravel Scout, Laravel Passport, Laravel Mailable und Laravel Notifications. Hier nun ein grober Überblick, was man damit alles machen kann.

Laravel Scout

Laravel Scout ist eine Treiber basierende Volltextsuche für Eloquent. Algolia wird bereits bei der Auslieferung unterstützt. Da es jedoch Treiber basierend ist, können und werden noch andere Volltextsuch-Systeme integriert. Da wird es in der nächsten Zeit in der Community viele Vorschläge geben.

Scout kann leicht über einen „Searchable“-Trait in die bestehenden Models eingebaut werden. Anschließend müssen die Daten nur noch über einen Service synchronisiert werden. Dies könnte z.B. so aussehen:

php artisan scout:import App\\Post

Dann kann danach gesucht werden:

Post::search('Alice')->get();

Auch das Paginieren ist möglich:

Post::search('Alice')->paginate();

Genauso wie einfache WHERE-Bedingungen:

Post::search(‘Alice’)—>where('acount_id', '>', 1)->paginate();

Laravel Mailable

Laravel Mailable ist eine neue Mail-Klasse, die das Verenden von E-Mails deutlich verbessert. Das ganze schaut nun viel mehr nach Laravel aus, als die bisherige Vorgehensweise mit der Closure-Funktion.

Mail::to('[email protected]')->send(new OrderComplete);

Es sind alle Mail-Features weiterhin verfügbar:

Mail::to('[email protected]')->cc('[email protected]')->queue(new OrderComplete);

Laravel Notifications

Laravel Notifications erlaubt es uns, Updates über Services wie Slack, SMS oder E-Mail zu machen.

Notifications werden bereits mit einem „responsive transactional“ E-Mail Template ausgeliefert. In der eigentlichen Klasse muss dann nur noch folgendes aufgerufen werden:

 

$this->line('Thank you for joining')
    ->action('Button Text', 'http://url.com')
    ->line('If you have any questions please hit reply')
    ->success();

 

$this->line('Sorry we had a problem with your order')
    ->action('Button Text', 'http://url.com')
    ->error();

Laravel Passport

Laravel Passport ist ein optionales Packages das einen vollständigen OAuth2 Server bereitstellen kann. Man kann damit z.B. Token generieren oder zurücknehmen.

 

Diese Features werden alle noch bis zum Release Dokumentiert. Allerdings wird es bis dahin doch noch ein paar Wochen dauern. Vielleicht ja zur LaraconEU?

Laravel CRUD Serie: Blog Update

<?php

...

    /**
     * Update the specified resource in storage.
     *
     * @param BlogRequest $request
     * @param  int  $id
     * @return Response
     */
    public function update(BlogRequest $request, $id)
    {
	
        try{
            $blog = Blog::findOrFail($id);
        }catch (\Exception $e) {
            return \Redirect::back();
        }
		
		// Update
		$blog->name = $request->get('name');
		
        Session::flash('message', 'Successfully updated blog!');
        return \Redirect::route('blog.index');
    }

...