{"id":229353,"date":"2022-11-02T11:00:00","date_gmt":"2022-11-02T08:00:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229353"},"modified":"2022-11-09T06:38:31","modified_gmt":"2022-11-09T03:38:31","slug":"singletons-dans-wordpress-revisites-un-temps-et-un-lieu","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/singletons-dans-wordpress-revisites-un-temps-et-un-lieu\/","title":{"rendered":"Singletons dans WordPress, revisit\u00e9s (Un temps et un lieu ?)"},"content":{"rendered":"\n<p>Avant de commencer un article sur l&rsquo;utilisation de singletons dans WordPress (ou, plus exactement, le <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton Pattern<\/a> ), je veux m&rsquo;assurer que vous avez lu les deux articles suivants :<\/p>\n<ul>\n<li><a href=\"http:\/\/wpkrauts.com\/2013\/cloning-in-php-or-why-your-singleton-might-kill-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Le clonage en PHP, ou pourquoi votre singleton pourrait tuer WordPress<\/a> par <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomas Scholz<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Les singletons et leur utilisation dans WordPress<\/a> par <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carl Alexander<\/a><\/li>\n<\/ul>\n<p>Ces deux articles fournissent une perspective extr\u00eamement pr\u00e9cieuse sur ce mod\u00e8le et les dangers de l&rsquo;utiliser chaque fois que nous l&rsquo;utilisons tout au long de notre travail dans WordPress ; Cependant, cela signifie-t-il que nous devrions compl\u00e8tement les \u00e9viter ?<\/p>\n<p>Je ne pense pas.<\/p>\n<p>L\u00e0 encore, je reconnais \u00e9galement que les articles ne disent pas de les \u00e9viter compl\u00e8tement. Ils donnent des arguments solides sur la fa\u00e7on de les utiliser et les dangers de les utiliser si vous choisissez de le faire.<\/p>\n<p>Et m\u00eame si je les ai certainement utilis\u00e9s dans le pass\u00e9, j&rsquo;ai g\u00e9n\u00e9ralement arr\u00eat\u00e9. Cependant, je suis r\u00e9cemment tomb\u00e9 sur un cas d&rsquo;utilisation pour un projet dans lequel je pense que c&rsquo;est acceptable.<\/p>\n<h2>Vous utilisez toujours des singletons dans WordPress\u00a0?<\/h2>\n<p>Afin de donner une raison pour laquelle je consid\u00e8re m\u00eame ce mod\u00e8le particulier, je pense qu&rsquo;il vaut la peine de comprendre d&rsquo;abord le cas d&rsquo;utilisation. Pour faire simple :<\/p>\n<ul>\n<li>Il existe une page d&rsquo;administration qui permet \u00e0 l&rsquo;utilisateur de s\u00e9lectionner la mani\u00e8re dont il souhaite afficher les dates sur le front-end du site.<\/li>\n<li>Lorsque l&rsquo;utilisateur enregistre l&rsquo;option, il \u00e9crira le format <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">bas\u00e9 sur PHP<\/a> pour la date dans un tableau de WordPress.<\/li>\n<li>Lors du rendu d&rsquo;une date, la valeur sera extraite de la base de donn\u00e9es et appliqu\u00e9e \u00e0 la date \u00e0 rendre.<\/li>\n<\/ul>\n<p>Et pour ceux qui sont curieux, il n&rsquo;y a qu&rsquo;une poign\u00e9e &#8211; disons quatre ou cinq &#8211; fa\u00e7ons dont nous permettons \u00e0 l&rsquo;utilisateur d&rsquo;afficher la date.<\/p>\n<p>Parce que ce projet particulier permet aux utilisateurs d&rsquo;importer des CSV de donn\u00e9es (qui incluent des dates) et qui leur permettent de restituer les donn\u00e9es des CSV bien que dans un format diff\u00e9rent, il convient de noter qu&rsquo;il y a une bonne quantit\u00e9 de formatage de date qui se produit sur le back-end.<\/p>\n<p>Naturellement, une question se pose :<\/p>\n<p>Pourquoi ne pas simplement formater la date \u00e0 laquelle l&rsquo;utilisateur importe son CSV\u00a0?<\/p>\n<p>Et c&rsquo;est parce que l&rsquo;utilisateur peut choisir de changer la fa\u00e7on dont la date est rendue apr\u00e8s l&rsquo;importation du CSV.<\/p>\n<p>Cela dit, il existe un tout autre m\u00e9canisme dans le plugin charg\u00e9 de valider, de nettoyer et d&rsquo;\u00e9crire les entr\u00e9es de l&rsquo;utilisateur dans la base de donn\u00e9es.<\/p>\n<p>Mais quand vient le temps de saisir des valeurs de la base de donn\u00e9es, en particulier lorsqu&rsquo;il s&rsquo;agit de lire une valeur dans une table de base de donn\u00e9es, et de le faire \u00e0 plusieurs points de l&rsquo;application, ne serait-il pas logique d&rsquo;avoir un seul point de dont la valeur peut \u00eatre d\u00e9riv\u00e9e?<\/p>\n<p>Un aper\u00e7u de haut niveau de la fa\u00e7on dont cela fonctionne.<\/p>\n<p>Ou, une autre fa\u00e7on de le dire, n&rsquo;est-il pas logique de changer un endroit dans l&rsquo;application qui peut facilement se r\u00e9percuter sur le reste de l&rsquo;application plut\u00f4t que de rechercher tous les endroits possibles de\u00a0:<\/p>\n<ol>\n<li>lecture de l&rsquo;option,<\/li>\n<li>s&rsquo;assurer qu&rsquo;il est r\u00e9gl\u00e9,<\/li>\n<li>d\u00e9finir une valeur par d\u00e9faut si elle n&rsquo;est pas d\u00e9finie,<\/li>\n<li>et retourner la valeur?<\/li>\n<\/ol>\n<p>Et c&rsquo;est l\u00e0 que je vois une utilisation valide d&rsquo;un singleton dans WordPress entrer en jeu: un moyen de lire des donn\u00e9es \u00e0 plusieurs points de l&rsquo;application. Cela entra\u00eene cependant certaines implications :<\/p>\n<ul>\n<li>la classe n&rsquo;a pas besoin d&rsquo;\u00eatre instanci\u00e9e plus d&rsquo;une fois (je veux dire, c&rsquo;est toute l&rsquo;id\u00e9e du singleton),<\/li>\n<li>il ne traitera pas de donn\u00e9es modifiables,<\/li>\n<li>il ne s&rsquo;agira pas d&rsquo;\u00e9crire des informations ou de manipuler des informations.<\/li>\n<\/ul>\n<p>En d&rsquo;autres termes, il est seul responsable de la r\u00e9cup\u00e9ration des informations et de leur restitution. C&rsquo;est \u00e7a. Rien d&rsquo;autre.<\/p>\n<h3>Un exemple d&rsquo;impl\u00e9mentation<\/h3>\n<p>Alors, \u00e0 quoi cela pourrait-il ressembler? Voici <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">une impl\u00e9mentation approximative<\/a> \u00e0 des fins de conversation\u00a0:<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    private static $instance;\n\n    private function __construct() {\n    }\n\n    private static function get_instance() {\n\n        if (null === self::$instance) {\n            self::$instance = new self;\n        }\n\n        return self::$instance;\n    }\n\n    public static function get() {\n\n        self::get_instance();\n\n        $default_format = 'm\/d\/Y';\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Comme vous pouvez le voir, il remplit tous les points ci-dessus. Autrement dit, il lit les donn\u00e9es, d\u00e9finit une valeur par d\u00e9faut, puis la renvoie.<\/p>\n<p>Cette classe ne fait rien d&rsquo;autre que lire et renvoyer un ensemble de donn\u00e9es tr\u00e8s sp\u00e9cifique.<\/p>\n<h3>Une mise en garde sur la mise en cache<\/h3>\n<p>\u00c9videmment, puisque cette classe lit les donn\u00e9es de la base de donn\u00e9es, elles peuvent \u2013 \u200b\u200bet \u00e9ventuellement devraient \u2013 \u200b\u200b\u00eatre mises en cache. Le but de cet article, cependant, n&rsquo;est pas d&rsquo;entrer dans les transitoires, les expirations et de travailler sur toutes ces nuances.<\/p>\n<p>Au lieu de cela, il s&rsquo;agit d&rsquo;\u00e9valuer s&rsquo;il s&rsquo;agit ou non d&rsquo;un cas d&rsquo;utilisation valide pour impl\u00e9menter un singleton dans WordPress.<\/p>\n<h2>Attendez, \u00e7a ne doit pas \u00eatre comme \u00e7a\u00a0!<\/h2>\n<p>Je sais je sais. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Psy<\/a>! Je pense que c&rsquo;est la bonne terminologie, mais restons professionnels.<\/p>\n<p>Jusqu&rsquo;\u00e0 pr\u00e9sent, tout l&rsquo;article expliquait pourquoi vous voudriez peut-\u00eatre \u00e9tudier l&rsquo;utilisation de singletons dans WordPress afin d&rsquo;avoir un moyen de r\u00e9cup\u00e9rer facilement des informations en utilisant des principes orient\u00e9s objet.<\/p>\n<p>Mais je ne pense toujours pas que l&rsquo;utilisation d&rsquo;un singleton dans WordPress soit n\u00e9cessaire ici. \u00c0 tout le moins, je pense qu&rsquo;une fonction statique est tr\u00e8s bien. Et la seule raison pour laquelle je pense que \u00e7a va, c&rsquo;est parce que cr\u00e9er une instance de la classe chaque fois que vous avez besoin d&rsquo;acc\u00e9der \u00e0 une fonction qui r\u00e9cup\u00e8re des donn\u00e9es qui ne changeront pas dans la classe est exag\u00e9r\u00e9.<\/p>\n<p>Alors \u00e0 quoi \u00e7a <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ressemble<\/a>? <\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    public static function get() {\n\n        $default_format = 'm\/d\/Y';\n\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Et cela, je crois, est une meilleure solution que la mise en \u0153uvre d&rsquo;un mod\u00e8le de conception arbitraire lorsqu&rsquo;il n&rsquo;est pas du tout n\u00e9cessaire.<\/p>\n<p>Mais je suis ouvert \u00e0 \u00eatre convaincu du contraire.<\/p>\n<h2>Des r\u00e9flexions de d\u00e9veloppeurs plus exp\u00e9riment\u00e9s\u00a0?<\/h2>\n<p>J&rsquo;ai entendu d&rsquo;un ami et d&rsquo;un pair que la simple utilisation d&rsquo;une fonction d&rsquo;espace de noms pourrait m\u00eame \u00eatre la voie \u00e0 suivre. De toute \u00e9vidence, il existe une vari\u00e9t\u00e9 de fa\u00e7ons d&rsquo;aborder cela.<\/p>\n<p>Et avec cela, je suis int\u00e9ress\u00e9 d&rsquo;entendre le reste d&rsquo;entre vous sur la fa\u00e7on dont vous pouvez refactoriser cela encore plus loin. Je ne suis pas tellement concern\u00e9 par l&rsquo;impl\u00e9mentation de la\u00a0 fonction <strong>get<\/strong> puisqu&rsquo;elle est principalement mise en place pour la d\u00e9mo.<\/p>\n<p>Au lieu de cela, je suis int\u00e9ress\u00e9 par les moyens de g\u00e9rer cela en dehors de ce qui est pr\u00e9sent\u00e9 ici. Ou plut\u00f4t, juste votre point de vue sur ce que vous voyez.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Source d&rsquo;enregistrement:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Peut-\u00eatre souhaitez-vous impl\u00e9menter des singletons dans WordPress pour lire facilement les donn\u00e9es. Il n&rsquo;a pas \u00e0 \u00eatre de cette fa\u00e7on, cependant.a<\/p>\n","protected":false},"author":1,"featured_media":221011,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[893,717,862],"tags":[1167],"class_list":["post-229353","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-2","category-developpeur","category-wordpress-3","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229353","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/comments?post=229353"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229353\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}