Damien Flandrin

Tutoriels, astuces et conseils sur le développement web par un développeur web

Les nouveautés de Laravel 5.5

il y a 3 ans · 5 MIN DE LECTURE
#Laravel 

La version 5.5 de Laravel est depuis peu disponible en version LTS ( support à long terme ) , cette version comporte plusieurs améliorations.

Whoops Package

À l'époque de Laravel v4, nous avions une interface plutôt très pratique des traces d'appels pour déboguer nos applications. Il avait étais remplacé pour des raisons obscure quand Laravel 5.0 était sorti mais heureusement, il fait son retour avec Laravel 5.5

laravel-55-whoops.png

Deux nouvelles méthodes Collection

Une autre fonctionnalitée pour le débogage est les méthodes de collection de déboguage dd() et dump(), vous connaissez déjà dd() qui permet d'interrompre le fonctionnement de Laravel pour analyser des valeurs. Vous pouvez le faire désormais à partir d'un objet Collection parmi toutes les autres méthodes all(), avg(), chunk(), etc..

collect([1,2,3])->map(function($i){
    return $i * 2;
})->dd()->reject(function($i){
    return $i < 3;
});

La méthode dump() à l'inverse de dd() permet de retourner le résultat sans interrompre l'exécution de votre code.

collect([1,2,3])->map(function($i){
    return $i * 2;
})->dump()->reject(function($i){
    return $i < 3;
});

Rendu d'exception

Les exceptions peuvent maintenant afficher une réponse si elles définissent une méthode publique de "réponse". En règle générale, dans les versions antérieures de Laravel, vous pouvez ajouter une vérification à la méthode App\Exceptions\Handler::render() et renvoyer conditionnellement une réponse basée sur le type d'exception.

Dans 5.5, vous pouvez simplement lancer l'exception, et il peut répondre sans logique supplémentaire dans votre gestionnaire:

// throw new TerribleSongException($song) dans un controlleur...

namespace App\Exceptions;

use App\Song;

class TerribleSongException extends \Exception
{
    /**
     * @var \App\Song
     */
    protected $song;

    public function __construct(Song $song)
    {
        $this->song = $song;
    }

    /**
     * @param \Illuminate\Http\Request $request
     */
    public function render($request)
    {
        return response("The song '{$this->song->title}' by '{$this->song->artist}' is terrible.");    
    }
}

L'interface Responsable

Nous pouvons créer une classe implémentant l'interface Responsable. Elle peut être retournée à partir d'une méthode d'un contrôleur. Le routeur recherche maintenant une instance de Responsable lors de la préparation d'une réponse depuis Illuminate\Routing\Router.

Voici à quoi pourrait ressembler un exemple, en laissant les détails de la réponse à l'objet NewSongResponse:

public function store(Request $request)
{
    $data = request()->validate([
        'title' => 'required',
        'artist' => 'required',
        'description' => 'required',
        'duration' => 'required|numeric',
        'released_on' => 'required|date_format:Y-m-d',
        'gold' => 'boolean',
        'platinum' => 'boolean',
    ]);

    $song = new Song($data);
    $song->save();

    return new NewSongResponse($song);
}

Voici à quoi pourrait ressembler la classe en implémentant l'interface Responsable :

<?php

namespace App\Http\Responses;

use App\Song;
use Illuminate\Contracts\Support\Responsable;

class NewSongResponse implements Responsable
{
    /**
     * @var \App\Song
     */
    protected $song;

    /**
     * @param \App\Song $song
     */
    public function __construct(Song $song)
    {
       $this->song = $song; 
    }

    public function toResponse($request)
    {
        if ($request->wantsJson()) {
            return response()
                ->json($this->song)
                ->header('Location', route('songs.show', $this->song))
                ->setStatusCode(201);
        }

        return redirect()
            ->route('songs.show', $this->song);
    }
}

Dans cet exemple simple, vous pouvez répondre automatiquement en JSON si vous effectuez une requête en AJAX, et par défaut une réponse avec une redirection.

Nouvelle méthode pour l'objet Request::validate

Dans les versions précédentes de Laravel, vous passeriez l'instance de requête à la méthode $this->validate() dans un contrôleur :

$this->validate(request(), [...]);

Maintenant, vous pouvez simplement appeler validate sur l'objet Request :

$data = request()->validate([
    'title' => 'required',
    'artist' => 'required',
    'description' => 'required',
    'duration' => 'required|numeric',
    'released_on' => 'required|date_format:Y-m-d',
    'gold' => 'boolean',
    'platinum' => 'boolean',
]);

Objets de règles de validation et Closures personnalisées

Les nouveaux objets de règles de validation et de closures personnalisées permettent la création de classe afin de créer de nouvelles règles personnalisées pour l'objet Validate, c'est une excellente alternative à la création de règles personnalisées avec Validator::extend (que vous pouvez toujours utiliser), il offre une solution plus clair pour la création de nouvelle règles lorsque vous cherchez à valider des données.

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class CowbellValidationRule implements Rule
{
    public function passes($attribute, $value)
    {
        return $value > 10;
    }

    public function message()
    {
        return ':attribute needs more cowbell!';
    }
}

Un exemple d'utilisation de cette règle de validation :

<?php
request()->validate([
    'cowbells' => [new CowbellValidationRule],
    'more_cowbells' => [function ($attribute, $value, $fail) {
        if ($value <= 10) {
            $fail(':attribute needs more cowbell!');
        }
    }]
]);

Pour créer des objets de règles de validation personnalisés, vous pouvez utiliser la nouvelle commande make: rule

La séparations des fichiers Factories

Les Models Factory qui permettent de remplir votre base de données avec des fausses données afin de tester change légérement. Avant, nous devions écrire dans un fichier unique dans laquel nous définissons nos Model Factories, maintenant nous avons 1 Model Factory pour 1 Model, nous pouvons également créer un Model Factory lorsqu'on créer un Model via la commande suivante : php artisan make:model -fm Post

Deux nouvelles directives Blade, Auth et Guest

Avant Laravel 5.5, lorsque vous détectez quand un utilisteur est identifier dans une vue, nous étions obliger d'utiliser des conditions @if, maintenant avec les nouvelles directives Blades, vous pouvez simplement utiliser @auth @endauth et @guest @endguest pour identifier les visiteurs connectés ou non.

Modèles dynamiques avec View::first

Lors de la création de composants ou de pages dynamiques, nous souhaitons parfois afficher un modèle personnalisé s'il existe ou sinon se rabattre sur un modèle par défaut. Nous étions autrefois obligé de faire quelque chose comme ceci :

if (view()->exists('custom-template')) {
    return view('custom-template', $data);
}

return view('default-template', $data);

La méthode view ()->first() nous permet de simplifier ceci par :

return view()->first(
    ['custom-template', 'default-template'], $data
);

Nouvelle méthode pour Route

La méthode Route::view nous permet d'éviter d'utiliser un contrôleur ou une closure dans le cas ou nous voulons seulement retourner une vue, vous pouvez définir une URI et un chemin vers un fichier d'une vue blade directement comme ceci:

Route::view('/about', 'pages.about');

Si vous avez besoin de passer des variables :

Route::view('/about', 'pages.about', ['year' => date('Y')]);

Préréglages Frontend

Lorsque vous démarrez un nouveau projet, Laravel fournit par défaut une configuration Vue.js préinstaller. Dans Laravel 5.5, vous pouvez maintenant choisir parmi quelques presets et supprimer tous les presets frontend avec la commande "preset" Artisan dans Laravel 5.5.

Si vous regardez l'aide, vous pouvez voir qu'elle preset est utilisé none, bootstrap, vue, ou react:

php artisan help preset
Usage:
  preset <type>

Arguments:
  type    The preset type (none, bootstrap, vue, react)

# Use react
$ php artisan preset react

# Clear scaffolding
$ php artisan preset none

La commande migration:fresh

La nouvelle commande de migration "migrate:fresh" est un bon ajout à la création d'une base de données propre en développement. La commande migrate:fresh supprime toutes les tables de la base de données, puis exécute les migrations.

Vous connaissez peut-être la commande migrate: refresh qui annule les migrations, puis les réexécute. Habituellement, en développement, vous voulez simplement supprimer les tables, obtenir une nouvelle base de données et lancer des migrations.

Le trait RefreshDatabase

Sur le front des tests, l'attribut RefreshDatabase est la nouvelle façon de migrer les bases de données pendant les tests. Ce nouveau trait prend l'approche la plus optimale pour migrer votre base de données de test selon que vous utilisez une base de données en mémoire ou une base de données traditionnelle. Les traits DatabaseTransactions et DatabaseMigrations sont toujours disponibles en 5.5, ce qui vous permet de mettre à niveau sans utiliser le nouvel attribut RefreshDatabase.

La méthode withoutExceptionHandling()

Le système de test de base hérite d'une méthode withoutExceptionHandling(), qui vous permet de désactiver la gestion des exceptions pour un test. La désactivation de la gestion des exceptions vous permet d'intercepter l'exception dans votre test et d'afficher l'exception au lieu de répondre au gestionnaire d'exceptions. C'est aussi un outil de débogage utile lorsque votre test fait quelque chose que vous n'attendez pas, et que vous voulez voir l'exception réelle.

Détections automatique des packages

La dernière fonctionnalité que nous allons examiner est la détections automatique de packages. Bien que les packages Laravel ne soient généralement pas difficiles à installer, la fonction de détection de paquet signifie que vous n'avez plus besoin de configurer des providers ou des alias. Vous pouvez désactiver la détections automatique pour des packages spécifiques.

source : laravel-news.com

···

Damien Flandrin

Je suis développeur web pour l'agence Carredas, je fais principalement du PHP avec Laravel et Prestashop.

Développeur Web - Damien Flandrin