Skip to content

Commit

Permalink
Feat: New codelabs about composition & generics (PHP Symfo) (#1033)
Browse files Browse the repository at this point in the history
* Feat: New codelabs about composition & generics (PHP Symfo)

* fix markdown and add new pic

* Fix notes & pic

* Optimised images with calibre/image-actions

* fixup! Fix notes & pic

* Fix admonition notes

* Typo in codelab

* Feedbacks typos

* Update release date

* Update index.md

fix typo

* Update conclusion.md

fix typo

* Update initialisation-du-projet.md

fix typo

* Update conclusion.md

fix typo

* Update introduction.md

fix typos

* Update introduction.md

turned h3 into h2

* Update refactoring-du-repository.md

fix typos
changed h3 to h2

* Update typage-generique-avec-phpstan.md

fix typos

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: ArthurJCQ <[email protected]>
Co-authored-by: ElevenTom <[email protected]>
  • Loading branch information
4 people authored Jan 10, 2024
1 parent 2aef60b commit ae78037
Show file tree
Hide file tree
Showing 7 changed files with 653 additions and 0 deletions.
Binary file modified _assets/authors/ajacquemin.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
contentType: tutorial
lang: fr
date: '2024-01-10'
slug: composition-over-inheritance-et-typage-generique-avec-symfony-et-doctrine
title: Composition over inheritance et typage générique avec Symfony et Doctrine
excerpt: >-
Abordons ensemble une solution pour utiliser l'injection de dépendance plutôt que l'héritage pour créer nos repositories Doctrine, tout en tirant parti du typage générique grâce à PHPStan.
categories:
- php
authors:
- ajacquemin
keywords:
- symfony
- composition
- inheritance
- generics
steps:
- introduction
- initialisation-du-projet
- refactoring-du-repository
- typage-generique-avec-phpstan
- conclusion
---
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
contentType: tutorial-step
tutorial: composition-over-inheritance-et-typage-generique-avec-symfony-et-doctrine
slug: conclusion
title: Conclusion
---
## Conclusion

Ouf ! Et voilà ! Vous êtes arrivés au bout de ce Codelabs, félicitations ! Pour rappel, vous trouverez le code de ce Codelabs [ici sur mon Github](https://github.com/ArthurJCQ/codelabs-compo), n'hésitez pas à y jeter un oeil.

Vous êtes à présent, je l'espère, plus familier avec le concept de **composition over inheritance**, et le typage générique en PHP n'a plus aucun secret pour vous.

Je vous rajoute quelques sources ici qui m'ont aidé à écrire ce Codelabs :
- [PHPStan Generics](https://phpstan.org/blog/generics-in-php-using-phpdocs)
- [Using composition over inheritance for doctrine repository in symfony](https://www.inanzzz.com/index.php/post/iyan/using-composition-over-inheritance-for-doctrine-repository-in-symfony)

Merci beaucoup d'avoir suivi jusqu'ici, et à très vite !
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
---
contentType: tutorial-step
tutorial: composition-over-inheritance-et-typage-generique-avec-symfony-et-doctrine
slug: initialisation-du-projet
title: Initialisation du projet
---
## Initialisation du projet

Pour commencer, initialisez un nouveau projet Symfony [selon votre OS](https://symfony.com/download).

Pour moi (Ubuntu), ce sera comme cela :

```bash
$ symfony new codelabs-symfo-repo
```

À présent, installons les différentes librairies requises, en commençant par Doctrine.

```bash
$ composer require symfony/orm-pack
```

On installe le `maker` de Symfony pour aller plus vite :

```bash
$ composer require --dev symfony/maker-bundle
```

Enfin, installons PHPStan dès à présent pour plus tard.

```bash
$ composer require --dev phpstan/phpstan
```

Super, nous sommes à présent prêts à créer notre entité qui nous accompagnera tout le long de ce codelabs.

Faisons simple, et créons une entité `Post` avec un `title` et un `content` avec la commande :

```bash
$ bin/console make:entity
```

Super ! Comme vous le savez, cette commande a créé une nouvelle entité ainsi que son repository, respectivement dans les dossiers `src/Entity` et `src/Repository`.
On remarque que notre repository étend par défaut le `ServiceEntityRepository` de Doctrine, qui contient toutes les méthodes :

```php
/**
* @extends ServiceEntityRepository<Post>
*
* @method Post|null find($id, $lockMode = null, $lockVersion = null)
* @method Post|null findOneBy(array $criteria, array $orderBy = null)
* @method Post[] findAll()
* @method Post[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PostRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Post::class);
}

// ...
```

<div class="admonition note" markdown="1"><p class="admonition-title">Note</p>
Notez au passage le tag <code>ServiceEntityRepository&lt;Post&gt;</code> qui est un avant-goût de ce que nous ferons plus tard avec le typage générique.
</div>

Comme on peut l'observer, notre repository est extrêmement couplé à Doctrine. Et de nombreuses méthodes que nous n'utiliserons jamais viennent polluer cette classe.
Nous allons donc nettoyer et alléger notre repository dans la prochaine partie.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
contentType: tutorial-step
tutorial: composition-over-inheritance-et-typage-generique-avec-symfony-et-doctrine
slug: introduction
title: Introduction
---
## Qu'allons-nous faire ?

Sans doute qu'aujourd'hui, lors de l'installation d'un nouveau projet Symfony avec Doctrine, vous gardez le design de base de ces classes, avec une classe qui étend du repository de base de Doctrine, l'`EntityRepository`.

Quel est le problème me direz-vous ? Eh bien tout d'abord, mettons que vous n'ayez besoin que de la méthode `find` de votre repository. Ici, vous hériterez bien de cette méthode, mais également de toutes les autres venant du repository de base de Doctrine. Ainsi, n'importe quel développeur pourrait utiliser le `getEntityManager` qui permet ensuite d'effectuer toutes les opérations de mutation (insertion, mise à jour, suppression) d'un objet dans votre base de données, et ce même si vous ne souhaitez pas que ce soit possible.
De plus, l'`EntityManager` est un concept étroitement lié à Doctrine dans notre cas.
Ainsi, on dira que le détail de notre implémentation (ici Doctrine et toutes ses méthodes & ses concepts) va *fuir* dans notre code métier, et ce n'est pas ce que l'on veut.

Pour régler cela, nous allons utiliser l'injection de dépendance.

De plus, nous aurons besoin d'être aidé par un typage plus strict pour faciliter et améliorer notre expérience de développement. Pour cela, nous utiliserons le typage générique. Comme vous le savez sûrement, ce n'est pas possible nativement en PHP de faire ce genre de typage, mais grâce à l'outil d'analyse statique PHPStan, nous contournerons ce problème.
En cela, ce Codelabs est une mise en application de [cet article sur le typage générique en PHP](https://blog.eleven-labs.com/fr/typage-generique-en-php/) sorti sur le blog d'Eleven Labs. Allez y jeter un oeil !

Enfin, le code source de ce Codelabs est disponible sur mon GitHub :
- [Codelab Symfo/Doctrine](https://github.com/ArthurJCQ/codelabs-compo)


## Pré-requis

Pour les besoins de ce tutoriel il vous faudra :

- Avoir PHP d'installé sur votre machine (ou via Docker si vous vous sentez plus à l'aise)
- Avoir des bases en Symfony & Doctrine
- Avoir lu [notre article](https://blog.eleven-labs.com/fr/typage-generique-en-php/) sur le typage générique en PHP (idéalement)

> Le tout est développé avec PHP 8.2
Loading

0 comments on commit ae78037

Please sign in to comment.