{"id":111649,"date":"2025-06-02T13:36:17","date_gmt":"2025-06-02T09:06:17","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/"},"modified":"2025-06-02T13:36:17","modified_gmt":"2025-06-02T09:06:17","slug":"understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/","title":{"rendered":"\u062f\u0631\u06a9 \u0646\u0627\u0638\u0631\u0627\u0646 Laravel: \u06cc\u06a9 \u0631\u0627\u0647\u0646\u0645\u0627\u06cc \u06a9\u0627\u0645\u0644 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f \u0645\u062f\u0644 \u062e\u0648\u062f\u06a9\u0627\u0631"},"content":{"rendered":"<div data-article-id=\"2554483\" id=\"article-body\">\n<p>\u0646\u0627\u0638\u0631\u0627\u0646 Laravel \u06cc\u06a9 \u0631\u0648\u0634 \u0632\u06cc\u0628\u0627 \u0628\u0631\u0627\u06cc \u06af\u0648\u0634 \u062f\u0627\u062f\u0646 \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0645\u062f\u0644 \u0641\u0635\u06cc\u062d \u0648 \u0627\u062c\u0631\u0627\u06cc \u06a9\u062f\u06cc \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0631 \u0635\u0648\u0631\u062a \u0628\u0631\u0648\u0632 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u062e\u0627\u0635 \u062f\u0631 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0628\u0647 \u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0634\u0646\u0648\u0646\u062f\u06af\u0627\u0646 \u062a\u062e\u0635\u0635\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f \u06a9\u0647 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627 \u062a\u0645\u0627\u0634\u0627 \u0645\u06cc \u06a9\u0646\u0646\u062f \u0648 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u062c\u0627\u062f \u060c \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u0627 \u062d\u0630\u0641 \u0648\u0627\u06a9\u0646\u0634 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u0646\u062f \u060c \u0641\u06a9\u0631 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648\u06cc \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u062f \u0645\u062f\u0644\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u062a\u0645\u06cc\u0632 \u0646\u06af\u0647 \u062f\u0627\u0631\u06cc\u062f \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u0645\u0631\u062a\u0628\u0637 \u0631\u0627 \u062f\u0631 \u06a9\u0644\u0627\u0633\u0647\u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0645\u062a\u0645\u0631\u06a9\u0632 \u06a9\u0646\u06cc\u062f.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D9%86%D8%A7%D8%B8%D8%B1%D8%A7%D9%86_%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84_%DA%86%DB%8C%D8%B3%D8%AA_%D9%88_%DA%86%D8%B1%D8%A7_%D8%A8%D8%A7%DB%8C%D8%AF_%D8%A7%D8%B2_%D8%A2%D9%86%D9%87%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D8%AF%D8%9F\" >\u0646\u0627\u0638\u0631\u0627\u0646 \u0644\u0627\u0631\u0627\u0648\u0644 \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u061f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%A7%D9%88%D9%84%DB%8C%D9%86_%D9%86%D8%A7%D8%B8%D8%B1_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0627\u0648\u0644\u06cc\u0646 \u0646\u0627\u0638\u0631 \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D8%B8%D8%B1%D8%A7%D9%86\" >\u062b\u0628\u062a \u0646\u0627\u0638\u0631\u0627\u0646<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D9%85%D8%AB%D8%A7%D9%84_%D8%AF%D8%B1_%D8%AF%D9%86%DB%8C%D8%A7%DB%8C_%D9%88%D8%A7%D9%82%D8%B9%DB%8C_%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4_%D8%AA%D8%AC%D8%A7%D8%B1%D8%AA_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C\" >\u0645\u062b\u0627\u0644 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc: \u067e\u0631\u062f\u0627\u0632\u0634 \u0633\u0641\u0627\u0631\u0634 \u062a\u062c\u0627\u0631\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%AA%DA%A9%D9%86%DB%8C%DA%A9_%D9%87%D8%A7%DB%8C_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87_Observer\" >\u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 Observer<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D9%85%D9%86%D8%B7%D9%82_%D9%86%D8%A7%D8%B8%D8%B1_%D9%85%D8%B4%D8%B1%D9%88%D8%B7\" >\u0645\u0646\u0637\u0642 \u0646\u0627\u0638\u0631 \u0645\u0634\u0631\u0648\u0637<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%DA%A9%D8%A7%D8%B1_%D8%A8%D8%A7_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%86%D8%A7%D8%B8%D8%B1\" >\u06a9\u0627\u0631 \u0628\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0646\u0627\u0638\u0631<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B4%DB%8C%D9%88%D9%87_%D9%87%D8%A7_%D9%88_%D9%85%D8%B4%DA%A9%D9%84%D8%A7%D8%AA_%D8%B1%D8%A7%DB%8C%D8%AC\" >\u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627 \u0648 \u0645\u0634\u06a9\u0644\u0627\u062a \u0631\u0627\u06cc\u062c<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF\" >\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0639\u0645\u0644\u06a9\u0631\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%A7%D8%AC%D8%AA%D9%86%D8%A7%D8%A8_%D8%A7%D8%B2_%D8%AD%D9%84%D9%82%D9%87_%D9%87%D8%A7%DB%8C_%D8%A8%DB%8C_%D9%86%D9%87%D8%A7%DB%8C%D8%AA\" >\u0627\u062c\u062a\u0646\u0627\u0628 \u0627\u0632 \u062d\u0644\u0642\u0647 \u0647\u0627\u06cc \u0628\u06cc \u0646\u0647\u0627\u06cc\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D8%B1%D8%B3%DB%8C%D8%AF%DA%AF%DB%8C_%D8%A8%D9%87_%D8%AE%D8%B7%D8%A7\" >\u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/understanding-laravel-observers-a-complete-guide-to-automated-model-event-handling-3e63\/#%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\" >\u067e\u0627\u06cc\u0627\u0646<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%A7%D8%B8%D8%B1%D8%A7%D9%86_%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84_%DA%86%DB%8C%D8%B3%D8%AA_%D9%88_%DA%86%D8%B1%D8%A7_%D8%A8%D8%A7%DB%8C%D8%AF_%D8%A7%D8%B2_%D8%A2%D9%86%D9%87%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%DA%A9%D9%86%DB%8C%D8%AF%D8%9F\"><\/span>\n<p>  \u0646\u0627\u0638\u0631\u0627\u0646 \u0644\u0627\u0631\u0627\u0648\u0644 \u0686\u06cc\u0633\u062a \u0648 \u0686\u0631\u0627 \u0628\u0627\u06cc\u062f \u0627\u0632 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u062c\u0627\u0631\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9\u06cc \u062f\u0627\u0631\u06cc\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u0647\u0631 \u0628\u0627\u0631 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0633\u0641\u0627\u0631\u0634 \u0631\u0627 \u0633\u0641\u0627\u0631\u0634 \u062f\u0647\u062f \u060c \u0628\u0627\u06cc\u062f \u06cc\u06a9 \u0627\u06cc\u0645\u06cc\u0644 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u062f \u060c \u0633\u0637\u062d \u0645\u0648\u062c\u0648\u062f\u06cc \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u062f \u0648 \u0645\u0639\u0627\u0645\u0644\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f. \u0628\u062f\u0648\u0646 \u0646\u0627\u0638\u0631\u0627\u0646 \u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0627\u06cc\u0646 \u0645\u0646\u0637\u0642 \u0631\u0627 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u067e\u0631\u0627\u06a9\u0646\u062f\u0647 \u06a9\u0646\u06cc\u062f \u0648 \u06a9\u062f \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u062d\u0641\u0638 \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0633\u062e\u062a \u062a\u0631 \u06a9\u0646\u06cc\u062f. \u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0627 \u0641\u0631\u0627\u0647\u0645 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u0645\u06a9\u0627\u0646 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631\u0627\u06cc \u0639\u0648\u0627\u0631\u0636 \u062c\u0627\u0646\u0628\u06cc \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u0645\u062f\u0644 \u060c \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0631\u0627 \u062d\u0644 \u0645\u06cc \u06a9\u0646\u0646\u062f.<\/p>\n<p>\u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0647 \u0648\u06cc\u0698\u0647 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0647\u0633\u062a\u0646\u062f \u0632\u06cc\u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0631 \u0627\u0633\u0627\u0633 \u0648\u0642\u0627\u06cc\u0639 \u0645\u062f\u0644 \u0641\u0635\u06cc\u062d \u062a\u062d\u0631\u06cc\u06a9 \u0645\u06cc \u0634\u0648\u0646\u062f. \u0644\u0627\u0631\u0627\u0648\u0644 \u0627\u06cc\u0646 \u0648\u0642\u0627\u06cc\u0639 \u0631\u0627 \u062f\u0631 \u0637\u0648\u0644 \u0686\u0631\u062e\u0647 \u0686\u0631\u062e\u0647 \u0645\u062f\u0644 \u0622\u062a\u0634 \u0645\u06cc \u0632\u0646\u062f: <code>creating<\/code>\u0628\u0627 <code>created<\/code>\u0628\u0627 <code>updating<\/code>\u0628\u0627 <code>updated<\/code>\u0628\u0627 <code>saving<\/code>\u0628\u0627 <code>saved<\/code>\u0628\u0627 <code>deleting<\/code>\u0628\u0627 <code>deleted<\/code>\u0628\u0627 <code>restoring<\/code>\u0648\u062a <code>restored<\/code>\u0628\u0634\u0631 \u0647\u0631 \u0631\u0648\u06cc\u062f\u0627\u062f \u0644\u062d\u0638\u0647 \u0627\u06cc \u0645\u062a\u0641\u0627\u0648\u062a \u062f\u0631 \u0633\u0641\u0631 \u0645\u062f\u0644 \u0634\u0645\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D9%88%D9%84%DB%8C%D9%86_%D9%86%D8%A7%D8%B8%D8%B1_%D8%AE%D9%88%D8%AF_%D8%B1%D8%A7_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u0627\u0648\u0644\u06cc\u0646 \u0646\u0627\u0638\u0631 \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u06cc\u06a9 \u0645\u062b\u0627\u0644 \u0639\u0645\u0644\u06cc \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645. \u0641\u0631\u0636 \u06a9\u0646\u06cc\u062f \u0634\u0645\u0627 \u062f\u0631 \u062d\u0627\u0644 \u0633\u0627\u062e\u062a\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628\u0644\u0627\u06af \u0647\u0633\u062a\u06cc\u062f \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u067e\u0633\u062a \u0647\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0646\u06cc\u062f \u0648 \u0647\u0646\u06af\u0627\u0645 \u0627\u0646\u062a\u0634\u0627\u0631 \u0645\u0642\u0627\u0644\u0647 \u0627\u0639\u0644\u0627\u0646 \u0647\u0627 \u0631\u0627 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u06cc\u06a9 \u0646\u0627\u0638\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>Post<\/code> \u0645\u062f\u0644:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Post<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Notifications\\PostPublishedNotification<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Support\\Str<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">PostObserver<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">creating<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"k\">empty<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">slug<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">slug<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Str<\/span><span class=\"o\">::<\/span><span class=\"nf\">slug<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">title<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"c1\">\/\/ Ensure slug uniqueness<\/span>\n            <span class=\"nv\">$originalSlug<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">slug<\/span><span class=\"p\">;<\/span>\n            <span class=\"nv\">$counter<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">1<\/span><span class=\"p\">;<\/span>\n\n            <span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"nc\">Post<\/span><span class=\"o\">::<\/span><span class=\"nf\">where<\/span><span class=\"p\">(<\/span><span class=\"s1\">'slug'<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">slug<\/span><span class=\"p\">)<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">exists<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n                <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">slug<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$originalSlug<\/span> <span class=\"mf\">.<\/span> <span class=\"s1\">'-'<\/span> <span class=\"mf\">.<\/span> <span class=\"nv\">$counter<\/span><span class=\"p\">;<\/span>\n                <span class=\"nv\">$counter<\/span><span class=\"o\">++<\/span><span class=\"p\">;<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Post \"created\" event.\n     * This runs after the model has been successfully saved\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Log the creation for analytics<\/span>\n        <span class=\"nf\">logger<\/span><span class=\"p\">(<\/span><span class=\"s1\">'New post created'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span>\n            <span class=\"s1\">'post_id'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"s1\">'title'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">title<\/span><span class=\"p\">,<\/span>\n            <span class=\"s1\">'author_id'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">user_id<\/span>\n        <span class=\"p\">]);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Post \"updated\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updated<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Check if the post was just published<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'published_at'<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">published_at<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ Send notification to subscribers<\/span>\n            <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">author<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">notify<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">PostPublishedNotification<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"p\">));<\/span>\n\n            <span class=\"c1\">\/\/ Update search index or cache<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">updateSearchIndex<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Post \"deleting\" event.\n     * This runs before the model is deleted\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">deleting<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Clean up related data before deletion<\/span>\n        <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">comments<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nb\">delete<\/span><span class=\"p\">();<\/span>\n        <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">tags<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">detach<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"c1\">\/\/ Remove from search index<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">removeFromSearchIndex<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Post \"deleted\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">deleted<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Log the deletion for audit purposes<\/span>\n        <span class=\"nf\">logger<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Post deleted'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span>\n            <span class=\"s1\">'post_id'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span>\n            <span class=\"s1\">'title'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">title<\/span><span class=\"p\">,<\/span>\n            <span class=\"s1\">'deleted_by'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">auth<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">id<\/span><span class=\"p\">()<\/span>\n        <span class=\"p\">]);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Helper method to update search index\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updateSearchIndex<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Implementation would depend on your search solution<\/span>\n        <span class=\"c1\">\/\/ This could be Elasticsearch, Algolia, etc.<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Helper method to remove from search index\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">removeFromSearchIndex<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Remove from search index implementation<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0627\u06cc\u0646 \u0646\u0627\u0638\u0631 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0635\u0646\u0639\u062a\u06af\u0631 \u060c \u0634\u0645\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight shell\"><code>php artisan make:observer PostObserver <span class=\"nt\">--model<\/span><span class=\"o\">=<\/span>Post\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u06a9\u0644\u0627\u0633 Observer \u0631\u0627 \u0628\u0627 \u062e\u0631\u062f \u06a9\u0631\u062f\u0646 \u0631\u0648\u0634 \u0628\u0631\u0627\u06cc \u0647\u0645\u0647 \u0648\u0642\u0627\u06cc\u0639 \u0641\u0635\u06cc\u062d \u0645\u0634\u062a\u0631\u06a9 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AB%D8%A8%D8%AA_%D9%86%D8%A7%D8%B8%D8%B1%D8%A7%D9%86\"><\/span>\n<p>  \u062b\u0628\u062a \u0646\u0627\u0638\u0631\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f Observer \u062e\u0648\u062f \u060c \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 Laravel \u062b\u0628\u062a \u06a9\u0646\u06cc\u062f. \u0645\u062a\u062f\u0627\u0648\u0644 \u062a\u0631\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u062b\u0628\u062a \u0646\u0627\u0638\u0631\u0627\u0646 \u062f\u0631 \u0634\u0645\u0627 \u0627\u0633\u062a <code>AppServiceProvider<\/code> \u06cc\u0627 \u06cc\u06a9 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 \u062e\u062f\u0645\u0627\u062a \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u062d\u0648\u0647 \u0627\u0646\u062c\u0627\u0645 \u0622\u0646 \u062f\u0631 \u062e\u0648\u062f \u0622\u0645\u062f\u0647 \u0627\u0633\u062a <code>AppServiceProvider<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Providers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Post<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\User<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Order<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\PostObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\UserObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\OrderObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Support\\ServiceProvider<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">AppServiceProvider<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">ServiceProvider<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * Register any application services.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">register<\/span><span class=\"p\">():<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Bootstrap any application services.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">boot<\/span><span class=\"p\">():<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Register model observers<\/span>\n        <span class=\"nc\">Post<\/span><span class=\"o\">::<\/span><span class=\"nf\">observe<\/span><span class=\"p\">(<\/span><span class=\"nc\">PostObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">);<\/span>\n        <span class=\"nc\">User<\/span><span class=\"o\">::<\/span><span class=\"nf\">observe<\/span><span class=\"p\">(<\/span><span class=\"nc\">UserObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">);<\/span>\n        <span class=\"nc\">Order<\/span><span class=\"o\">::<\/span><span class=\"nf\">observe<\/span><span class=\"p\">(<\/span><span class=\"nc\">OrderObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0628\u0632\u0631\u06af\u062a\u0631 \u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0628\u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u06a9 \u0627\u062e\u062a\u0635\u0627\u0635\u06cc \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>ObserverServiceProvider<\/code>:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Providers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Post<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\User<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Order<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\PostObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\UserObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Observers\\OrderObserver<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Support\\ServiceProvider<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">ObserverServiceProvider<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">ServiceProvider<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * The model observers for your application.\n     *\n     * @var array\n     *\/<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$observers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span>\n        <span class=\"nc\">Post<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nc\">PostObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">,<\/span>\n        <span class=\"nc\">User<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nc\">UserObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">,<\/span>\n        <span class=\"nc\">Order<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nc\">OrderObserver<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">];<\/span>\n\n    <span class=\"cd\">\/**\n     * Register the observers.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">boot<\/span><span class=\"p\">():<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">observers<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$model<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$observer<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$model<\/span><span class=\"o\">::<\/span><span class=\"nf\">observe<\/span><span class=\"p\">(<\/span><span class=\"nv\">$observer<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0641\u0631\u0627\u0645\u0648\u0634 \u0646\u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u0646\u062f\u0647 \u062e\u062f\u0645\u0627\u062a \u0631\u0627 \u062f\u0631 \u062e\u0648\u062f \u062b\u0628\u062a \u06a9\u0646\u06cc\u062f <code>config\/app.php<\/code> \u067e\u0631\u0648\u0646\u062f\u0647:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"s1\">'providers'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span>\n    <span class=\"c1\">\/\/ Other providers...<\/span>\n    <span class=\"nc\">App\\Providers\\ObserverServiceProvider<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">],<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%AB%D8%A7%D9%84_%D8%AF%D8%B1_%D8%AF%D9%86%DB%8C%D8%A7%DB%8C_%D9%88%D8%A7%D9%82%D8%B9%DB%8C_%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4_%D8%B3%D9%81%D8%A7%D8%B1%D8%B4_%D8%AA%D8%AC%D8%A7%D8%B1%D8%AA_%D8%A7%D9%84%DA%A9%D8%AA%D8%B1%D9%88%D9%86%DB%8C%DA%A9%DB%8C\"><\/span>\n<p>  \u0645\u062b\u0627\u0644 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc: \u067e\u0631\u062f\u0627\u0632\u0634 \u0633\u0641\u0627\u0631\u0634 \u062a\u062c\u0627\u0631\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0645\u062b\u0627\u0644 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631 \u0631\u0627 \u06a9\u0634\u0641 \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0642\u062f\u0631\u062a \u0646\u0627\u0638\u0631\u0627\u0646 \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0632\u0645\u06cc\u0646\u0647 \u062a\u062c\u0627\u0631\u062a \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u06cc\u06a9\u06cc \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u0627\u06cc\u0646 <code>OrderObserver<\/code> \u06a9\u0644 \u0686\u0631\u062e\u0647 \u0639\u0645\u0631 \u06cc\u06a9 \u0633\u0641\u0627\u0631\u0634 \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Order<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\InventoryService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\EmailService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\PaymentService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Notifications\\OrderConfirmationNotification<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Notifications\\OrderShippedNotification<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Jobs\\ProcessRefund<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">OrderObserver<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$inventoryService<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$emailService<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$paymentService<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">__construct<\/span><span class=\"p\">(<\/span>\n        <span class=\"kt\">InventoryService<\/span> <span class=\"nv\">$inventoryService<\/span><span class=\"p\">,<\/span>\n        <span class=\"kt\">EmailService<\/span> <span class=\"nv\">$emailService<\/span><span class=\"p\">,<\/span>\n        <span class=\"kt\">PaymentService<\/span> <span class=\"nv\">$paymentService<\/span>\n    <span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$inventoryService<\/span><span class=\"p\">;<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">emailService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$emailService<\/span><span class=\"p\">;<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">paymentService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$paymentService<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Order \"created\" event.\n     * This fires after a new order is successfully created\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Reserve inventory for the order items<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$item<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">reserve<\/span><span class=\"p\">(<\/span><span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">product_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">quantity<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Send order confirmation email<\/span>\n        <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">customer<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">notify<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">OrderConfirmationNotification<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">));<\/span>\n\n        <span class=\"c1\">\/\/ Create audit log<\/span>\n        <span class=\"nf\">activity<\/span><span class=\"p\">()<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nf\">performedOn<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">)<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nb\">log<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Order created with total: '<\/span> <span class=\"mf\">.<\/span> <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">total_amount<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Order \"updated\" event.\n     * This allows us to react to status changes\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updated<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Check if order status changed to 'shipped'<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'status'<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">status<\/span> <span class=\"o\">===<\/span> <span class=\"s1\">'shipped'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">handleOrderShipped<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Check if order was cancelled<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'status'<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">status<\/span> <span class=\"o\">===<\/span> <span class=\"s1\">'cancelled'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">handleOrderCancelled<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Check if payment status changed to 'failed'<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'payment_status'<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">payment_status<\/span> <span class=\"o\">===<\/span> <span class=\"s1\">'failed'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">handlePaymentFailed<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Order \"deleting\" event.\n     * Clean up before order deletion\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">deleting<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Release reserved inventory<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$item<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">release<\/span><span class=\"p\">(<\/span><span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">product_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">quantity<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Process refund if payment was successful<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">payment_status<\/span> <span class=\"o\">===<\/span> <span class=\"s1\">'completed'<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nc\">ProcessRefund<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle order shipped logic\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">handleOrderShipped<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Send shipping notification<\/span>\n        <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">customer<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">notify<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"nc\">OrderShippedNotification<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">));<\/span>\n\n        <span class=\"c1\">\/\/ Update inventory (convert reservation to actual sale)<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$item<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">confirmSale<\/span><span class=\"p\">(<\/span><span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">product_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">quantity<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Log shipping event<\/span>\n        <span class=\"nf\">activity<\/span><span class=\"p\">()<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nf\">performedOn<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">)<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nb\">log<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Order shipped with tracking number: '<\/span> <span class=\"mf\">.<\/span> <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">tracking_number<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle order cancellation logic\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">handleOrderCancelled<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Release inventory reservations<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$item<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">release<\/span><span class=\"p\">(<\/span><span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">product_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">quantity<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Process refund if needed<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nb\">in_array<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">payment_status<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'completed'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'processing'<\/span><span class=\"p\">]))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nc\">ProcessRefund<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Send cancellation email<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">emailService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">sendOrderCancellationEmail<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle payment failure\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">handlePaymentFailed<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Release inventory since payment failed<\/span>\n        <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$item<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">inventoryService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">release<\/span><span class=\"p\">(<\/span><span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">product_id<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$item<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">quantity<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Update order status<\/span>\n        <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">update<\/span><span class=\"p\">([<\/span><span class=\"s1\">'status'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">'payment_failed'<\/span><span class=\"p\">]);<\/span>\n\n        <span class=\"c1\">\/\/ Notify customer<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">emailService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">sendPaymentFailedEmail<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AA%DA%A9%D9%86%DB%8C%DA%A9_%D9%87%D8%A7%DB%8C_%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA%D9%87_Observer\"><\/span>\n<p>  \u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 Observer<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%86%D8%B7%D9%82_%D9%86%D8%A7%D8%B8%D8%B1_%D9%85%D8%B4%D8%B1%D9%88%D8%B7\"><\/span>\n<p>  \u0645\u0646\u0637\u0642 \u0646\u0627\u0638\u0631 \u0645\u0634\u0631\u0648\u0637<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0639\u0636\u06cc \u0627\u0648\u0642\u0627\u062a \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0631\u0648\u0634\u0647\u0627\u06cc \u0646\u0627\u0638\u0631 \u0641\u0642\u0637 \u062f\u0631 \u0634\u0631\u0627\u06cc\u0637 \u062e\u0627\u0635\u06cc \u0627\u062c\u0631\u0627 \u0634\u0648\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0646\u062d\u0648\u0647 \u0627\u062c\u0631\u0627\u06cc \u0645\u0646\u0637\u0642 \u0634\u0631\u0637\u06cc \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\User<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\CacheService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Jobs\\SendWelcomeEmail<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">UserObserver<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * Handle the User \"created\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">User<\/span> <span class=\"nv\">$user<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Only send welcome email for verified users<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">email_verified_at<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nc\">SendWelcomeEmail<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Update user statistics cache<\/span>\n        <span class=\"nc\">CacheService<\/span><span class=\"o\">::<\/span><span class=\"nf\">increment<\/span><span class=\"p\">(<\/span><span class=\"s1\">'total_users'<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the User \"updated\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updated<\/span><span class=\"p\">(<\/span><span class=\"kt\">User<\/span> <span class=\"nv\">$user<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Clear user cache when profile is updated<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">([<\/span><span class=\"s1\">'name'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'email'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'avatar'<\/span><span class=\"p\">]))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nf\">cache<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">forget<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"user.<\/span><span class=\"si\">{<\/span><span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Handle email verification<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'email_verified_at'<\/span><span class=\"p\">)<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">email_verified_at<\/span> <span class=\"o\">!==<\/span> <span class=\"kc\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">handleEmailVerified<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Handle subscription changes<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">(<\/span><span class=\"s1\">'subscription_tier'<\/span><span class=\"p\">))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">handleSubscriptionChange<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle email verification completion\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">handleEmailVerified<\/span><span class=\"p\">(<\/span><span class=\"kt\">User<\/span> <span class=\"nv\">$user<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Send welcome email now that email is verified<\/span>\n        <span class=\"nc\">SendWelcomeEmail<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ Unlock premium features trial<\/span>\n        <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">update<\/span><span class=\"p\">([<\/span>\n            <span class=\"s1\">'trial_ends_at'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">now<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">addDays<\/span><span class=\"p\">(<\/span><span class=\"mi\">14<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">]);<\/span>\n\n        <span class=\"c1\">\/\/ Log verification for analytics<\/span>\n        <span class=\"nf\">activity<\/span><span class=\"p\">()<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nf\">performedOn<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">)<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nb\">log<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Email verified'<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle subscription tier changes\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">handleSubscriptionChange<\/span><span class=\"p\">(<\/span><span class=\"kt\">User<\/span> <span class=\"nv\">$user<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"nv\">$oldTier<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">getOriginal<\/span><span class=\"p\">(<\/span><span class=\"s1\">'subscription_tier'<\/span><span class=\"p\">);<\/span>\n        <span class=\"nv\">$newTier<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">subscription_tier<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"c1\">\/\/ Log the change<\/span>\n        <span class=\"nf\">activity<\/span><span class=\"p\">()<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nf\">performedOn<\/span><span class=\"p\">(<\/span><span class=\"nv\">$user<\/span><span class=\"p\">)<\/span>\n            <span class=\"o\">-&gt;<\/span><span class=\"nb\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"Subscription changed from <\/span><span class=\"si\">{<\/span><span class=\"nv\">$oldTier<\/span><span class=\"si\">}<\/span><span class=\"s2\"> to <\/span><span class=\"si\">{<\/span><span class=\"nv\">$newTier<\/span><span class=\"si\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ Update user permissions based on new tier<\/span>\n        <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">syncPermissions<\/span><span class=\"p\">(<\/span><span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">getPermissionsForTier<\/span><span class=\"p\">(<\/span><span class=\"nv\">$newTier<\/span><span class=\"p\">));<\/span>\n\n        <span class=\"c1\">\/\/ Clear cached user data<\/span>\n        <span class=\"nf\">cache<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">tags<\/span><span class=\"p\">([<\/span><span class=\"s1\">'user'<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">])<\/span><span class=\"o\">-&gt;<\/span><span class=\"nb\">flush<\/span><span class=\"p\">();<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Get permissions for subscription tier\n     *\/<\/span>\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">getPermissionsForTier<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"nv\">$tier<\/span><span class=\"p\">):<\/span> <span class=\"kt\">array<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"k\">match<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$tier<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"s1\">'basic'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'read_posts'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'create_comments'<\/span><span class=\"p\">],<\/span>\n            <span class=\"s1\">'premium'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'read_posts'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'create_comments'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'create_posts'<\/span><span class=\"p\">],<\/span>\n            <span class=\"s1\">'enterprise'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'read_posts'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'create_comments'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'create_posts'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'manage_users'<\/span><span class=\"p\">],<\/span>\n            <span class=\"k\">default<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span><span class=\"s1\">'read_posts'<\/span><span class=\"p\">],<\/span>\n        <span class=\"p\">};<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%DA%A9%D8%A7%D8%B1_%D8%A8%D8%A7_%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C_%D9%87%D8%A7%DB%8C_%D9%86%D8%A7%D8%B8%D8%B1\"><\/span>\n<p>  \u06a9\u0627\u0631 \u0628\u0627 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627\u06cc \u0646\u0627\u0638\u0631<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0646\u0627\u0638\u0631\u0627\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0627\u0632 \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u062f\u0631\u0633\u062a \u0645\u0627\u0646\u0646\u062f \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0647\u0627 \u0648 \u0633\u0627\u06cc\u0631 \u06a9\u0644\u0627\u0633 \u0647\u0627\u06cc \u0644\u0627\u0631\u0627\u0648\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0646\u062f. \u0627\u06cc\u0646 \u0628\u0627\u0639\u062b \u0645\u06cc \u0634\u0648\u062f \u0622\u0646\u0647\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0648 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631 \u0628\u0627\u0634\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Product<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\SearchService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\CacheService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Services\\ImageOptimizationService<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Contracts\\Queue\\ShouldQueue<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">ProductObserver<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">ShouldQueue<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$searchService<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$cacheService<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">protected<\/span> <span class=\"nv\">$imageService<\/span><span class=\"p\">;<\/span>\n\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">__construct<\/span><span class=\"p\">(<\/span>\n        <span class=\"kt\">SearchService<\/span> <span class=\"nv\">$searchService<\/span><span class=\"p\">,<\/span>\n        <span class=\"kt\">CacheService<\/span> <span class=\"nv\">$cacheService<\/span><span class=\"p\">,<\/span>\n        <span class=\"kt\">ImageOptimizationService<\/span> <span class=\"nv\">$imageService<\/span>\n    <span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">searchService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$searchService<\/span><span class=\"p\">;<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$cacheService<\/span><span class=\"p\">;<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">imageService<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$imageService<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Product \"created\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">Product<\/span> <span class=\"nv\">$product<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Add to search index<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">searchService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">index<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ Optimize product images<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">images<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">isNotEmpty<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n            <span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">images<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$image<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">imageService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">optimize<\/span><span class=\"p\">(<\/span><span class=\"nv\">$image<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">path<\/span><span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Clear category cache<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">clearCategoryCache<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">category_id<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Product \"updated\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updated<\/span><span class=\"p\">(<\/span><span class=\"kt\">Product<\/span> <span class=\"nv\">$product<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Update search index if searchable fields changed<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">([<\/span><span class=\"s1\">'name'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'description'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'tags'<\/span><span class=\"p\">]))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">searchService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">update<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"c1\">\/\/ Clear related caches<\/span>\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">wasChanged<\/span><span class=\"p\">([<\/span><span class=\"s1\">'price'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'stock_quantity'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'is_active'<\/span><span class=\"p\">]))<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">clearProductCache<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">);<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">clearCategoryCache<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">category_id<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"cd\">\/**\n     * Handle the Product \"deleted\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">deleted<\/span><span class=\"p\">(<\/span><span class=\"kt\">Product<\/span> <span class=\"nv\">$product<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Remove from search index<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">searchService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">remove<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">);<\/span>\n\n        <span class=\"c1\">\/\/ Clear all related caches<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">clearProductCache<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">);<\/span>\n        <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">cacheService<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">clearCategoryCache<\/span><span class=\"p\">(<\/span><span class=\"nv\">$product<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">category_id<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86_%D8%B4%DB%8C%D9%88%D9%87_%D9%87%D8%A7_%D9%88_%D9%85%D8%B4%DA%A9%D9%84%D8%A7%D8%AA_%D8%B1%D8%A7%DB%8C%D8%AC\"><\/span>\n<p>  \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627 \u0648 \u0645\u0634\u06a9\u0644\u0627\u062a \u0631\u0627\u06cc\u062c<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF\"><\/span>\n<p>  \u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0639\u0645\u0644\u06a9\u0631\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0647 \u0637\u0648\u0631 \u067e\u06cc\u0634 \u0641\u0631\u0636 \u0647\u0645\u0632\u0645\u0627\u0646 \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u0646\u062f \u060c \u0628\u0647 \u0627\u06cc\u0646 \u0645\u0639\u0646\u06cc \u06a9\u0647 \u062f\u0631 \u0635\u0648\u0631\u062a \u0627\u0646\u062c\u0627\u0645 \u0639\u0645\u0644\u06cc\u0627\u062a \u0633\u0646\u06af\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u0646\u062f. \u0628\u0631\u0627\u06cc \u06a9\u0627\u0631\u0647\u0627\u06cc \u0648\u0642\u062a \u06af\u06cc\u0631 \u060c \u0635\u0641 \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631 \u0628\u06af\u06cc\u0631\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Order<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Jobs\\ProcessOrderAnalytics<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Jobs\\UpdateRecommendations<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Contracts\\Queue\\ShouldQueue<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">OrderObserver<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">ShouldQueue<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * Handle the Order \"created\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">Order<\/span> <span class=\"nv\">$order<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ Quick operations can run immediately<\/span>\n        <span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">update<\/span><span class=\"p\">([<\/span><span class=\"s1\">'order_number'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">generateOrderNumber<\/span><span class=\"p\">()]);<\/span>\n\n        <span class=\"c1\">\/\/ Heavy operations should be queued<\/span>\n        <span class=\"nc\">ProcessOrderAnalytics<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"p\">);<\/span>\n        <span class=\"nc\">UpdateRecommendations<\/span><span class=\"o\">::<\/span><span class=\"nf\">dispatch<\/span><span class=\"p\">(<\/span><span class=\"nv\">$order<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">customer<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">private<\/span> <span class=\"k\">function<\/span> <span class=\"n\">generateOrderNumber<\/span><span class=\"p\">():<\/span> <span class=\"kt\">string<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">return<\/span> <span class=\"s1\">'ORD-'<\/span> <span class=\"mf\">.<\/span> <span class=\"nf\">now<\/span><span class=\"p\">()<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">format<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Ymd'<\/span><span class=\"p\">)<\/span> <span class=\"mf\">.<\/span> <span class=\"s1\">'-'<\/span> <span class=\"mf\">.<\/span> <span class=\"nb\">str_pad<\/span><span class=\"p\">(<\/span><span class=\"nc\">Order<\/span><span class=\"o\">::<\/span><span class=\"nb\">count<\/span><span class=\"p\">()<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"mi\">4<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'0'<\/span><span class=\"p\">,<\/span> <span class=\"no\">STR_PAD_LEFT<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AC%D8%AA%D9%86%D8%A7%D8%A8_%D8%A7%D8%B2_%D8%AD%D9%84%D9%82%D9%87_%D9%87%D8%A7%DB%8C_%D8%A8%DB%8C_%D9%86%D9%87%D8%A7%DB%8C%D8%AA\"><\/span>\n<p>  \u0627\u062c\u062a\u0646\u0627\u0628 \u0627\u0632 \u062d\u0644\u0642\u0647 \u0647\u0627\u06cc \u0628\u06cc \u0646\u0647\u0627\u06cc\u062a<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0646\u06af\u0627\u0645 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u062f\u0644 \u0647\u0627 \u062f\u0631 \u0646\u0627\u0638\u0631\u0627\u0646 \u0645\u0631\u0627\u0642\u0628 \u0628\u0627\u0634\u06cc\u062f \u060c \u0632\u06cc\u0631\u0627 \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0627\u0639\u062b \u0627\u06cc\u062c\u0627\u062f \u062d\u0648\u0627\u062f\u062b \u0646\u0627\u0638\u0631 \u0627\u0636\u0627\u0641\u06cc \u0648 \u0627\u06cc\u062c\u0627\u062f \u062d\u0644\u0642\u0647 \u0647\u0627\u06cc \u0628\u06cc \u0646\u0647\u0627\u06cc\u062a \u0634\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\User<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">UserObserver<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * Handle the User \"updated\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">updated<\/span><span class=\"p\">(<\/span><span class=\"kt\">User<\/span> <span class=\"nv\">$user<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"c1\">\/\/ BAD: This could create an infinite loop<\/span>\n        <span class=\"c1\">\/\/ $user-&gt;update(['last_activity' =&gt; now()]);<\/span>\n\n        <span class=\"c1\">\/\/ GOOD: Use saveQuietly or update database directly<\/span>\n        <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">saveQuietly<\/span><span class=\"p\">();<\/span>\n\n        <span class=\"c1\">\/\/ OR use query builder to avoid triggering events<\/span>\n        <span class=\"nc\">User<\/span><span class=\"o\">::<\/span><span class=\"nf\">where<\/span><span class=\"p\">(<\/span><span class=\"s1\">'id'<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$user<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">update<\/span><span class=\"p\">([<\/span><span class=\"s1\">'last_activity'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">now<\/span><span class=\"p\">()]);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06af\u0631 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0645\u062f\u0644 \u062f\u0631 \u06cc\u06a9 \u0646\u0627\u0638\u0631 \u062f\u0627\u0631\u06cc\u062f \u060c \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f <code>saveQuietly()<\/code> \u0631\u0648\u0634 \u06cc\u0627 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u0633\u062a\u0642\u06cc\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u06cc\u062c\u0627\u062f \u062d\u0648\u0627\u062f\u062b \u0627\u0636\u0627\u0641\u06cc.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%D8%B1%D8%B3%DB%8C%D8%AF%DA%AF%DB%8C_%D8%A8%D9%87_%D8%AE%D8%B7%D8%A7\"><\/span>\n<p>  \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0647\u0645\u06cc\u0634\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062e\u0637\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u0631\u0627 \u062f\u0631 \u0646\u0627\u0638\u0631\u0627\u0646 \u062e\u0648\u062f \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u062a\u0627 \u0627\u0632 \u0634\u06a9\u0633\u062a\u0646 \u062c\u0631\u06cc\u0627\u0646 \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight php\"><code><span class=\"cp\"><?php <\/span?>\n\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Observers<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kn\">use<\/span> <span class=\"nc\">App\\Models\\Post<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Exception<\/span><span class=\"p\">;<\/span>\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Support\\Facades\\Log<\/span><span class=\"p\">;<\/span>\n\n<span class=\"kd\">class<\/span> <span class=\"nc\">PostObserver<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"cd\">\/**\n     * Handle the Post \"created\" event.\n     *\/<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">created<\/span><span class=\"p\">(<\/span><span class=\"kt\">Post<\/span> <span class=\"nv\">$post<\/span><span class=\"p\">):<\/span> <span class=\"kt\">void<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">try<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ Attempt to perform observer logic<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">updateSearchIndex<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"p\">);<\/span>\n            <span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">sendNotifications<\/span><span class=\"p\">(<\/span><span class=\"nv\">$post<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"nc\">Exception<\/span> <span class=\"nv\">$e<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ Log the error but don't break the main flow<\/span>\n            <span class=\"nc\">Log<\/span><span class=\"o\">::<\/span><span class=\"nf\">error<\/span><span class=\"p\">(<\/span><span class=\"s1\">'Post observer failed'<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span>\n                <span class=\"s1\">'post_id'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$post<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span>\n                <span class=\"s1\">'error'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$e<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">getMessage<\/span><span class=\"p\">(),<\/span>\n                <span class=\"s1\">'trace'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nv\">$e<\/span><span class=\"o\">-&gt;<\/span><span class=\"nf\">getTraceAsString<\/span><span class=\"p\">()<\/span>\n            <span class=\"p\">]);<\/span>\n\n            <span class=\"c1\">\/\/ Optionally, queue a retry job<\/span>\n            <span class=\"c1\">\/\/ RetryPostProcessing::dispatch($post)-&gt;delay(now()-&gt;addMinutes(5));<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%BE%D8%A7%DB%8C%D8%A7%D9%86\"><\/span>\n<p>  \u067e\u0627\u06cc\u0627\u0646<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0646\u0627\u0638\u0631\u0627\u0646 \u0644\u0627\u0631\u0627\u0648\u0644 \u0631\u0648\u0634\u06cc \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0648 \u0638\u0631\u06cc\u0641 \u0628\u0631\u0627\u06cc \u067e\u0627\u0633\u062e \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0645\u062f\u0644 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0622\u0646\u0647\u0627 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc \u06a9\u0646\u0646\u062f \u062a\u0627 \u0628\u0627 \u0645\u062a\u0645\u0631\u06a9\u0632 \u06a9\u0631\u062f\u0646 \u0639\u0648\u0627\u0631\u0636 \u062c\u0627\u0646\u0628\u06cc \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u0645\u062f\u0644 \u0648 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u062a \u060c \u06a9\u062f \u062a\u0645\u06cc\u0632 \u0648 \u0633\u0627\u0632\u0645\u0627\u0646 \u06cc\u0627\u0641\u062a\u0647 \u0631\u0627 \u062d\u0641\u0638 \u06a9\u0646\u06cc\u062f. \u0628\u0627 \u062f\u0631\u06a9 \u0627\u0646\u0648\u0627\u0639 \u0645\u062e\u062a\u0644\u0641 \u0631\u0648\u06cc\u062f\u0627\u062f \u060c \u0627\u062c\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627\u06cc \u0645\u0646\u0627\u0633\u0628 \u0648 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0634\u06cc\u0648\u0647 \u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648 \u0622\u0632\u0645\u0627\u06cc\u0634 \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc LARAVEL \u0642\u0627\u0628\u0644 \u062d\u0641\u0638 \u0648 \u0642\u0648\u06cc \u062a\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0646\u0627\u0638\u0631\u0627\u0646 \u0641\u0642\u0637 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u062f\u0631 \u0627\u0628\u0632\u0627\u0631 Laravel \u0634\u0645\u0627 \u0647\u0633\u062a\u0646\u062f. \u062f\u0631 \u0635\u0648\u0631\u062a \u0646\u06cc\u0627\u0632 \u0628\u0647 \u067e\u0627\u0633\u062e \u062f\u0627\u062f\u0646 \u0628\u0647 \u0648\u0642\u0627\u06cc\u0639 \u0645\u062f\u0644 \u0628\u0647 \u0637\u0648\u0631 \u0645\u062f\u0627\u0648\u0645 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u060c \u0627\u0632 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f \u060c \u0627\u0645\u0627 \u0627\u062d\u0633\u0627\u0633 \u0646\u0645\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u0622\u0646\u0647\u0627 \u0628\u0631\u0627\u06cc \u0647\u0631 \u0642\u0637\u0639\u0647 \u0627\u06cc \u0627\u0632 \u0645\u0646\u0637\u0642 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0645\u062f\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u06cc\u06a9 \u062a\u0645\u0627\u0633 \u0631\u0648\u0634 \u0633\u0627\u062f\u0647 \u062f\u0631 \u06a9\u0646\u062a\u0631\u0644\u0631 \u06cc\u0627 \u06a9\u0644\u0627\u0633 \u062e\u062f\u0645\u0627\u062a \u0634\u0645\u0627 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0645\u0646\u0627\u0633\u0628 \u062a\u0631 \u0628\u0627\u0634\u062f \u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u0628\u0631\u0627\u06cc \u0639\u0645\u0644\u06cc\u0627\u062a \u06cc\u06a9 \u0637\u0631\u0641\u0647 \u06cc\u0627 \u0645\u0646\u0637\u0642 \u06a9\u0633\u0628 \u0648 \u06a9\u0627\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u06a9\u0647 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0633\u062a\u0642\u06cc\u0645 \u0628\u0647 \u0686\u0631\u062e\u0647 \u0639\u0645\u0631 \u0645\u062f\u0644 \u0645\u0631\u0628\u0648\u0637 \u0646\u0645\u06cc \u0634\u0648\u062f.<\/p>\n<p>\u0628\u0627 \u0627\u062f\u0627\u0645\u0647 \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc LARAVEL \u060c \u0645\u062a\u0648\u062c\u0647 \u062e\u0648\u0627\u0647\u06cc\u062f \u0634\u062f \u06a9\u0647 \u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0647 \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc \u0627\u0631\u0632\u0634\u0645\u0646\u062f \u0628\u0631\u0627\u06cc \u0633\u0627\u0632\u0645\u0627\u0646\u062f\u0647\u06cc \u06a9\u062f \u0634\u0645\u0627 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u0634\u0648\u0646\u062f \u0648 \u0645\u062f\u0644\u0647\u0627\u06cc \u0634\u0645\u0627 \u0636\u0645\u0646 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0639\u0648\u0627\u0631\u0636 \u062c\u0627\u0646\u0628\u06cc \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0647 \u0631\u0648\u0634\u06cc \u062a\u0645\u06cc\u0632 \u0648 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634 \u060c \u0628\u0631 \u0645\u0633\u0626\u0648\u0644\u06cc\u062a \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0622\u0646\u0647\u0627 \u0645\u062a\u0645\u0631\u06a9\u0632 \u0634\u062f\u0647 \u0627\u0646\u062f.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0646\u0627\u0638\u0631\u0627\u0646 Laravel \u06cc\u06a9 \u0631\u0648\u0634 \u0632\u06cc\u0628\u0627 \u0628\u0631\u0627\u06cc \u06af\u0648\u0634 \u062f\u0627\u062f\u0646 \u0628\u0647 \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u0645\u062f\u0644 \u0641\u0635\u06cc\u062d \u0648 \u0627\u062c\u0631\u0627\u06cc \u06a9\u062f\u06cc \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0631 \u0635\u0648\u0631\u062a \u0628\u0631\u0648\u0632 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u062e\u0627\u0635 \u062f\u0631 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0628\u0647 \u0646\u0627\u0638\u0631\u0627\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0634\u0646\u0648\u0646\u062f\u06af\u0627\u0646 \u062a\u062e\u0635\u0635\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f \u06a9\u0647 \u0645\u062f\u0644 \u0647\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627 \u062a\u0645\u0627\u0634\u0627 \u0645\u06cc \u06a9\u0646\u0646\u062f \u0648 \u062f\u0631 \u0628\u0631\u0627\u0628\u0631 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u062c\u0627\u062f \u060c \u0628\u0647 \u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u0627 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":111650,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-111649","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/111649","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=111649"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/111649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/111650"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=111649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=111649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=111649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}