Slide 1

Slide 1 text

L L

Slide 2

Slide 2 text

S H S H CTO, Formateur, Contributeur. @s_hulard    

Slide 3

Slide 3 text

L ? L ?

Slide 4

Slide 4 text

U ' … U ' … 2011: Premier commit, 2013: v4.0.0, 2015: v5.0.0, 2019: v5.9.0 ?

Slide 5

Slide 5 text

D … D … … pour les habitués à Symfony

Slide 6

Slide 6 text

U ! U ! Et une documentation très accessible…

Slide 7

Slide 7 text

T T ▶ composer.json ▶ .env ▶ ORM (ActiveRecord) + Migrations ▶ CLI ▶ Templates ▶ Intégration frontend (Elixir)

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

U U //routes/api.php Route::post('/upload', function() { request('image')->store('images'); }); 1 2 3 4

Slide 12

Slide 12 text

F F Route::post('/upload', function() { ... });

Slide 13

Slide 13 text

H H /** @var UploadedFile */ request('image')->store('images');

Slide 14

Slide 14 text

Not so bad… …l'amélioration continue !

Slide 15

Slide 15 text

I I use Illuminate\Http\Request; Route::post('/upload', function(Request $request) { $request 1 2 3 4 ->file('image') 5 ->store('images'); 6 }); 7

Slide 16

Slide 16 text

V V $request->validate([ 'image' => 'required|image' ]); Route::post('/upload', function(Request $request) { 1 2 3 4 5 $request->file('image')->store('images'); 6 }); 7

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

S S Chaque chose à sa place… …Contrôleur, Route, Service.

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

R R Route::post( '/upload', 'Api\User\UploadProfilePicture' ); 1 2 3 4

Slide 22

Slide 22 text

S S Les services sont des objets… … construits et gérés par le conteneur … … injectés à l'exécution.

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

V ' V ' Arrêter le processus le plus tôt possible… … Middlewares et FormRequest.

Slide 26

Slide 26 text

M ? M ? Centraliser les comportements…

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

E ! E ! Une micro application, Testable, maintenable, Et surtout pas de magie !

Slide 30

Slide 30 text

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 !

Slide 31

Slide 31 text

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.

Slide 32

Slide 32 text

https://joind.in/talk/a77e5