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. S H
    S H
    CTO, Formateur, Contributeur.
    @s_hulard
       

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. 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 full-size slide

  7. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. 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 full-size slide

  13. 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 full-size slide

  14. 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 full-size slide

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

    View full-size slide

  16. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

  19. 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 full-size slide

  20. 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 full-size slide

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

    View full-size slide

  22. M ?
    M ?
    Centraliser les comportements…

    View full-size slide

  23. 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 full-size slide

  24. 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 full-size slide

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

    View full-size slide

  26. 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 full-size slide

  27. 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 full-size slide

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

    View full-size slide