{"id":16765,"date":"2024-03-05T22:21:46","date_gmt":"2024-03-05T22:21:46","guid":{"rendered":"https:\/\/www.directimpactsolutions.com\/observateurs-dans-laravel\/"},"modified":"2024-09-06T01:03:05","modified_gmt":"2024-09-06T01:03:05","slug":"observateurs-dans-laravel","status":"publish","type":"post","link":"https:\/\/www.directimpactsolutions.com\/fr\/observateurs-dans-laravel\/","title":{"rendered":"Observateurs dans Laravel"},"content":{"rendered":"<p>Lors du d\u00e9veloppement sur un projet Web, vous pourriez avoir besoin que quelque chose se produise lorsqu&rsquo;une table de la base de donn\u00e9es est modifi\u00e9e. Par exemple, vous pourriez vouloir envoyer une notification de confirmation \u00e0 un utilisateur chaque fois qu&rsquo;un enregistrement est cr\u00e9\u00e9. Ou vous pourriez vouloir cr\u00e9er un enregistrement dans une table de journal chaque fois qu&rsquo;un enregistrement est mis \u00e0 jour ou supprim\u00e9. Ou vous pourriez vouloir assainir vos donn\u00e9es avant qu&rsquo;elles ne soient envoy\u00e9es \u00e0 la base de donn\u00e9es et supprimer toutes les balises html ou script.<\/p><p>Bien que vous puissiez le faire dans vos m\u00e9thodes de contr\u00f4leur, il y a de fortes chances que vous manipuliez une table \u00e0 plusieurs endroits, et que vous devriez maintenir aussi ce code \u00e0 plusieurs endroits. Une fa\u00e7on plus efficace de proc\u00e9der est de placer le code dans les \u00e9v\u00e9nements int\u00e9gr\u00e9s de Laravel.<\/p><h2 class=\"wp-block-heading\" id=\"Model-Events\" style=\"font-style:normal;font-weight:400\">\u00c9v\u00e9nements du mod\u00e8le<\/h2><p>Laravel comprend un certain nombre d&rsquo;\u00e9v\u00e9nements qui se d\u00e9clenchent pendant la dur\u00e9e de vie d&rsquo;un mod\u00e8le. Ces \u00e9v\u00e9nements correspondent \u00e0 diff\u00e9rentes actions effectu\u00e9es sur une table de base de donn\u00e9es. Ces \u00e9v\u00e9nements comprennent la cr\u00e9ation d&rsquo;un enregistrement : la mise \u00e0 jour d&rsquo;un enregistrement, l&rsquo;enregistrement (qui est d\u00e9clench\u00e9 en tant que partie de la cr\u00e9ation ou de la mise \u00e0 jour) et la suppression.<\/p><p>Il y a en fait deux \u00e9v\u00e9nements qui se d\u00e9clenchent pour chacun de ces \u00e9v\u00e9nements ; un \u00e9v\u00e9nement se produit avant que l&rsquo;action ne se produise, et l&rsquo;autre se produit apr\u00e8s qu&rsquo;elle se soit produite. Par exemple, l&rsquo;\u00e9v\u00e9nement de cr\u00e9ation se d\u00e9clenche avant que l&rsquo;enregistrement ne soit cr\u00e9\u00e9 dans la base de donn\u00e9es, tandis que l&rsquo;\u00e9v\u00e9nement de cr\u00e9ation se d\u00e9clenche une fois que l&rsquo;enregistrement a \u00e9t\u00e9 cr\u00e9\u00e9. La liste compl\u00e8te ressemble \u00e0 ceci :<\/p><ul class=\"wp-block-list\"><li>Cr\u00e9ation\/Cr\u00e9\u00e9<\/li>\n\n<li>Mise \u00e0 jour\/Updated<\/li>\n\n<li>Sauvegarde\/Sauvegard\u00e9<\/li>\n\n<li>Suppression\/supprim\u00e9<\/li>\n\n<li>Forcer la suppression\/Forcer la suppression<\/li>\n\n<li>Restaurer\/Restaurer<\/li><\/ul><p>Remarque : l&rsquo;ex\u00e9cution d&rsquo;une mise \u00e0 jour ou d&rsquo;une suppression de masse (par exemple &#8211; User::where(&lsquo;active&rsquo;, &lsquo;=&rsquo;, 0)-&gt;delete();) <strong>ne d\u00e9clenchera pas<\/strong> d&rsquo;\u00e9v\u00e9nement, car les mod\u00e8les ne sont pas r\u00e9ellement r\u00e9cup\u00e9r\u00e9s dans ces cas-l\u00e0. Dans ce cas, vous pourriez vouloir r\u00e9cup\u00e9rer les enregistrements et les parcourir en boucle pour effectuer la mise \u00e0 jour\/suppression.<\/p><p>Il existe plusieurs fa\u00e7ons de se connecter \u00e0 ces \u00e9v\u00e9nements ; ci-dessous, nous examinerons deux des plus courantes : les fermetures (closures) et les observateurs (observers).<\/p><h3 class=\"wp-block-heading has-ast-global-color-2-color has-text-color\" id=\"Closures\">Fermetures<\/h3><p>Les mod\u00e8les Eloquent ont une m\u00e9thode statique d\u00e9finie pour chaque \u00e9v\u00e9nement (cr\u00e9ation, mise \u00e0 jour, suppression etc), qui peut \u00eatre utilis\u00e9e pour enregistrer des fermetures pour chaque \u00e9v\u00e9nement. Ces fermetures sont d\u00e9finies dans la m\u00e9thode booted du mod\u00e8le.<\/p><p>Nous allons prendre l&rsquo;exemple d&rsquo;une simple table utilis\u00e9e pour stocker les rendez-vous. Lorsqu&rsquo;un rendez-vous est cr\u00e9\u00e9, nous voulons envoyer une AppointmentNotification (qui, nous le supposons, a d\u00e9j\u00e0 \u00e9t\u00e9 cr\u00e9\u00e9e dans le syst\u00e8me) \u00e0 l&rsquo;utilisateur associ\u00e9 au rendez-vous.<\/p><p>use App\\Notifications\\AppointmentNotification;<br\/>use Illuminate\\Database\\Eloquent\\Factories\\HasFactory;<br\/>use Illuminate\\Database\\Eloquent\\Model;<\/p><pre class=\"wp-block-code\"><code>use App\\Notifications\\AppointmentNotification;\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Appointment extends Model\n{\n    use HasFactory;\n\n    \/\/ ***********************************\n    #region Booted\n    \/\/ ***********************************\n    protected static function booted() {\n        parent::booted();\n\n        static::created(function (Appointment $appointment) {\n            $appointment->user()->notify(new AppointmentNotification($appointment));\n        });\n    }\n    #endregion\n\n    \/\/ ***********************************\n    #region Relationships\n    \/\/ ***********************************\n    public function user() {\n        return $this->belongsTo(User::class);\n    }\n    #endregion\n}<\/code><\/pre><p>Dans l&rsquo;exemple ci-dessus, vous remarquerez que nous avons ajout\u00e9 cette ligne \u00e0 la m\u00e9thode booted de la classe Appointment :<\/p><pre class=\"wp-block-code\"><code>        $appointment->user()->notify(new AppointmentNotification($appointment));<\/code><\/pre><p>Cela indique \u00e0 Laravel qu&rsquo;apr\u00e8s la cr\u00e9ation d&rsquo;un rendez-vous, nous voulons r\u00e9cup\u00e9rer l&rsquo;utilisateur associ\u00e9 au rendez-vous, puis envoyer une notification \u00e0 cet utilisateur.<\/p><p>Si vous d\u00e9sirez ex\u00e9cuter le code en arri\u00e8re-plan, vous pouvez enregistrer l&rsquo;\u00e9v\u00e9nement comme pouvant \u00eatre mis en file d&rsquo;attente. Cela ex\u00e9cutera l&rsquo;\u00e9couteur d&rsquo;\u00e9v\u00e9nement dans la file d&rsquo;attente de l&rsquo;application :<\/p><pre class=\"wp-block-code\"><code>use function Illuminate\\Events\\queueable;\n\n\/\/...\n\nstatic::created(queueable(function (Appointment $appointment) {\n    \/\/ ...\n}));<\/code><\/pre><h3 class=\"wp-block-heading has-ast-global-color-2-color has-text-color\" id=\"Observers\">Observateurs<\/h3><p>Si vous avez besoin d&rsquo;\u00e9couter plusieurs \u00e9v\u00e9nements sur un mod\u00e8le, vous pouvez les regrouper \u00e0 l&rsquo;aide d&rsquo;un observateur. Un observateur est un objet qui poss\u00e8de des m\u00e9thodes pour chacun des \u00e9v\u00e9nements du mod\u00e8le, chacune d&rsquo;entre elles recevant le mod\u00e8le affect\u00e9 en tant qu&rsquo;argument. Les observateurs sont cr\u00e9\u00e9s \u00e0 l&rsquo;aide d&rsquo;une commande Artisan :<\/p><p>php artisan make:observer AppointmentObserver &#8211;model=User<\/p><p>Cette commande cr\u00e9e un nouvel observateur dans le r\u00e9pertoire app\/Observers. Lors de sa premi\u00e8re cr\u00e9ation, l&rsquo;observateur ressemblera \u00e0 quelque chose comme ceci :<\/p><pre class=\"wp-block-code\"><code>use App\\Models\\Appointment;\n\nclass AppointmentObserver\n{\n    \/**\n     * Handle the Appointment \"created\" event.\n     *\/\n    public function created(Appointment $appointment): void\n    {\n        \/\/ ...\n    }\n\n    \/**\n    * Handle the Appointment \"updated\" event.\n    *\/\n    public function updated(Appointment $appointment): void\n    {\n        \/\/ ...\n    }\n    \n    \/**\n    * Handle the Appointment \"deleted\" event.\n    *\/\n    public function deleted(Appointment $appointment): void\n    {\n        \/\/ ...\n    }\n}<\/code><\/pre><p>Nous pouvons maintenant ajouter notre code pour envoyer la notification de rendez-vous \u00e0 la m\u00e9thode created :<\/p><pre class=\"wp-block-code\"><code>use App\\Notifications\\AppointmentNotification;\n...\n\npublic function created(Appointment $appointment): void\n{\n    $appointment->user()->notify(new AppointmentNotification($appointment));\n}<\/code><\/pre><p>Une fois l&rsquo;observateur cr\u00e9\u00e9, vous devrez l&rsquo;enregistrer dans la m\u00e9thode <strong>boot<\/strong> de la classe <strong>App\\Providers\\EventServiceProvider<\/strong> pour commencer \u00e0 \u00e9couter les \u00e9v\u00e9nements.<\/p><pre class=\"wp-block-code\"><code>use App\\Models\\Appointment;\nuse App\\Observers\\AppointmentObserver;\n\n\/**\n\nRegister any events for your application.\n*\/\npublic function boot(): void\n{\n Appointment::observe(AppointmentObserver::class);\n}<\/code><\/pre><p>Vous pouvez \u00e9galement dresser la liste des observateurs dans la propri\u00e9t\u00e9 <strong>observers<\/strong> de la classe <strong>App\\Providers\\EventServiceProvider<\/strong>.<\/p><pre class=\"wp-block-code\"><code>use App\\Models\\Appointment;\nuse App\\Observers\\AppointmentObserver;\n\n \/**\n\nThe model observers for your application.\n\n@var array\n*\/\nprotected $observers = &#91;\n Appointment::class => &#91;AppointmentObserver::class],\n];<\/code><\/pre><h3 class=\"wp-block-heading has-ast-global-color-2-color has-text-color\" id=\"Muting-Events\">Mise en sourdine des \u00e9v\u00e9nements<\/h3><p>Il peut arriver que vous ayez besoin d&rsquo;ex\u00e9cuter une commande sur le mod\u00e8le sans d\u00e9clencher d&rsquo;\u00e9v\u00e9nements ; il y a plusieurs fa\u00e7ons de le faire. La m\u00e9thode <strong>withoutEvents<\/strong> accepte une fermeture comme argument ; tout code ex\u00e9cut\u00e9 \u00e0 l&rsquo;int\u00e9rieur de cette fermeture ne d\u00e9clenchera pas d&rsquo;\u00e9v\u00e9nement.<\/p><pre class=\"wp-block-code\"><code>use App\\Models\\Appointment\n\n$appointment = Appointment::withoutEvents(function() {\n    $appointment = Appointment::findOrFail(1)->update&#91;'cancelled=>true]);\n   ....\n    return $appoitnment\n});<\/code><\/pre><p>L&rsquo;utilisation de <strong>withoutEvents<\/strong> est pratique si vous modifiez plusieurs enregistrements ou si vous effectuez plusieurs actions sur un mod\u00e8le. Si vous devez ex\u00e9cuter une seule action sur un mod\u00e8le, vous pouvez utiliser des m\u00e9thodes comme <strong>saveQuietly<\/strong>, <strong>deleteQuietly<\/strong>, <strong>forceDeleteQuietly<\/strong> et <strong>restoreQuietly.<\/strong><\/p><pre class=\"wp-block-code\"><code>$appointment = Appointment::findOrFail(1);\n$appointment->cancelled = true;\n$appointment->saveQuietly();<\/code><\/pre><h2 class=\"wp-block-heading\" id=\"Conclusion\" style=\"font-style:normal;font-weight:400\">Conclusion<\/h2><p>Nous esp\u00e9rons que cela a permis de clarifier le r\u00f4le des observateurs dans Laravel, et que vous avez d\u00e9sormais une meilleure id\u00e9e de quand et comment les utiliser. Si vous avez un projet Laravel en t\u00eate, nous serions ravis de vous aider. <a href=\"https:\/\/www.directimpactsolutions.com\/fr\/contact\/\">Envoyez-nous un message<\/a> et nous prendrons contact avec vous.<\/p>","protected":false},"excerpt":{"rendered":"<p>Lors du d\u00e9veloppement sur un projet Web, vous pourriez avoir besoin que quelque chose se produise lorsqu&rsquo;une table de la base de donn\u00e9es est modifi\u00e9e. Par exemple, vous pourriez vouloir envoyer une notification de confirmation \u00e0 un utilisateur chaque fois qu&rsquo;un enregistrement est cr\u00e9\u00e9. Ou vous pourriez vouloir cr\u00e9er un enregistrement dans une table de &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"https:\/\/www.directimpactsolutions.com\/fr\/observateurs-dans-laravel\/\"> <span class=\"screen-reader-text\">Observateurs dans Laravel<\/span> Lire la suite >><\/a><\/p>\n","protected":false},"author":9,"featured_media":16552,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"","footnotes":""},"categories":[37],"tags":[],"class_list":["post-16765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web"],"uagb_featured_image_src":{"full":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading-150x150.png",150,150,true],"medium":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading-300x180.png",300,180,true],"medium_large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"large":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"1536x1536":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"2048x2048":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"woocommerce_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading-300x300.png",300,300,true],"woocommerce_single":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading.png",500,300,false],"woocommerce_gallery_thumbnail":["https:\/\/www.directimpactsolutions.com\/wp-content\/uploads\/2024\/01\/Add-a-heading-100x100.png",100,100,true]},"uagb_author_info":{"display_name":"Alan Bruce","author_link":"https:\/\/www.directimpactsolutions.com\/fr\/author\/alan-bruce\/"},"uagb_comment_info":0,"uagb_excerpt":"Lors du d\u00e9veloppement sur un projet Web, vous pourriez avoir besoin que quelque chose se produise lorsqu&rsquo;une table de la base de donn\u00e9es est modifi\u00e9e. Par exemple, vous pourriez vouloir envoyer une notification de confirmation \u00e0 un utilisateur chaque fois qu&rsquo;un enregistrement est cr\u00e9\u00e9. Ou vous pourriez vouloir cr\u00e9er un enregistrement dans une table de\u2026","_links":{"self":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/16765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/comments?post=16765"}],"version-history":[{"count":2,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/16765\/revisions"}],"predecessor-version":[{"id":21089,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/posts\/16765\/revisions\/21089"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media\/16552"}],"wp:attachment":[{"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=16765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/categories?post=16765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.directimpactsolutions.com\/fr\/wp-json\/wp\/v2\/tags?post=16765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}