Design patterns - Local newsletter
1 - Les nouvelles
Créer un enum App\NewsType
de type string
qui aura les 3 valeurs suivantes :
Politics
Sports
International
Créer ensuite une classe App\News
, cette classe aura 3 propriétés publiques readOnly :
- title:
string
- content:
string
- type:
App\NewsType
Qui seront définies au constructeur, déclaré en privé.
Enfin, créer 3 méthodes statiques :
public static function CreateAboutPolitics(string $title,string $content): App\News
public static function CreateAboutSports(string $title,string $content): App\News
public static function CreateAboutInternational(string $title,string $content): App\News
Enfin, on va créer un tableau mélangé de news comme suit :
- 3 news de Politiques
- 2 news sports
- 4 news relations internationales.
$news = [
News::CreateNewsAboutPolitics("La politique locale en ébullition", "Les débats s'intensifient avant les prochaines élections."),
News::CreateNewsAboutSports("Victoire éclatante de l'équipe locale", "Un match mémorable pour les fans de football."),
News::CreateNewsAboutInternational("Sommet mondial sur le climat", "Des accords importants ont été signés pour l'avenir de la planète."),
News::CreateNewsAboutPolitics("Débats parlementaires tendus", "L'opposition demande de nouvelles réformes économiques."),
News::CreateNewsAboutSports("Nouveau record battu !", "Un athlète local a dépassé toutes les attentes."),
News::CreateNewsAboutInternational("Crise diplomatique en cours", "Des tensions croissantes entre deux nations voisines."),
News::CreateNewsAboutPolitics("Élections primaires approchent", "Les candidats multiplient les meetings à travers le pays."),
News::CreateNewsAboutInternational("Traité de paix signé", "Un accord historique met fin à des décennies de conflit."),
News::CreateNewsAboutInternational("Découverte archéologique majeure", "Un site ancien révèle des secrets insoupçonnés."),
]
2 - Abonnés
2.1 - L’interface
Créer une interface nommée App\SubscriberInterface
. Cette interface déclarera une méthode update
qui prendra en paramètres une News
et ne renverra pas de valeur.
2.2 - L’abonné
Créer une classe App\UserSubscriber
qui représentera l’abonné au journal.
Cette classe aura un name
qui sera publiquement déclarée et devra implémenter l’interface SubscriberInterface
.
La méthode devra afficher lors de l’appel à l’update le message suivant :
{{NAME}} a lu la nouvelle : {{TITLE}} - {{TYPE}}
On va ensuite créer 3 abonnés :
- Pierre
- Florent
- Charles
3 - L’agence de presse
3.1 - L’interface
Créer une interface App\NewsEmitter
qui aura 3 méthodes publiques :
registerSubscriber
qui prendra unSubscriberInterface
en paramètres.removeSubscriber
qui prendra également uneSubscriberInterface
en paramètres.notifySubscribers
qui prendra uneNews
en paramètre.
3.2 - L’agence
Créer une classe App\NewsAgency
qui implémente l’interface App\NewsEmitter
.
Cette classe devra gérer un tableau d’abonnés. A l’appel de notifySubscribers, il faudra appeler toutes les méthodes de update
.
4 - Scenario complet.
Voici un déroulé du scénario que j’imagine :
- On va créer une nouvelle NewsAgency
- On va créer 3 Subscribers : Pierre et Florent, Charles
- On va envoyer une news.
- On va enregistrer
Pierre
etFlorent
dans la NewsAgency - On va envoyer des news.
- On va enregistrer
Charles
dans la NewsAgency. - On va envoyer des news.
- On va dés-enregistrer
Charles
- On va envoyer des news.
Aller plus loin
On va créer un nouveau Subscriber de style WebsiteSubscriber
. Cette classe a chaque news reçue, devra envoyer une requête en POST vers l’extérieur (on pourra utiliser le site webhook.site)