Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel : the good, the bad and the ugly...

Laravel : the good, the bad and the ugly...

En France Laravel fait l'objet de troll, et de critiques sur les patterns utilisés et l'approche technique de son créateur Taylor Otwell. La communauté grandit et de plus en plus de développeurs sont amenés à travailler sur ce framework. Comme pour n'importe quel outil, il faut apprendre à s'en servir !

Je propose de passer un peu sous le capot et de voir comment utiliser la puissance de Laravel en respectant une approche solide dans le développement. Je parlerai d'injection de dépendances, de contrat, de tests, de services car oui il est possible de coder correctement avec ce framework !

Stéphane HULARD

May 17, 2019
Tweet

More Decks by Stéphane HULARD

Other Decks in Technology

Transcript

  1. L L

  2. U ' … U ' … 2011: Premier commit, 2013:

    v4.0.0, 2015: v5.0.0, 2019: v5.9.0 ?
  3. T T ▶ composer.json ▶ .env ▶ ORM (ActiveRecord) +

    Migrations ▶ CLI ▶ Templates ▶ Intégration frontend (Elixir)
  4. U U # Création d'un projet vierge composer create-project laravel/laravel

    # Démarrage du serveur web intégré à PHP ./artisan serve # Homepage: http://localhost:8000
  5. A A ├── app │ ├── Console │ │ └──

    Kernel.php │ ├── Exceptions │ ├── Http │ │ ├── Controllers │ │ ├── Middleware │ │ └── Kernel.php │ ├── Providers │ └── User.php ├── bootstrap ├── config │ ├── app.php │ └── … ├── database │ ├── migations │ ├── seeds ├── routes │ ├── api.php │ ├── web.php │ └── … ├── public ├── resources └── storages
  6. C C use Illuminate\Contracts\Filesystem\Filesystem; function(Request $request, Filesystem $filesystem) { $file

    = $request->file('image'); $filesystem->put( sprintf('images/%s', $file->hashName()), $file ); 1 2 Route::post( 3 '/upload', 4 5 //[...] Validation 6 7 8 9 10 11 12 } 13 ); 14
  7. C C namespace App\Http\Controllers\Api\User; class UploadProfilePicture { private $filesystem; public

    function __construct(Filesystem $filesystem) { $this->filesystem = $filesystem; } public function __invoke(Request $request) { // Action… } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14
  8. S S Les services sont des objets… … construits et

    gérés par le conteneur … … injectés à l'exécution.
  9. D D APPSERVICEPROVIDER::BOOT APPSERVICEPROVIDER::BOOT use Illuminate\Contracts\Filesystem\Filesystem; use Illuminate\Filesystem\FilesystemManager; use Illuminate\Foundation\Application;

    $this->app->bind( Filesystem::class, function(Application $app) { return $app ->make(FilesystemManager::class) ->disk('local'); } ); 1 2 3 4 5 6 7 8 9 10 11 12
  10. C B C B //... use App\Http\Controllers\Api\User; $this->app ->when(User\UploadProfilePicture::class) ->needs(Filesystem::class),

    ->give(function(Application $app) { return $app ->make(FilesystemManager::class) ->disk('local'); }); 1 2 3 4 5 6 7 8 9 10 11
  11. V ' V ' Arrêter le processus le plus tôt

    possible… … Middlewares et FormRequest.
  12. F R F R ./artisan make:request UploadUserProfile namespace App\Http\Requests; use

    Illuminate\Foundation\Http\FormRequest; use Illuminate\Http\UploadedFile; class UploadUserProfile extends FormRequest { public function rules() { return ['image' => 'required|image']; } public function image(): UploadedFile { return $this->validated()['image']; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  13. C C namespace App\Http\Controllers\Api\User; use App\Http\Requests\UploadUserProfile; class UploadProfilePicture { public

    function __construct(Filesystem $filesystem) { $this->filesystem = $filesystem; } public function __invoke(UploadUserProfile $request) { $image = $request->image(); $this->filesystem->put('images', $image); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
  14. A … A … Laravel est un outil et seulement

    un outil… Très rapide pour prototyper … Très riche en fonctionnalités par défaut … Mais pas adapté à tout les cas !
  15. A … A … Ne pas prendre tout les raccourcis

    possible… Prendre le temps d'apprendre… Réfléchir au projet dans son ensemble… Comprendre l'architecture de votre code.