Design patterns
Local newsletter
1 - Les nouvelles
Créer un enum App\NewsType de type string qui aura les 3 valeurs suivantes :
PoliticsSportsInternational
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 :
registerSubscriberqui prendra unSubscriberInterfaceen paramètres.removeSubscriberqui prendra également uneSubscriberInterfaceen paramètres.notifySubscribersqui prendra uneNewsen 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
PierreetFlorentdans la NewsAgency - On va envoyer des news.
- On va enregistrer
Charlesdans 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)