{"id":2039,"date":"2017-09-29T19:10:52","date_gmt":"2017-09-29T17:10:52","guid":{"rendered":"https:\/\/guven.atbakan.com\/blog\/?p=2039"},"modified":"2022-05-04T21:18:46","modified_gmt":"2022-05-04T19:18:46","slug":"laravelde-middleware-kullanimi-ve-yanit-suresini-loglama","status":"publish","type":"post","link":"https:\/\/guven.atbakan.com\/blog\/tr\/laravelde-middleware-kullanimi-ve-yanit-suresini-loglama\/","title":{"rendered":"Laravel&#8217;de Middleware kullan\u0131m\u0131 ve yan\u0131t s\u00fcresini loglama"},"content":{"rendered":"<p>Asl\u0131nda sadece yan\u0131t s\u00fcresini loglamay\u0131 anlat\u0131cakt\u0131m ama burada i\u015fimiz Middleware ile olaca\u011f\u0131 i\u00e7in onun da ne oldu\u011funu anlatay\u0131m istedim. Middleware, kelime anlam\u0131yla, ara katman &#8211; orta katman anlam\u0131na gelir. Kelime anlam\u0131yla \u00e7ok uyumlu bir programlama terimi. Bu sefer Laravel&#8217;in bir uydurmas\u0131 de\u011fil, zaten olan bir\u015fey. Bu yaz\u0131mda Laravel s\u00fcper isimlendiriyor yawww diye \u00f6vmeyece\u011fim. Laravel&#8217;de middleware, HTTP istekleri ile iste\u011fin ger\u00e7ekle\u015fmesi aras\u0131nda ya da http iste\u011fi ger\u00e7ekle\u015ftikten sonra \u00e7al\u0131\u015facak \u015fekilde durur. \u015e\u00f6yle ki, Laravel ile yaz\u0131lm\u0131\u015f site.com\/hakkimizda sayfas\u0131n\u0131 a\u00e7mak istedi\u011finizde, Laravel \u00f6nce router dosyas\u0131na bakar, i\u015fler ve ilgili controller methodunu \u00e7al\u0131\u015ft\u0131r\u0131r. Hah, i\u015fte tam bu noktada; router iste\u011fi i\u015fledikten sonra, controller&#8217;a y\u00f6nlendirmeden \u00f6nce -e\u011fer tan\u0131mland\u0131ysa- middleware s\u0131n\u0131f\u0131m\u0131za y\u00f6nlendirir. Middleware \u00e7al\u0131\u015f\u0131r, istenilen kontroller\/g\u00fcncellemeler yap\u0131l\u0131r, e\u011fer middleware izin verirse controller&#8217;a y\u00f6nlendirilir. (controller&#8217;a ne kadar acayip bi kelime ya) Yani middleware, route ile controller aras\u0131nda bir ARA KATMANd\u0131r. Ara katman&#8217;\u0131 b\u00fcy\u00fck yazd\u0131m \u00e7\u00fcnk\u00fc, sadece Laravel&#8217;deki kullan\u0131m\u0131na bakarsak, controller&amp;route aras\u0131ndaki katman oldu\u011funu zannedebiliriz. Oysa araya girme niyetindeki her\u015fey bir middleware olabilir. Google Translate&#8217;teki tan\u0131m\u0131na bakal\u0131m: <code><code>software that acts as a bridge between an operating system or database and applications, especially on a network.<\/code><\/code> Yani diyor ki, bir i\u015fletim sistemi\/veritaban\u0131 ve uygulamalar aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6ren yaz\u0131l\u0131mlard\u0131r. \u00d6zellikle bir networkte diye belirtmi\u015f. Bir network\u00fc ben \u015fu \u015fekilde yorumluyorum: bir sistemde\/yap\u0131da. Dahili bir bi\u00e7imde. Neyse \u00e7ok detaya girip kafa kar\u0131\u015ft\u0131rmayay\u0131m, benim kafam kar\u0131\u015ft\u0131 bile. Yine de girmek isteyen olursa katk\u0131lar\u0131n\u0131 eklerim.<\/p>\n<h2>Laravel&#8217;de Middleware<\/h2>\n<p>Middleware ile ilgili d\u00f6k\u00fcmantasyon \u015furada bulunuyor: <a href=\"https:\/\/laravel.com\/docs\/master\/middleware\">https:\/\/laravel.com\/docs\/master\/middleware<\/a> Laravel 2 tip middleware olu\u015fturmu\u015f. Birincisi, a\u015fina oldu\u011fumuz request-controller aras\u0131 \u00e7al\u0131\u015fan middleware. Di\u011feri de response verildikten sonra \u00e7al\u0131\u015fan terminable middleware. A\u015fina oldu\u011fumuz middleware i\u00e7in \u015fu \u00f6rne\u011fi verebiliriz: Girilen sayfaya, bir kullan\u0131c\u0131n\u0131n yetkisinin olup olmad\u0131\u011f\u0131n\u0131 kontrol eden middleware. Kodu ise \u015fu \u015fekildedir: <\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n    public function handle($request, Closure $next)\n    {\n       \/\/burada gerekli i\u015flemleri yap\u0131yoruz. \u00f6rne\u011fin \u00fcyenin yetkisi var m\u0131 yok mu kontrol edebiliriz.\n       \/\/ya da buna benzer \u015feyler. \n\n        return $next($request);\n    }<\/code><\/pre>\n<p><code>$request<\/code> de\u011fi\u015fkenimiz, <code>IlluminateHttpRequest<\/code> s\u0131n\u0131f\u0131n\u0131n ta kendisi. Yani bizim o anki iste\u011fimiz ile ilgili her\u015feyi bilen s\u0131n\u0131f. (Bence birisi bu s\u0131n\u0131f \u00fczerine bir yaz\u0131 yazmal\u0131.) O an hangi route \u00e7al\u0131\u015f\u0131yor, hangi parametreler alm\u0131\u015f, sessionda neler var, cookiede neler var vs vs gibi onlarca sorunun cevab\u0131 bu s\u0131n\u0131f i\u00e7erisinde. Bu bilgiler \u0131\u015f\u0131\u011f\u0131nda istedi\u011finiz kontrol\u00fc yapabilirsiniz. Tabi middleware sadece kontrol etmek i\u00e7in kullan\u0131lm\u0131yor. Ayn\u0131 zamanda sisteme yeni par\u00e7alar da dahil edebilirsiniz. Her\u015fey sizin elinizde. ### Terminable Middleware<\/p>\n<p>Bu middleware s\u0131n\u0131f\u0131, HTTP sonucu, yani Response, taray\u0131c\u0131ya (istemciye) g\u00f6nderildikten sonra \u00e7al\u0131\u015f\u0131r. Biti\u015f middlewarelerinde <code>handle<\/code> methodundan farkl\u0131 olarak bir de <code>terminate<\/code> methodu \u00e7al\u0131\u015f\u0131r. Ve bu method <code>$request<\/code> s\u0131n\u0131f\u0131na sahip olmakla birlikte, bir de <code>$response<\/code> s\u0131n\u0131f\u0131na sahiptir. Response s\u0131n\u0131f\u0131 sayesinde, istemciye ne sonu\u00e7 g\u00f6nderildi\u011fini biliriz ve buna g\u00f6re istedi\u011fimiz i\u015flemi yapar\u0131z. <\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n    public function terminate($request, $response)\n    {\n        \/\/ burada bi\u015feyler yapabiliriz.\n        \/\/ art\u0131k response taray\u0131c\u0131ya g\u00f6nderildi. \n        \/\/ \u00f6rne\u011fin, responsu kontrol ederiz. diyelim ki 422 sonu\u00e7 kodu d\u00f6n\u00fcyor.\n        \/\/ o zaman bunu loglatal\u0131m, gibi fantazi i\u015fler yap\u0131labilir. \n    }<\/code><\/pre>\n<h2>Laravel&#8217;de derleme s\u00fcresini \u00f6\u011frenme<\/h2>\n<p>Laravel&#8217;deki <code>&lt;a href=&quot;https:\/\/github.com\/laravel\/laravel\/blob\/master\/public\/index.php#L10&quot;&gt;public\/index.php&lt;\/a&gt;<\/code> dosyas\u0131na bakt\u0131\u011f\u0131m\u0131zda, LARAVEL_START ad\u0131nda bir sabit de\u011fi\u015fken tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcr\u00fcz. Bu, Laravel&#8217;e ilk istek geldi\u011fi anda tan\u0131mlan\u0131r. Yani ilk \u00e7al\u0131\u015fan kodumuzdur. \u015eimdi bir de yapmam\u0131z gereken, en son \u00e7al\u0131\u015fma an\u0131nda s\u00fcreyi tespit etmek ve aradaki fark\u0131 loglara g\u00f6ndermek. Bunun i\u00e7in standart bir middleware olu\u015ftural\u0131m. <code>php artisan make:middleware ResponseTimeMiddleware<\/code> g\u00fczel bir ba\u015flang\u0131\u00e7 olacakt\u0131r. Daha sonra bu middleware&#8217;i <code>AppHttpKernel<\/code> dosyam\u0131zdaki <code>$middleware<\/code> dizisi i\u00e7erisine ekleyelim. B\u00f6ylece t\u00fcm requestlerde bu ekledi\u011fimiz middleware \u00e7al\u0131\u015fm\u0131\u015f olacak. Yeni olu\u015fturdu\u011fumuz middleware&#8217;e a\u015fa\u011f\u0131daki terminate fonksiyonunu ekleyelim: <\/p>\n<pre><code class=\"language-php\">&lt;?php\n\n    ....\n\n    public function terminate(Request $request, Response $response)\n    {\n        Log::debug($request-&gt;getPathInfo().&#039; =&gt;  &#039;.(microtime(true) - LARAVEL_START));\n    }<\/code><\/pre>\n<p>B\u00f6ylece uygulama ba\u015flang\u0131c\u0131ndan itibarek ge\u00e7en s\u00fcreyi loglar\u0131m\u0131za yazd\u0131rm\u0131\u015f olduk. Response s\u00fcresini loglara yazd\u0131r\u0131p debug yapmak \u00e7ok etkili bir y\u00f6ntem gibi g\u00f6z\u00fckmese de bazen \u00e7ok h\u0131zl\u0131 bi\u00e7imde sorunlu sayfalar\u0131 bulman\u0131za yard\u0131mc\u0131 olabiliyor. Ama ben genelde production ortam\u0131nda, daha detayl\u0131 bilgi veren NewRelic hizmetini kullan\u0131yorum. Hem sayfalar\u0131n ortalama response s\u00fcrelerini kolayca \u00f6\u011frenebiliyorum hem de veritaban\u0131 sorgular\u0131n\u0131 detayl\u0131ca inceleyebiliyorum. Hangi query ne kadar s\u00fcrm\u00fc\u015f vs diye. Tavsiye ederim.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asl\u0131nda sadece yan\u0131t s\u00fcresini loglamay\u0131 anlat\u0131cakt\u0131m ama burada i\u015fimiz Middleware ile olaca\u011f\u0131 i\u00e7in onun da ne oldu\u011funu anlatay\u0131m istedim. Middleware, kelime anlam\u0131yla, ara katman &#8211; orta katman anlam\u0131na gelir. Kelime anlam\u0131yla \u00e7ok uyumlu bir programlama terimi. Bu sefer Laravel&#8217;in bir uydurmas\u0131 de\u011fil, zaten olan bir\u015fey. Bu yaz\u0131mda Laravel s\u00fcper isimlendiriyor yawww diye \u00f6vmeyece\u011fim. Laravel&#8217;de middleware, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[4],"tags":[345,375,376],"class_list":["post-2039","post","type-post","status-publish","format-standard","hentry","category-yazilim","tag-laravel","tag-laravel-middleware","tag-middleware"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/comments?post=2039"}],"version-history":[{"count":4,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2039\/revisions"}],"predecessor-version":[{"id":2404,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2039\/revisions\/2404"}],"wp:attachment":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/media?parent=2039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/categories?post=2039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/tags?post=2039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}