{"id":229662,"date":"2022-11-10T17:55:00","date_gmt":"2022-11-10T14:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229662"},"modified":"2022-11-09T15:49:43","modified_gmt":"2022-11-09T12:49:43","slug":"quest-ce-qui-est-trop-pour-transmettre-des-donnees-via-linjection-de-dependance","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fr\/quest-ce-qui-est-trop-pour-transmettre-des-donnees-via-linjection-de-dependance\/","title":{"rendered":"Qu&rsquo;est-ce qui est trop pour transmettre des donn\u00e9es via l&rsquo;injection de d\u00e9pendance\u00a0?"},"content":{"rendered":"\n<p>Le sujet de <a href=\"https:\/\/en.wikipedia.org\/wiki\/Dependency_injection\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">l&rsquo;injection de d\u00e9pendances<\/a> est celui qui existe depuis un certain temps dans les cercles de programmation orient\u00e9s objet. Parfois, nous le voyons dans WordPress ; parfois nous ne le faisons pas.<\/p>\n<p>J&rsquo;en suis fan mais, honn\u00eatement, je ne suis pas toujours s\u00fbr de la quantit\u00e9 d&rsquo;informations \u00e0 injecter dans une classe. Je veux dire, disons qu&rsquo;on nous donne deux classes, et que l&rsquo;une contient les informations dont l&rsquo;autre a besoin.<\/p>\n<ul>\n<li>N&rsquo;injectons-nous aucune classe dans une autre classe ?<\/li>\n<li>Injectons-nous seulement une information (qu&rsquo;il s&rsquo;agisse d&rsquo;une cha\u00eene, d&rsquo;un entier, d&rsquo;une structure de donn\u00e9es ou autre) dans l&rsquo;autre classe\u00a0?<\/li>\n<\/ul>\n<p>Je ne pense pas qu&rsquo;il y ait une r\u00e8gle stricte pour cela, mais il est probablement prudent de dire qu&rsquo;il est pr\u00e9f\u00e9rable d&rsquo;injecter uniquement les donn\u00e9es dont vous avez besoin. Mais alors cela pose la question de savoir comment pr\u00e9parer les donn\u00e9es \u00e0 injecter dans une classe donn\u00e9e ?<\/p>\n<ul>\n<li>Cr\u00e9ez-vous une m\u00e9thode dans une classe et la transmettez-vous dans une autre ?<\/li>\n<li>Y transmettez-vous une information <strong>priv\u00e9e<\/strong> ou <strong>prot\u00e9g\u00e9e<\/strong>\u00a0?<\/li>\n<\/ul>\n<p>L\u00e0 encore, je pense que cela d\u00e9pend si quelque chose doit arriver \u00e0 l&rsquo;information avant qu&rsquo;elle ne soit transmise \u00e0 une classe.<\/p>\n<p>Quoi qu&rsquo;il en soit, je pourrais revenir sur ce sujet pour le reste du message et ne jamais arriver \u00e0 une conclusion, alors pourquoi ne pas travailler sur un code source jusqu&rsquo;\u00e0 ce qu&rsquo;il y ait quelque chose de raisonnable.<\/p>\n<p>Commen\u00e7ons par dire que nous avons un fichier de classe de plug-in principal et que cette classe est responsable de la maintenance d&rsquo;informations telles que\u00a0:<\/p>\n<ul>\n<li>le chemin du plugin,<\/li>\n<li>l&rsquo;URL du plugin,<\/li>\n<li>si le plugin est charg\u00e9 ou non,<\/li>\n<li>l&rsquo;\u00e9cran en cours de visualisation,<\/li>\n<li>et les classes auxquelles il doit diffuser (pensez <a href=\"https:\/\/en.wikipedia.org\/wiki\/Publish%E2%80%93subscribe_pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pub\/sub<\/a>) certaines informations.<\/li>\n<\/ul>\n<p>Peut-\u00eatre qu&rsquo;un squelette ou un bout de la classe pourrait ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-00-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass(...)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Alors commen\u00e7ons vraiment large. Disons que nous voulons prendre toute la classe et la transmettre \u00e0 l&rsquo;une des classes \u00e0 laquelle elle diffuse des informations.<\/p>\n<p>Si tel \u00e9tait le cas, cela pourrait ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-01-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Mais l&rsquo;un des d\u00e9fis avec cela est qu&rsquo;il transmet beaucoup plus d&rsquo;informations que n\u00e9cessaire dans une autre classe. De plus, il transmet des informations qui incluent des informations sur la classe dans laquelle ses informations sont transmises.<\/p>\n<p>Supposons donc que nous voulions prendre du recul et simplement transmettre l&rsquo;une des informations priv\u00e9es. C&rsquo;est simple, non? Cela finit par ressembler <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-02-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">\u00e0 ceci<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;plugin_path)\n        ];\n    }\n}\n<\/code><\/pre>\n<p>Et cela peut \u00eatre tout \u00e0 fait suffisant dans certains cas. Mais, comme mentionn\u00e9 pr\u00e9c\u00e9demment, il y a aussi des moments o\u00f9 nous voulons prendre l&rsquo;information, la traiter, puis la transmettre \u00e0 une classe.<\/p>\n<p>Pour ce faire, il suffit de d\u00e9finir une m\u00e9thode, de lui faire traiter les informations, puis de transmettre la valeur de retour \u00e0 la classe qui a besoin <a href=\"https:\/\/gist.github.com\/tommcfarlin\/993fea0174dcd5abcea45ce3f1598813#file-03-generic-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">des informations<\/a>\u00a0:<\/p>\n<pre><code>&lt;?php\n\nclass Plugin\n{\n    protected $plugin_path;\n\n    protected $plugin_url;\n\n    private $loaded;\n\n    public function __construct($file)\n    {\n        $this-&gt;loaded         = false;\n        $this-&gt;plugin_path    = plugin_dir_path($file);\n        $this-&gt;plugin_url     = plugin_dir_url($file);\n    }\n\n    public function isLoaded()\n    {\n        return $this-&gt;loaded;\n    }\n\n    public function load()\n    {\n      \/\/ ...\n    }\n\n    private function isCurrentAdminStatus()\n    {\n      \/\/ ...\n    }\n\n    public function getSubscribers()\n    {\n        return [\n          new OtherPluginClass($this-&gt;isCurrentAdminStatus())\n        ];\n    }\n}\n<\/code><\/pre>\n<p>L&rsquo;id\u00e9e derri\u00e8re cette discussion est apparue lorsque j&rsquo;ai travaill\u00e9 sur une r\u00e9vision de code pour un projet r\u00e9cent et que j&rsquo;ai discut\u00e9 des diff\u00e9rentes options permettant de transmettre des informations \u00e0 une classe.<\/p>\n<p>J&rsquo;ai donc commenc\u00e9 large (malgr\u00e9 ce qui est n\u00e9cessaire, m\u00eame compte tenu du processus de r\u00e9flexion ci-dessus), puis je l&rsquo;ai r\u00e9duit \u00e0 ce qui est seulement n\u00e9cessaire.<\/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>Dans la programmation orient\u00e9e objet, l&rsquo;injection de d\u00e9pendances est excellente et tout sauf combien est consid\u00e9r\u00e9 comme trop lors de la transmission de donn\u00e9es via l&rsquo;injection de d\u00e9pendances\u00a0?<\/p>\n","protected":false},"author":1,"featured_media":166138,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[717,1016],"tags":[1167],"class_list":["post-229662","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpeur","category-sites-utiles","tag-affiai-fr"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229662","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=229662"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/posts\/229662\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media\/166138"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/media?parent=229662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/categories?post=229662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fr\/wp-json\/wp\/v2\/tags?post=229662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}