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

    View Slide

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

    View Slide

  3. L ?
    L ?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. View Slide

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

    View Slide

  20. 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

    View Slide

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

    View Slide

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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

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

    View Slide

  26. M ?
    M ?
    Centraliser les comportements…

    View Slide

  27. 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

    View Slide

  28. 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

    View Slide

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

    View Slide

  30. 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 !

    View Slide

  31. 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.

    View Slide

  32. https://joind.in/talk/a77e5

    View Slide