﻿
{"id":23158,"date":"2021-09-27T00:04:47","date_gmt":"2021-09-27T00:04:47","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=23158"},"modified":"2021-09-27T00:04:47","modified_gmt":"2021-09-27T00:04:47","slug":"front-controller-design-pattern-nedir-nasil-uygulanir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/front-controller-design-pattern-nedir-nasil-uygulanir\/","title":{"rendered":"Front Controller Design Pattern Nedir? Nas\u0131l Uygulan\u0131r?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde yap\u0131sal desenler(structural patterns) kategorisiyle birlikte bir yandan da web aray\u00fcz desenleri kategorisinde de ad\u0131ndan bahsettiren <em>Front Controller Design Pattern<\/em> \u00fczerine konu\u015fuyor olaca\u011f\u0131z. \u0130\u00e7eri\u011fimiz s\u00fcresince <em style=\"font-size:11px;\">Front Controller Design Pattern nedir? ne ama\u00e7la ve nas\u0131l kullan\u0131lmaktad\u0131r?<\/em> sorular\u0131n\u0131 sorarak cevapland\u0131rmaya \u00e7al\u0131\u015facak ve pratiksel olarak \u00f6rnekler sunaca\u011f\u0131z.<\/p>\n<h5>Front Controller Design Pattern&#8217;\u0131n Amac\u0131 Nedir?<\/h5>\n<p>Front Controller Design Pattern&#8217;in amac\u0131, client&#8217;lardan gelecek olan istekleri merkezi bir yerde kar\u015f\u0131lay\u0131p sonras\u0131nda ilgili kod par\u00e7ac\u0131klar\u0131na ya da bir ba\u015fka deyi\u015fle istekle alakal\u0131 kodu\/i\u015f mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131ran s\u0131n\u0131flara y\u00f6nlendirmektir. \u0130stekleri merkezi bir yerde kar\u015f\u0131lamas\u0131n\u0131n temel nedeni, farkl\u0131 i\u015f mant\u0131klar\u0131nda s\u00fcrekli ortak i\u015flemlerin var olmas\u0131d\u0131r. Misal olarak, kullan\u0131c\u0131lardan gelen istekler her ne olursa olsun \u00f6ncelikle bir yetkilendirme kontrol\u00fc, loglama ve takip gibi t\u00fcrl\u00fc i\u015flemler gerektiriyor olabilir. Ya da yetkili bir kullan\u0131c\u0131n\u0131n eri\u015fmek istedi\u011fi verilere rol\u00fcn\u00fcn m\u00fcsaade edip etmedi\u011fi de kontrol gerektirebilir. Bu tarz kontrolleri her bir i\u015flem i\u00e7in tekrarl\u0131 bir \u015fekilde ayr\u0131 ayr\u0131 yapmak yerine istekleri merkezi bir controller&#8217;da kar\u015f\u0131layarak, \u00f6ncelikli olarak orada tek elden ger\u00e7ekle\u015ftirip sonra iste\u011fi ilgili koda y\u00f6nlendirmek tasar\u0131msal a\u00e7\u0131dan do\u011fru bir yakla\u015f\u0131m olacakt\u0131r ve tekrar eden kod miktar\u0131n\u0131 d\u00fc\u015f\u00fcrecektir. <\/p>\n<h5>Front Controller Design Pattern Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h5>\n<p>Genellikle web uygulamalar\u0131nda tercih edilen Front Controller Design Pattern gelen b\u00fct\u00fcn istekleri kar\u015f\u0131layan bir controller s\u0131n\u0131f\u0131 \u00fczerinden i\u015flemleri y\u00fcr\u00fctmektedir. Yap\u0131sal olarak belli ba\u015fl\u0131 akt\u00f6rleri a\u015fa\u011f\u0131daki \u015femada oldu\u011fu gibidir;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir.png\" alt=\"Front Controller Design Pattern Nedir? Nas\u0131l Uygulan\u0131r?\" width=\"563\" height=\"208\" class=\"aligncenter size-full wp-image-23163\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir.png 563w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir-300x111.png 300w\" sizes=\"auto, (max-width: 563px) 100vw, 563px\" \/><\/a><\/p>\n<ul>\n<li><strong><em>Front Controller<\/em><\/strong><br \/>\nUygulamada gelen her iste\u011fi kar\u015f\u0131layan s\u0131n\u0131ft\u0131r.\n<\/li>\n<li><strong><em>Dispatcher<\/em><\/strong><br \/>\nFront Controller taraf\u0131ndan kar\u015f\u0131lanan iste\u011fi ilgili handler&#8217;a y\u00f6nlendirmeyi sa\u011flayan nesnedir.\n<\/li>\n<li><strong><em>Handler<\/em><\/strong><br \/>\n\u0130stek s\u00fcrecinde gerekli i\u015flemi ger\u00e7ekle\u015ftirecek ve hatta varsa veriyi \u00fcretecek s\u0131n\u0131ft\u0131r.\n<\/li>\n<li><strong><em>View<\/em><\/strong><br \/>\n\u0130stek neticesinde Handler taraf\u0131ndan i\u015flenerek \u00fcretilen sonucun client&#8217;a sunuldu\u011fu yap\u0131d\u0131r.\n<\/li>\n<\/ul>\n<p>Bu tasar\u0131mda, Front Controller s\u0131n\u0131f\u0131n\u0131n ihtiyac\u0131 olan t\u00fcm bilgiler client&#8217;\u0131n yapt\u0131\u011f\u0131 istekler i\u00e7erisinde context olarak g\u00f6nderilmektedir. Misal olarak; Front Controller&#8217;a gelen istekte hangi handler s\u0131n\u0131f\u0131n\u0131n tetiklenece\u011fi, handler&#8217;\u0131n hangi view yap\u0131s\u0131n\u0131 \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 vs. tarz\u0131 bilgiler request i\u00e7erisinde parametre olarak gelmektedir ve gerekti\u011fi taktirde if\/else kontrol yap\u0131lar\u0131yla bu analiz edilerek karar verilir.<\/p>\n<h5>Pratik Yapal\u0131m<\/h5>\n<p>\u015eimdi konuya dair bir senaryo \u00fczerinden pratik \u00f6rnek vererek ilerleyelim.<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center;color:red;\">Senaryo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\nBu senaryoda basit bir Console Application \u00fczerinden Front Controller Design Pattern&#8217;\u0131n nas\u0131l uyguland\u0131\u011f\u0131n\u0131 ele al\u0131yor olaca\u011f\u0131z.<\/p>\n<p>Senaryo mahiyet a\u00e7\u0131s\u0131ndan \u015f\u00f6yle olacakt\u0131r; bir banka uygulamas\u0131 geli\u015ftirdi\u011fimizi d\u00fc\u015f\u00fcnelim. Bu uygulamada client&#8217;lar taraf\u0131ndan yap\u0131lan t\u00fcm istekler merkezi bir s\u0131n\u0131f olan <code style=\"color:blue;font-size:14px;\">BankaController<span style=\"color:black;\">(Front Controller)<\/span><\/code> taraf\u0131ndan kar\u015f\u0131lanacak ve yap\u0131lan iste\u011fi ya <code style=\"color:blue;font-size:14px;\">GarantiHandler<span style=\"color:black;\">(Handler)<\/span><\/code> ya da <code style=\"color:blue;font-size:14px;\">HalkbankHandler<span style=\"color:black;\">(Handler)<\/span><\/code> nesnelerinden ilgili olan\u0131na y\u00f6nlendirecek.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div style=\"font-size:.875em;\">\n<strong>\u00c7\u00f6z\u00fcm<\/strong><\/p>\n<ul>\n<li><em>Ad\u0131m 1<\/em><br \/>\nHer\u015feyden \u00f6nce <code style=\"color:blue;font-size:14px;\">GarantiHandler<span style=\"color:black;\">(Handler)<\/span><\/code> ve <code style=\"color:blue;font-size:14px;\">HalkbankHandler<span style=\"color:black;\">(Handler)<\/span><\/code> s\u0131n\u0131flar\u0131n\u0131 olu\u015fturarak ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class GarantiHandler\r\n    {\r\n        public void FaturaOde(decimal tutar)\r\n            =&gt; Console.WriteLine($&quot;{tutar} TL tutar\u0131nda fatura \u00f6denmi\u015ftir.&quot;);\r\n        public void EFT(decimal tutar, string hesapNo)\r\n            =&gt; Console.WriteLine($&quot;{tutar} TL tutar\u0131nda para {hesapNo} numaral\u0131 hesaba g\u00f6nderilmi\u015ftir.&quot;);\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HalkbankHandler\r\n    {\r\n        public void KrediCek(int tutar)\r\n            =&gt; Console.WriteLine($&quot;{tutar} TL tutar\u0131nda kredi \u00e7ekilmi\u015ftir.&quot;);\r\n    }\r\n<\/pre>\n<p>Handler s\u0131n\u0131flar\u0131 birbirlerinden farkl\u0131 olabilirler. Dolay\u0131s\u0131yla yukar\u0131daki tan\u0131mlanan s\u0131n\u0131flardaki memberlar\u0131n birbirlerinden farkl\u0131 oldu\u011funa dikkatinizi \u00e7ekerim.\n<\/li>\n<li><em>Ad\u0131m 2<\/em><br \/>\nHandler s\u0131n\u0131flar\u0131 olu\u015fturulduktan sonra iste\u011fe g\u00f6re hangi handler&#8217;\u0131n tetiklenece\u011finin karar\u0131n\u0131 verecek ve y\u00f6nlendirme i\u015flemini \u00fcstlenecek olan <code style=\"color:blue;font-size:14px;\">BankaDispatcher<span style=\"color:black;\">(Dispatcher)<\/span><\/code> nesnesini olu\u015fturmam\u0131z gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class BankaDispatcher\r\n    {\r\n        readonly GarantiHandler _garantiHandler;\r\n        readonly HalkbankHandler _halkbankHandler;\r\n\r\n        public BankaDispatcher()\r\n        {\r\n            _garantiHandler = new();\r\n            _halkbankHandler = new();\r\n        }\r\n\r\n        public void Dispatch(Banka banka, Islem islem, object&#x5B;] values)\r\n        {\r\n            var process = (banka, islem) switch\r\n            {\r\n                (Banka.Garanti, Islem.FaturaOde) =&gt; 1,\r\n                (Banka.Garanti, Islem.EFT) =&gt; 2,\r\n                (Banka.Halkbank, Islem.KrediCek) =&gt; 3,\r\n            };\r\n\r\n            if (process == 1)\r\n                _garantiHandler.FaturaOde((decimal)values&#x5B;0]);\r\n            else if (process == 2)\r\n                _garantiHandler.EFT((decimal)values&#x5B;0], (string)values&#x5B;1]);\r\n            else if (process == 3)\r\n                _halkbankHandler.KrediCek((int)values&#x5B;0]);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki <code style=\"color:blue;font-size:14px;\">BankaDispatcher<span style=\"color:black;\">(Dispatcher)<\/span><\/code> s\u0131n\u0131f\u0131n\u0131 incelerseniz e\u011fer i\u00e7erisinde <code style=\"color:blue;font-size:14px;\">GarantiHandler<span style=\"color:black;\">(Handler)<\/span><\/code> ve <code style=\"color:blue;font-size:14px;\">HalkbankHandler<span style=\"color:black;\">(Handler)<\/span><\/code> s\u0131n\u0131flar\u0131n\u0131n referanslar\u0131n\u0131 bar\u0131nd\u0131rmakta ve constructor i\u00e7erisinde bu referanslara birer instance \u00fcretip, ba\u011flamaktad\u0131r. &#8216;Dispatch&#8217; metoduna g\u00f6z atarsan\u0131z e\u011fer <code style=\"color:blue;font-size:14px;\">BankaController<span style=\"color:black;\">(Front Controller)<\/span><\/code> taraf\u0131ndan kar\u015f\u0131lanacak isteklerdeki parametrelere g\u00f6re yap\u0131lacak i\u015flemi analiz etmekte ve gerekli handler&#8217;\u0131 tetiklemektedir.<\/p>\n<p>Burada kullan\u0131lan &#8216;Banka&#8217; ve &#8216;Islem&#8217; enum&#8217;lar\u0131n\u0131n i\u00e7eri\u011fide a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public enum Banka\r\n    {\r\n        &#x5B;Display(Name = &quot;Garanti Bankas\u0131&quot;)]\r\n        Garanti,\r\n        &#x5B;Display(Name = &quot;Halk Bankas\u0131&quot;)]\r\n        Halkbank\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public enum Islem\r\n    {\r\n        &#x5B;Display(Name = &quot;Fatura \u00d6deme&quot;)]\r\n        FaturaOde,\r\n        &#x5B;Display(Name = &quot;EFT&quot;)]\r\n        EFT,\r\n        &#x5B;Display(Name = &quot;Kredi \u00c7ekme&quot;)]\r\n        KrediCek\r\n    }\r\n<\/pre>\n<\/li>\n<li><em>Ad\u0131m 3<\/em><br \/>\nArd\u0131ndan client taraf\u0131ndan gelecek olan istekleri kar\u015f\u0131layacak olan <code style=\"color:blue;font-size:14px;\">BankaController<span style=\"color:black;\">(Front Controller)<\/span><\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class BankaController\r\n    {\r\n        readonly BankaDispatcher _dispatcher;\r\n        public BankaController()\r\n            =&gt; _dispatcher = new();\r\n\r\n        bool IsAuthenticUser()\r\n        {\r\n            Console.WriteLine(&quot;Kullan\u0131c\u0131 ba\u015far\u0131yla do\u011frulanm\u0131\u015ft\u0131r.&quot;);\r\n            return true;\r\n        }\r\n        void SetLog(Banka banka, Islem islem)\r\n            =&gt; Console.WriteLine($&quot;{GetDisplayName(banka.GetType(), banka.ToString())} bankas\u0131nda {GetDisplayName(islem.GetType(), islem.ToString())} yap\u0131lm\u0131\u015ft\u0131r.&quot;);\r\n\r\n        string GetDisplayName(Type type, string member)\r\n            =&gt; type\r\n            .GetMember(member)\r\n            .First()\r\n            .GetCustomAttribute&lt;DisplayAttribute&gt;()\r\n            .Name;\r\n\r\n        public void DispatchBanka(Banka banka, Islem islem, object&#x5B;] values)\r\n        {\r\n            if (IsAuthenticUser())\r\n            {\r\n                _dispatcher.Dispatch(banka, islem, values);\r\n                SetLog(banka, islem);\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da <code style=\"color:blue;font-size:14px;\">BankaController<span style=\"color:black;\">(Front Controller)<\/span><\/code> s\u0131n\u0131f\u0131n\u0131n kodunu incelerseniz e\u011fer i\u00e7erisinde t\u00fcm isteklerdeki \u00f6ncelikli ve tekrar i\u015flemler olan kullan\u0131c\u0131 kimlik do\u011frulama, loglama vs. gibi &#8216;IsAuthenticUser&#8217;, &#8216;SetLog&#8217; operasyonlar\u0131n\u0131 bar\u0131nd\u0131rmaktad\u0131r. Bu operasyonlar e\u015fli\u011finde referans etti\u011fi <code style=\"color:blue;font-size:14px;\">BankaDispatcher<span style=\"color:black;\">(Dispatcher)<\/span><\/code> nesnesi \u00fczerinden gerekli handler s\u0131n\u0131flar\u0131n\u0131 tetiklemektedir.\n<\/li>\n<li><em>Ad\u0131m 4<\/em><br \/>\nArt\u0131k s\u0131ra in\u015fa edilen bu yap\u0131y\u0131 kullanmaya gelmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            BankaController bankaController = new();\r\n            bankaController.DispatchBanka(Banka.Garanti, Islem.EFT, new object&#x5B;] { (decimal)1000, &quot;8123123&quot; });\r\n            Console.WriteLine(&quot;*****&quot;);\r\n            bankaController.DispatchBanka(Banka.Garanti, Islem.FaturaOde, new object&#x5B;] { (decimal)250 });\r\n            Console.WriteLine(&quot;*****&quot;);\r\n            bankaController.DispatchBanka(Banka.Halkbank, Islem.KrediCek, new object&#x5B;] { 25000 });\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer Front Controller tasar\u0131m\u0131n\u0131 uygulad\u0131\u011f\u0131m\u0131z <code style=\"color:blue;font-size:14px;\">BankaController<span style=\"color:black;\">(Front Controller)<\/span><\/code> s\u0131n\u0131f\u0131ndan bir nesne olu\u015fturulmakta ve farkl\u0131 parametreler e\u015fli\u011finde \u00fc\u00e7 istek ger\u00e7ekle\u015ftirilmektedir. <code style=\"color:blue;font-size:14px;\">BankaDispatcher<span style=\"color:black;\">(Dispatcher)<\/span><\/code> nesnesinde bu istekteki parametrelerin mahiyetine uygun bir \u015fekilde hangi handler&#8217;\u0131n tetiklenece\u011fi analiz edilmekte ve sonu\u00e7 a\u015fa\u011f\u0131daki gibi olmaktad\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir-1.png\" alt=\"Front Controller Design Pattern Nedir Nas\u0131l Uygulan\u0131r\" width=\"499\" height=\"179\" class=\"aligncenter size-full wp-image-23199\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir-1.png 499w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/09\/Front-Controller-Design-Pattern-Nedir-Nasil-Uygulanir-1-300x108.png 300w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, iste\u011fin ilgilendi\u011fi handler farketmeksizin her bir istekte yap\u0131lmas\u0131 gereken t\u00fcm sabit i\u015flemleri tekrar tekrar yapmaktansa Front Controller deseni sayesinde tek bir merkezi s\u0131n\u0131fta yap\u0131p, beklenen i\u015fleri daha az maliyetle ger\u00e7ekle\u015ftirmi\u015f bulunmaktay\u0131z.\n<\/li>\n<\/ul>\n<\/div>\n<h5>Ne Zaman Kullan\u0131l\u0131r?<\/h5>\n<p>Uygulamadaki request&#8217;ler i\u015flenirken ortak i\u015flemlerin say\u0131s\u0131 haddinden fazlaysa ve anlams\u0131z boyutta kod tekrar\u0131 yapmay\u0131 elzem k\u0131l\u0131yorsa kullan\u0131lmas\u0131 tavsiye edilmektedir.<\/p>\n<h5>Faydalar\u0131<\/h3>\n<ul>\n<li>Front Controller, uygulamaya y\u00f6nelik t\u00fcm istekleri i\u015fler. B\u00f6ylece, kullan\u0131c\u0131 izleme ve g\u00fcvenlik gibi genel politikalar\u0131n uygulanmas\u0131 i\u00e7in <em><strong><u>merkezi kontrol<\/u><\/strong><\/em> sa\u011flar.<\/li>\n<li>Yeni bir istek geldi\u011finde Front Controller kar\u015f\u0131layaca\u011f\u0131ndan dolay\u0131 <em><strong><u>thread safety<\/u><\/strong><\/em> sa\u011flamaktad\u0131r.<\/li>\n<li>Uygulaman\u0131n <em><strong><u>konfig\u00fcrasyonu<\/u><\/strong><\/em> b\u00fcy\u00fck \u00f6l\u00e7\u00fcde <em><strong><u>basitle\u015ftirilmi\u015ftir.<\/u><\/strong><\/em><\/li>\n<\/ul>\n<blockquote><p><em>Front Controller Design Pattern, handler s\u0131n\u0131flar\u0131nda ayn\u0131 kodu tekrar tekrar yazmaks\u0131z\u0131n yeniden kullanma esnekli\u011fi ve yetene\u011fi sa\u011flar. \u00c7\u00fcnk\u00fc yetki, log vs. gibi i\u015flemler Front Controller taraf\u0131ndan ger\u00e7ekle\u015ftirilir.<\/em><\/p><\/blockquote>\n<h5>MVC Modeliyle \u0130li\u015fkileri<\/h5>\n<p>Asp.NET(Core) MVC mimarisi tam anlam\u0131yla Front Controller tasar\u0131m\u0131na uygun bir altyap\u0131yla geli\u015ftirilmi\u015ftir. \u0130lgili mimarideki Routing yap\u0131lanmas\u0131 esas\u0131nda buradaki Dispatcher nesnesiyle e\u015fde\u011fer g\u00f6r\u00fclebilir ve her ikisi de gelen iste\u011fi uygun handler(controller)lara da\u011f\u0131tma g\u00f6revi g\u00f6rmektedir.<\/p>\n<p>Ayr\u0131ca Front Controller, MVC&#8217;de ki controller&#8217;a alternatiftir diyebiliriz. Misal; Front Controller, t\u00fcm istekleri bir controller&#8217;da i\u015fler. MVC&#8217;de ise her iste\u011fi uygun controller kar\u015f\u0131lar ve i\u015fler. Haliyle Front Controller MVC&#8217;ye nazaran daha karma\u015f\u0131kt\u0131r.<\/p>\n<p>Bu durumu daha net \u015f\u00f6yle yorumlayabiliriz. MVC genel bir kal\u0131pt\u0131r. Yani MVC&#8217;de fikir, bir uygulaman\u0131n i\u015fleyi\u015fini <em>Model<\/em> &#8211; <em>View<\/em> &#8211; <em>Controller<\/em> olarak ay\u0131rmakt\u0131r. Bu fikir bir uygulaman\u0131n \u00f6zelliklerine g\u00f6re iki farkl\u0131 \u015fekilde ger\u00e7ekle\u015ftirilebilir. Birincisi, her bir iste\u011fe yan\u0131t veren ayr\u0131 controller s\u0131n\u0131f\u0131 olu\u015fturmakt\u0131r. Yani klasik MVC pattern&#8217;\u0131 uygulamakt\u0131r. \u0130kicisi ise t\u00fcm istekleri kar\u015f\u0131layan ve ard\u0131ndan bunlar\u0131 farkl\u0131 handler&#8217;lara y\u00f6nlendiren tek bir ana controller&#8217;a sahip olmak. Yani Front Controller tasar\u0131m\u0131n\u0131 uygulamak. Haliyle Front Controller tasar\u0131m\u0131 MVC kal\u0131b\u0131n\u0131n bir alt takti\u011fi olarak kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r.<\/p>\n<p>Nihai olarak;<br \/>\nB\u00f6ylece yerine g\u00f6re merkezi yap\u0131lanman\u0131n gerekti\u011fi durumlarda kullan\u0131labilecek bir tasar\u0131m olan Front Controller&#8217;\u0131 incelemi\u015f ve tasar\u0131msal kavramlar\u0131 e\u015fli\u011finde me\u015fhur MVC pattern ile olabilecek ili\u015fkilerini de\u011ferlendirmi\u015f bulunmaktay\u0131z.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde yap\u0131sal desenler(structural patterns) kategorisiyle birlikte bir yandan da web aray\u00fcz desenleri kategorisinde de ad\u0131ndan bahsettiren Front Controller Design Pattern \u00fczerine konu\u015fuyor olaca\u011f\u0131z. \u0130\u00e7eri\u011fimiz s\u00fcresince Front Controller Design Pattern nedir? ne ama\u00e7la&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":23163,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,153],"tags":[750,4408,4409,4407],"class_list":["post-23158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-design-pattern","tag-design-pattern","tag-front-controller","tag-front-controller-d-p","tag-front-controller-design-pattern"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=23158"}],"version-history":[{"count":47,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23158\/revisions"}],"predecessor-version":[{"id":23207,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/23158\/revisions\/23207"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/23163"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=23158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=23158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=23158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}