PHP Stories: Letztes Array Element [Laravel]

Bevor ich eine wesentlich schnellere Variante mit Laravel zeige, zunächst nochmal ein Rückblick. In einem älteren Beitrag, aus dem Jahr 2016 (PHP Stories: Letztes Array Element), habe ich geschrieben, wie man das letzte Element eines Arrays ermittelt kann. Durch die in PHP vorhandene Funktion end() rückt man den internen Zeiger vom Array bis zum letzten Element vor, und gibt dann dessen Wert zurück.

Eine „Einzeiler“ Varianter die ein Benutzer kommentiert hatte sieht in etwa wie folgt aus:

<?php
$array = ['Toby', 'Lars', 'Yutta', 'Nils'];
echo "Der letzte ist " . $array[array_keys($array)[sizeof($array)-1]];

// Ausgabe: Der letzte ist Nils

An dieser Stelle lohnt es sich nochmal einen Blick auf das PHP-Framework Laravel zu werfen. Hier gibt es bereits Funktionen die solche Probleme komplett auflösen. In Laravel könnte ein Code Beispiel wie folgt aussehen:

<?php
$collection = collect(['Toby', 'Lars', 'Yutta', 'Nils']);

echo $collection->last() . " ist der letzte <br>";
echo $collection->first() . " ist der letzte <br>";

// Ausgabe: Nils ist der letzte <br>Toby ist der letzte <br>

Mit dieser Variante wird anstatt einem Array ein „Collection“ Objekt erstellt. Diese Klasse enthält diverse Interfaces die dafür sorgen, dass das Objekt wie ein Array verwendet werden kann. Neben Methoden wie first, last, count oder filter gibt es viele weitere Methoden um mit einer „Collection“ von Elementen umzugehen.

Für jeden der noch nichts mit Laravel gemacht hat, sollte sich das Framework unbedingt einmal näher anschauen.

Laravel Mailables – Tutorial

Schnell und einfach E-Mails mit Laravel Mailables versenden

Die neue Möglichkeit mit Laravel E-Mails zu versenden

Nun ist es ist es endlich soweit. Laravel 5.3 ist seit Ende August veröffentlicht. Und damit einige neue und großartige Features. Eines der größten Änderungen ist eine neue Art und Weise, wie in Laravel E-Mails versendet werden können.

Hier übrigens eine Zusammenfassung von den größten Änderungen, die Taylor Otwell während der Laracon US schon präsentiert hat. In diesem Beitrag möchte ich mich aber auf Laravel 5.3 Mailables konzentrieren und zeige euch wie man damit den bisherigen Code verbessern kann.

Wie wir bisher E-Mails verschickt haben
Mail::send('layout.email.send', ['title' => $title, 'message' => $message], function ($message)
{
    $message->from('[email protected]', 'Tobias Maxham');
    $message->to('[email protected]');
});

Diese Methode hat zwar bisher gut funktioniert, doch nachdem einige E-Mails gesendet wurden, fängt die Code-Basis irgendwann an chaotisch zu werden. Das soll sich aber nun mit Laravel Mailables deutlich verbessern.

Einführung in Laravel Mailables

Mit Mailables in Laravel werden vorgefertigte Klassen erstellt, die später verschickt werden können. Grundsätzlich sind Mailables verantwortlich für die Datenzusammenstellung und diese dann an die Views weiterzugeben. Und mittlerweile ist die API für das Senden von E-Mails wirklich sehr einfach geworden.

Alles was wir nun machen müssen, um E-Mails in Laravel zu versenden ist folgendes:

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

Wie man sehen kann, ist es deutlich einfacher geworden E-Mails zu verschicken. Trotzdem kann man mit der „alten“ API immer noch E-Mails verschicken. Das wird noch weiterhin unterstützt.

Erstellen einer Mailable-Klasse

Mit artisan, dem genialen Laravel Command-Line-Tool, können wir ganz einfach eine neue mailable-Klasse erstellen:

php artisan make:mail <NameDerMailableKlasse>

In meinem Beispiel habe ich die mailable Klasse DoryFound genannt („Findet Dorie“ kommt ende September im Kino).  Demnach müsste der Befehl wie folgt aussehen:

php artisan make:mail DoryFound

Nachdem wir nun die neue mailable Klasse erstellt haben (zu finden in app/mail) hat diese folgenden Aufbau:

<?php
 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class DoryFound extends Mailable
{
    use Queueable, SerializesModels;
 
    public function __construct()
    {
        //
    }
 
    public function build()
    {
        return $this->view('view.name');
    }
}

Wie man sehen kann, dient die build Methode zum Generieren der Nachricht. In unserem Fall ersetzte ich den Pfad mit email.dory-found. Als nächstes legen wir ein neues Template an. Dazu müssen wir unter ressources/views zunächst einen Ordner email anlegen, sollte dieser noch nicht vorhanden sein, und dort dann eine neue PHP-Datei unter dem Namen dory-found.blade.php.

Daten an die E-Mail View weitergeben

Alle public-Properties der mailable Kasse werden automatisch in der View zur Verfügung gestellt. Daten der View zu übergeben ist also genau so einfach wie die Daten in der mailable Klasse öffentlich zu machen. Sagen wir also, ich möchte den Ort übergeben, an dem ich Dorie gefunden habe, dann muss ich das nur in der Klasse so festhalten:

public $location = 'Ozean';

In der View können wir auf den Wert dann zugreifen, als wäre es eine normale Variable:

<h1>Ich habe es geschafft!</h1>
<p>Ich habe Dory im <strong>{{ $total }}</strong> gefunden.</p>

Zusätzlich könnte man die with-Methode verwenden:

public function build()
{
    return $this->view('emails.dory-found')
                ->with($key, $value);
}

Senden zusätzlicher Parameter

Hinzufügen von BCC, CC und dem ganzen Rest kann auf die $this in der build-Methode aufgerufen werden. Hier ein Beispiel dafür:

public function build()
{
 
    $address = '[email protected]';
    $name = 'TobyMaxham';
    $subject = 'Dorie Gefunden!';
 
    return $this->view('emails.dory-found')
                ->from($address, $name)
                ->cc($address, $name)
                ->bcc($address, $name)
                ->replyTo($address, $name)
                ->subject($subject)
                ->with($key, $value);
}

Fazit

Mit Laravel Mailable lassen sich wirklich schnell und einfach E-Mails versenden. Das Erstellen der Klassen ist genau so leicht wie das Versenden der E-Mails. Wer jedoch lieber die alte Funktionalität nutzen möchte, könnte dies weiterhin nutzen. Ich bin aber schon jetzt ein großer Fan von Laravel 5.3 und werde auch noch weitere Neuerungen wie Notifications oder oAuth beschreiben.

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?

Lesbare URL’s in Laravel

Mit „lesbare“, „clean“ oder auch „pretty“ URL ist eine URL gemeint, die anstelle von technischen Wörtern oder Datenbank-ID’s lesbare Wörter enthält. Außerdem wird auf die Dateierweiterung wie .php oder .html verzichtet. Dabei sieht das nicht nur schön aus, sondern hat noch viele weitere Vorteile:

  • Benutzer können die Relevanz schneller bewerten (eine aussagekräftige URL wird in der Regel eher angeklickt als eine kryptische)
  • Benutzer können sich die URLs leichter merken
  • Externe Links und Lesezeichen auf eine Seite sind wesentlich länger gültig, da sie von internen technischen Änderungen unabhängig sind
  • Bei der Suchmaschinen-Optimierung werden neben dem Seiteninhalt auch Domain- und Dateinamen einzelner Seiten bewertet

Laravel

Im Laravel Projekt wird bereits eine .htaccess Datei mitgeliefert, die genau dies machen kann.

Allerdings kann es vorkommen, dass diese nicht mit Deinen Apache Einstellungen funktionieren. Darum habe ich hier mal ein paar Vorlagen erstellt.

Apache

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Nginx

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

 

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');
    }

...