Lumen est un nouveau framework léger qui est en fait un Laravel 5 qui a subi une bonne cure d’amaigrissement. Il rentre en concurrence avec les micro-frameworks comme slim ou silex. On trouve donc dans Lumen des composants de Laravel mais pas tous. Cet article a pour but de faire le point de ce nouveau venu et de l'illustrer à travers une application qui est en fait une réécriture de celle que j'avais faite pour Laravel et pour laquelle j'ai écrit quelques articles. J'ai pu ainsi faire concrètement le point des différences.
Pour quels usages ?
Lumen a pour objectif d'être léger est rapide, mais c'est au prix de l'abandon de nombreuses fonctionnalités. Par exemple les sessions ne sont pas activées par défaut, de même que Eloquent. Mais il demeure évidemment possible d'ajouter tout ce dont on a besoin, soit en activant un composant juste en dé-commentant du code, soit en chargeant un nouveau composant.
Lumen est plutôt destiné à la création de petits services qui ne trouveraient pas dans Laravel une réponse adaptée. On a parfois besoin de ces petits services rapides. D'autre part lorsqu'on crée une application SPA (Single Page Application) on a surtout besoin d'APIs rapides pour lesquelles Lumen semble parfait.
Installation
Lumen a besoin de :- PHP >= 5.4
- Mcrypt PHP Extension
- OpenSSL PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
- Avec l'installeur :
composer global require "laravel/lumen-installer=~1.0"Et ensuite créer un Lumen :
lumen new myservice
- Avec composer :
composer create-project laravel/lumen --prefer-dist
Configuration
Contrairement à Laravel il n'y a pas de dossier config. Toutes les données de configuration se trouvent dans le fichier .env à la racine du site. A l'installation vous trouvez un fichier .env.example, faites en une copie que vous appelez .env.
Par défaut vous trouvez memcached pour les caches :
CACHE_DRIVER=memcached SESSION_DRIVER=memcachedSi vous ne l'avez pas installé changez pour un simple cache en fichier :
CACHE_DRIVER=file SESSION_DRIVER=file
D'autre part si vous voulez que les variables d'environnement soient reconnues il faut dé-commenter cette ligne dans bootstrap/app.php :
// Dotenv::load(__DIR__.'/../');
Vous verrez d'ailleurs un certain nombre d'éléments commentés dans ce fichier. Par exemple si vous voulez les façades vous devez dé-commenter cette ligne :
// $app->withFacades();
De même si vous voulez Eloquent :
// $app->withEloquent();
Pour mon application d'exemple j'ai aussi mis en œuvre les middlewares dans ce fichier :
$app->middleware([ 'Illuminate\Cookie\Middleware\EncryptCookies', 'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 'Illuminate\Session\Middleware\StartSession', 'Illuminate\View\Middleware\ShareErrorsFromSession', 'Laravel\Lumen\Http\Middleware\VerifyCsrfToken', ]); $app->routeMiddleware([ 'auth' => 'App\Http\Middleware\Authenticate', 'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', ]);
Les routes
Le routage est simplifié par rapport à Laravel. On utilise nikic/FastRoute. On y gagne en rapidité et évidemment on y perd en possibilités.
Le routage de mon application avec Laravel se résume à :
Route::get('/', function(){ return view('index'); }); Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]); Route::resource('dream', 'DreamController', ['only' => ['index', 'store', 'update', 'destroy']]);
Avec Lumen je suis obligé de tout détailler :
$app->get('/', function() { return view('index'); }); $app->get('auth/log', ['uses' => 'App\Http\Controllers\Auth\AuthController@getLog']); $app->post('auth/login', ['uses' => 'App\Http\Controllers\Auth\AuthController@postLogin']); $app->get('auth/logout', ['uses' => 'App\Http\Controllers\Auth\AuthController@getLogout']); $app->get('auth/register', ['uses' => 'App\Http\Controllers\Auth\AuthController@getRegister']); $app->post('auth/register', ['uses' => 'App\Http\Controllers\Auth\AuthController@postRegister']); $app->get('password/email', ['uses' => 'App\Http\Controllers\Auth\PasswordController@getEmail']); $app->post('password/email', ['uses' => 'App\Http\Controllers\Auth\PasswordController@postEmail']); $app->get('password/reset/{token}', ['uses' => 'App\Http\Controllers\Auth\PasswordController@getReset']); $app->post('password/reset', ['uses' => 'App\Http\Controllers\Auth\PasswordController@postReset']); $app->get('dream', ['uses' => 'App\Http\Controllers\DreamController@index']); $app->post('dream', ['uses' => 'App\Http\Controllers\DreamController@store']); $app->put('dream/{id}', ['uses' => 'App\Http\Controllers\DreamController@update']); $app->delete('dream/{id}', ['uses' => 'App\Http\Controllers\DreamController@destroy']);
Toutefois l'ensemble est très lisible.
L'authentification
On dispose du composant Illuminate\Auth donc toute l'intendance est présente, mais on a perdu les contrôleurs et les traits. Pour l'application j'ai donc créé les contrôleurs :
On a aussi perdu le registrar de Laravel. J'ai donc tout rapatrié dans les contrôleurs (intendance des traits et validation). J'ai ajouté le fichier pour les messages pour le renouvellement du mot de passe :
J'ai créé un repository pour User :
Il sert juste à enregistrer les nouveau utilisateurs mais c'est plus propre comme ça.
J'ai aussi placé les vues :
L'helper csrf_token() a disparu, il m'a donc fallu le remplacer par session()->getToken() pour que ça fonctionne.
J'ai aussi mis en place les middlewares :
Pour l'envoi des Email pour le renouvellement du mot de passe j'ai chargé le composant illuminate/mail dans composer.json parce que par défaut Lumen n'envoie pas d'email :
"require": { "laravel/lumen-framework": "5.0.*", "vlucas/phpdotenv": "~1.0", "illuminate/mail": "5.0.*" },
De cette façon toute la partie authentification se passe parfaitement.
On voit qu'il n'est pas très difficile de retrouver cette fonctionnalité même si manifestement Lumen n'a pas été pensé dans cet objectif.
Les rêves
Pour la partie de l'application qui concerne la gestion des rêves, donc celle qui est parfaitement adaptée à Lumen je n'ai eu aucun souci. J'ai directement copié modèle et repository : J'ai aussi copié le contrôleur :Là j'ai dû un peu changer le code parce qu'on n'a plus de requête de formulaire pour la validation. Je suis donc revenu à un codage plus classique :
/** * Validation rules. * */ protected $rules = [ 'content' => 'required|max:2000', ]; ... /** * Update the specified resource in storage. * * @param Illuminate\Http\Request $request * @param int $id * @return Response */ public function update(Request $request, $id) { $this->validate($request, $this->rules); if ($this->dreamRepository->update($request->all(), $id)) { return response()->json(['result' => 'success']); } }Au final l'application fonctionne parfaitement et est plus rapide. Mais je n'ai pas fait de mesure pour estimer le gain.
Par bestmomo
Nombre de commentaires : 6