{"id":38541,"date":"2026-02-02T14:41:41","date_gmt":"2026-02-02T11:41:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38541"},"modified":"2026-02-02T14:41:41","modified_gmt":"2026-02-02T11:41:41","slug":"temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/","title":{"rendered":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?"},"content":{"rendered":"<p><body><\/p>\n<p>Angular uygulamalar\u0131nda haritalar olu\u015fturmak, \u00f6zellikle co\u011frafi verileri g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131 etkile\u015fimini sa\u011flamak s\u00f6z konusu oldu\u011funda g\u00fc\u00e7l\u00fc bir yetenektir. Leaflet, bu ama\u00e7la kullanabilece\u011finiz hafif, a\u00e7\u0131k kaynakl\u0131 ve mobil uyumlu bir JavaScript k\u00fct\u00fcphanesidir. \u00d6nceki b\u00f6l\u00fcmlerde Angular ile Leaflet haritalar\u0131n\u0131 nas\u0131l entegre edece\u011fimizi ve temel harita katmanlar\u0131n\u0131 nas\u0131l y\u00f6netece\u011fimizi incelemi\u015ftik. Bu d\u00f6rd\u00fcnc\u00fc b\u00f6l\u00fcmde ise harita \u00fczerindeki \u00e7e\u015fitli \u00e7izimleri (i\u015faretleyiciler, \u00e7izgiler, \u00e7okgenler vb.) y\u00f6netmek i\u00e7in merkezi bir &#8220;\u015eekil Servisi&#8221; (Shape Service) olu\u015fturman\u0131n \u00f6nemini ve nas\u0131l uygulanaca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<p>Harita \u00fczerinde dinamik olarak \u015fekiller eklemek, d\u00fczenlemek veya kald\u0131rmak, genellikle karma\u015f\u0131k mant\u0131k ve yo\u011fun olay i\u015fleme gerektirir. Bu t\u00fcr bir i\u015flevselli\u011fi do\u011frudan bir Angular bile\u015feninde y\u00f6netmek, bile\u015fenin \u015fi\u015fkinle\u015fmesine, kodun tekrar\u0131na ve bak\u0131m zorluklar\u0131na yol a\u00e7abilir. \u0130\u015fte bu noktada, t\u00fcm \u015fekil y\u00f6netimi mant\u0131\u011f\u0131n\u0131 kaps\u00fclleyen ba\u011f\u0131ms\u0131z bir servis devreye girer. Bir Shape Service, harita bile\u015fenlerimizden ba\u011f\u0131ms\u0131z olarak \u015fekilleri y\u00f6netmemizi sa\u011flayarak kodumuzu daha d\u00fczenli, yeniden kullan\u0131labilir ve test edilebilir hale getirir.<\/p>\n<hr>\n<h2>Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?<\/h2>\n<p>Leaflet&#8217;te &#8220;\u015fekil&#8221; terimi, harita \u00fczerinde g\u00f6rsel olarak temsil edilen \u00e7e\u015fitli co\u011frafi nesneleri ifade eder. Bunlar ba\u015fl\u0131ca \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>L.Marker:<\/strong> Belirli bir noktay\u0131 i\u015faretlemek i\u00e7in kullan\u0131l\u0131r (\u00f6rn. konum i\u015faret\u00e7ileri).<\/li>\n<li><strong>L.Polyline:<\/strong> \u0130ki veya daha fazla nokta aras\u0131ndaki bir \u00e7izgiyi temsil eder (\u00f6rn. rotalar, s\u0131n\u0131rlar).<\/li>\n<li><strong>L.Polygon:<\/strong> Kapal\u0131 bir \u015fekli temsil eder (\u00f6rn. b\u00f6lgeler, binalar).<\/li>\n<li><strong>L.Circle \/ L.CircleMarker:<\/strong> Belirli bir merkeze ve yar\u0131\u00e7apa sahip dairesel alanlar\u0131 temsil eder.<\/li>\n<li><strong>L.Rectangle:<\/strong> D\u00f6rt k\u00f6\u015fe noktas\u0131ndan olu\u015fan dikd\u00f6rtgen bir alan\u0131 temsil eder.<\/li>\n<\/ul>\n<p>Bu \u015fekillerin her biri kendi \u00f6zelliklerine, stillerine ve etkile\u015fimlerine sahiptir. Bir Angular uygulamas\u0131nda bu \u015fekilleri y\u00f6netirken kar\u015f\u0131la\u015f\u0131lan zorluklar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Sorumluluklar\u0131n Ayr\u0131m\u0131:<\/strong> Harita bile\u015feni, haritan\u0131n kendisini ve temel \u00f6zelliklerini y\u00f6netmelidir. \u015eekil ekleme, d\u00fczenleme ve kald\u0131rma gibi i\u015flemlerin ayr\u0131 bir serviste olmas\u0131, bile\u015fenin sorumlulu\u011funu azalt\u0131r.<\/li>\n<li><strong>Yeniden Kullan\u0131labilirlik:<\/strong> Farkl\u0131 harita bile\u015fenlerinde veya farkl\u0131 sayfalarda benzer \u015fekil y\u00f6netimi mant\u0131\u011f\u0131na ihtiya\u00e7 duyuldu\u011funda, bir servis bu mant\u0131\u011f\u0131 tekrar tekrar yazmaktan kurtar\u0131r.<\/li>\n<li><strong>Bak\u0131m Kolayl\u0131\u011f\u0131:<\/strong> \u015eekil y\u00f6netimiyle ilgili herhangi bir de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda, bu de\u011fi\u015fikli\u011fin sadece servis i\u00e7inde yap\u0131lmas\u0131 yeterlidir. Bu, hatalar\u0131 azalt\u0131r ve geli\u015ftirmeyi h\u0131zland\u0131r\u0131r.<\/li>\n<li><strong>Merkezi Durum Y\u00f6netimi:<\/strong> Hangi \u015fekillerin haritada oldu\u011funu, hangi \u015feklin se\u00e7ili oldu\u011funu veya hangi \u015feklin d\u00fczenlendi\u011fini merkezi bir \u015fekilde y\u00f6netmek, uygulaman\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Olay \u0130\u015fleme:<\/strong> \u015eekillerin t\u0131klanmas\u0131, s\u00fcr\u00fcklenmesi veya d\u00fczenlenmesi gibi olaylar\u0131 yakalamak ve i\u015flemek i\u00e7in temiz ve tutarl\u0131 bir mekanizma sunar.<\/li>\n<\/ul>\n<p>Bu nedenlerle, bir Shape Service olu\u015fturmak, daha b\u00fcy\u00fck ve karma\u015f\u0131k Angular-Leaflet uygulamalar\u0131nda vazge\u00e7ilmez bir mimari desendir.<\/p>\n<hr>\n<h2>\u015eekil Servisi Yap\u0131s\u0131 ve Uygulanmas\u0131<\/h2>\n<p>\u015eekil servisimiz, Leaflet k\u00fct\u00fcphanesini kullanarak harita \u00fczerinde \u00e7e\u015fitli geometrik \u015fekilleri olu\u015fturacak, y\u00f6netecek ve olaylar\u0131n\u0131 i\u015fleyecek y\u00f6ntemleri i\u00e7erecektir. \u0130lk ad\u0131m olarak, Angular CLI kullanarak bir servis olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">ng generate service services\/shape<\/code><\/pre>\n<p>Bu komut, <code>src\/app\/services\/shape.service.ts<\/code> dosyas\u0131n\u0131 ve ilgili test dosyas\u0131n\u0131 olu\u015fturacakt\u0131r. \u015eimdi <code>shape.service.ts<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini tasarlayal\u0131m:<\/p>\n<h3>\u015eekil Servisi Tan\u0131m\u0131<\/h3>\n<pre><code class=\"language-typescript\">import { Injectable } from '@angular\/core';\nimport * as L from 'leaflet';\nimport { Subject, Observable } from 'rxjs';\n\n\/\/ \u015eekil t\u00fcrlerini tan\u0131mlayal\u0131m\nexport type CustomShape = L.Marker | L.Polyline | L.Polygon | L.Circle | L.Rectangle;\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ShapeService {\n  private drawnShapes: CustomShape[] = []; \/\/ Haritadaki t\u00fcm \u00e7izilmi\u015f \u015fekilleri tutar\n  private shapeClickedSource = new Subject<CustomShape>(); \/\/ T\u0131klanan \u015fekil olaylar\u0131n\u0131 yayar\n  shapeClicked$: Observable<CustomShape> = this.shapeClickedSource.asObservable();\n\n  constructor() { }\n\n  \/<em><\/em>\n   * Haritaya bir i\u015faretleyici (marker) ekler.\n   * @param map Harita nesnesi.\n   * @param latlng \u0130\u015faretleyicinin koordinatlar\u0131.\n   * @param options \u0130\u015faretleyici se\u00e7enekleri.\n   * @returns Eklenen i\u015faretleyici nesnesi.\n   *\/\n  addMarker(map: L.Map, latlng: L.LatLngExpression, options?: L.MarkerOptions): L.Marker {\n    const marker = L.marker(latlng, options);\n    marker.addTo(map);\n    this.drawnShapes.push(marker);\n    this.attachShapeEvents(marker); \/\/ Olay dinleyicilerini ekle\n    return marker;\n  }\n\n  \/<em><\/em>\n   * Haritaya bir \u00e7izgi (polyline) ekler.\n   * @param map Harita nesnesi.\n   * @param latlngs \u00c7izginin koordinatlar\u0131 dizisi.\n   * @param options \u00c7izgi se\u00e7enekleri.\n   * @returns Eklenen \u00e7izgi nesnesi.\n   *\/\n  addPolyline(map: L.Map, latlngs: L.LatLngExpression[], options?: L.PolylineOptions): L.Polyline {\n    const polyline = L.polyline(latlngs, options);\n    polyline.addTo(map);\n    this.drawnShapes.push(polyline);\n    this.attachShapeEvents(polyline);\n    return polyline;\n  }\n\n  \/<em><\/em>\n   * Haritaya bir \u00e7okgen (polygon) ekler.\n   * @param map Harita nesnesi.\n   * @param latlngs \u00c7okgenin koordinatlar\u0131 dizisi.\n   * @param options \u00c7okgen se\u00e7enekleri.\n   * @returns Eklenen \u00e7okgen nesnesi.\n   *\/\n  addPolygon(map: L.Map, latlngs: L.LatLngExpression[], options?: L.PolylineOptions): L.Polygon {\n    const polygon = L.polygon(latlngs, options);\n    polygon.addTo(map);\n    this.drawnShapes.push(polygon);\n    this.attachShapeEvents(polygon);\n    return polygon;\n  }\n\n  \/<em><\/em>\n   * Haritaya bir daire (circle) ekler.\n   * @param map Harita nesnesi.\n   * @param latlng Dairenin merkez koordinatlar\u0131.\n   * @param options Daire se\u00e7enekleri (yar\u0131\u00e7ap dahil).\n   * @returns Eklenen daire nesnesi.\n   *\/\n  addCircle(map: L.Map, latlng: L.LatLngExpression, options?: L.CircleOptions): L.Circle {\n    const circle = L.circle(latlng, options);\n    circle.addTo(map);\n    this.drawnShapes.push(circle);\n    this.attachShapeEvents(circle);\n    return circle;\n  }\n\n  \/<em><\/em>\n   * Haritadan belirli bir \u015fekli kald\u0131r\u0131r.\n   * @param map Harita nesnesi.\n   * @param shape Kald\u0131r\u0131lacak \u015fekil nesnesi.\n   *\/\n  removeShape(map: L.Map, shape: CustomShape): void {\n    map.removeLayer(shape);\n    this.drawnShapes = this.drawnShapes.filter(s => s !== shape);\n  }\n\n  \/<em><\/em>\n   * Haritadaki t\u00fcm \u00e7izilmi\u015f \u015fekilleri kald\u0131r\u0131r.\n   * @param map Harita nesnesi.\n   *\/\n  clearAllShapes(map: L.Map): void {\n    this.drawnShapes.forEach(shape => {\n      map.removeLayer(shape);\n    });\n    this.drawnShapes = [];\n  }\n\n  \/<em><\/em>\n   * Bir \u015fekle temel olay dinleyicilerini ekler.\n   * @param shape Olay dinleyicilerinin eklenece\u011fi \u015fekil.\n   *\/\n  private attachShapeEvents(shape: CustomShape): void {\n    shape.on('click', (event: L.LeafletMouseEvent) => {\n      console.log('Shape clicked:', shape);\n      this.shapeClickedSource.next(shape); \/\/ T\u0131klanan \u015fekli yay\n    });\n\n    \/\/ \u0130ste\u011fe ba\u011fl\u0131 olarak di\u011fer olaylar\u0131 da ekleyebilirsiniz:\n    \/\/ shape.on('mouseover', () => { \/<em> ... <\/em>\/ });\n    \/\/ shape.on('mouseout', () => { \/<em> ... <\/em>\/ });\n  }\n\n  \/<em><\/em>\n   * Mevcut \u00e7izilmi\u015f \u015fekilleri d\u00f6nd\u00fcr\u00fcr.\n   * @returns \u00c7izilmi\u015f \u015fekiller dizisi.\n   *\/\n  getDrawnShapes(): CustomShape[] {\n    return this.drawnShapes;\n  }\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki kodda:<\/p>\n<ul>\n<li><code>CustomShape<\/code> t\u00fcr\u00fc, Leaflet&#8217;teki farkl\u0131 \u015fekil t\u00fcrlerini tek bir tip alt\u0131nda toplar.<\/li>\n<li><code>drawnShapes<\/code> dizisi, servisin y\u00f6netti\u011fi t\u00fcm \u015fekillerin referanslar\u0131n\u0131 tutar. Bu sayede \u015fekiller \u00fczerinde toplu i\u015flemler (temizleme, arama vb.) yap\u0131labilir.<\/li>\n<li><code>shapeClickedSource<\/code> bir RxJS <code>Subject<\/code>&#8216;idir. Bu, harita bile\u015fenlerinin t\u0131klanan \u015fekiller hakk\u0131nda bilgi almas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>addMarker<\/code>, <code>addPolyline<\/code>, <code>addPolygon<\/code>, <code>addCircle<\/code> gibi y\u00f6ntemler, haritaya belirli t\u00fcrde bir \u015fekil eklemek i\u00e7in kullan\u0131l\u0131r ve eklenen \u015fekli <code>drawnShapes<\/code> dizisine kaydeder.<\/li>\n<li><code>removeShape<\/code> ve <code>clearAllShapes<\/code> y\u00f6ntemleri, \u015fekilleri haritadan kald\u0131rmak ve <code>drawnShapes<\/code> dizisinden temizlemek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>attachShapeEvents<\/code> \u00f6zel y\u00f6ntemi, her yeni eklenen \u015fekle temel olay dinleyicilerini (\u00f6rne\u011fin &#8216;click&#8217;) ekler. Bu olaylar, <code>shapeClickedSource<\/code> arac\u0131l\u0131\u011f\u0131yla ilgili bile\u015fenlere yay\u0131nlan\u0131r.<\/li>\n<\/ul>\n<hr>\n<h2>\u015eekil Servisi Kullan\u0131m\u0131 ve Pratik \u00d6rnekler<\/h2>\n<p>\u015eimdi bu servisi bir harita bile\u015feninde nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m. Varsay\u0131msal bir <code>MapComponent<\/code>&#8216;imiz oldu\u011funu ve Leaflet haritas\u0131n\u0131 ba\u015flatt\u0131\u011f\u0131n\u0131 varsayal\u0131m.<\/p>\n<h3>MapComponent&#8217;te Servisi Kullanma<\/h3>\n<pre><code class=\"language-typescript\">\/\/ map.component.ts\nimport { Component, OnInit, OnDestroy, AfterViewInit } from '@angular\/core';\nimport * as L from 'leaflet';\nimport { ShapeService, CustomShape } from '..\/services\/shape.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n  selector: 'app-map',\n  templateUrl: '.\/map.component.html',\n  styleUrls: ['.\/map.component.css']\n})\nexport class MapComponent implements OnInit, AfterViewInit, OnDestroy {\n  private map!: L.Map;\n  private shapeClickSubscription!: Subscription;\n\n  constructor(private shapeService: ShapeService) { }\n\n  ngOnInit(): void {\n    \/\/ Harita t\u0131kland\u0131\u011f\u0131nda veya y\u00fcklendi\u011finde \u015fekilleri eklemek i\u00e7in uygun yer\n  }\n\n  ngAfterViewInit(): void {\n    this.initMap();\n    this.addInitialShapes();\n    this.subscribeToShapeClicks();\n  }\n\n  ngOnDestroy(): void {\n    if (this.shapeClickSubscription) {\n      this.shapeClickSubscription.unsubscribe();\n    }\n    if (this.map) {\n      this.map.remove(); \/\/ Harita kaynaklar\u0131n\u0131 serbest b\u0131rak\n    }\n  }\n\n  private initMap(): void {\n    this.map = L.map('map', {\n      center: [ 39.9334, 32.8597 ], \/\/ Ankara koordinatlar\u0131\n      zoom: 10\n    });\n\n    const tiles = L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      maxZoom: 18,\n      minZoom: 3,\n      attribution: '&copy; <a href=\"http:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a>'\n    });\n\n    tiles.addTo(this.map);\n  }\n\n  private addInitialShapes(): void {\n    \/\/ \u00d6rnek bir i\u015faretleyici ekleyelim\n    this.shapeService.addMarker(this.map, [39.9334, 32.8597], {\n      title: 'Ankara Kalesi',\n      draggable: true,\n      alt: 'Ankara Kalesi'\n    }).bindPopup('<b>Ankara Kalesi<\/b><br>Ba\u015fkentin tarihi simgesi.');\n\n    \/\/ \u00d6rnek bir \u00e7izgi ekleyelim\n    const routeCoordinates: L.LatLngExpression[] = [\n      [39.95, 32.80],\n      [39.90, 32.85],\n      [39.92, 32.90]\n    ];\n    this.shapeService.addPolyline(this.map, routeCoordinates, {\n      color: 'blue',\n      weight: 5,\n      opacity: 0.7\n    }).bindPopup('\u00d6rnek Rota');\n\n    \/\/ \u00d6rnek bir \u00e7okgen ekleyelim\n    const polygonCoordinates: L.LatLngExpression[] = [\n      [39.90, 32.75],\n      [39.88, 32.78],\n      [39.90, 32.82],\n      [39.92, 32.78]\n    ];\n    this.shapeService.addPolygon(this.map, polygonCoordinates, {\n      color: 'red',\n      fillColor: '#f03',\n      fillOpacity: 0.5\n    }).bindPopup('\u00d6rnek B\u00f6lge');\n\n    \/\/ \u00d6rnek bir daire ekleyelim\n    this.shapeService.addCircle(this.map, [39.91, 32.89], {\n      radius: 500, \/\/ metre cinsinden\n      color: 'green',\n      fillColor: '#0f3',\n      fillOpacity: 0.4\n    }).bindPopup('500m Yar\u0131\u00e7apl\u0131 Daire');\n  }\n\n  private subscribeToShapeClicks(): void {\n    this.shapeClickSubscription = this.shapeService.shapeClicked$.subscribe(clickedShape => {\n      console.log('Harita bile\u015feninde t\u0131klanan \u015fekil:', clickedShape);\n      \/\/ T\u0131klanan \u015fekle g\u00f6re UI'da bir \u015feyler yapabiliriz\n      \/\/ \u00d6rne\u011fin, bir panelde \u015feklin \u00f6zelliklerini g\u00f6sterebiliriz.\n      if (clickedShape instanceof L.Marker) {\n        console.log('T\u0131klanan bir i\u015faretleyici:', clickedShape.getLatLng());\n      } else if (clickedShape instanceof L.Polyline) {\n        console.log('T\u0131klanan bir \u00e7izgi veya \u00e7okgen.');\n        \/\/ \u00c7izginin rengini de\u011fi\u015ftirebiliriz\n        clickedShape.setStyle({ color: 'purple', weight: 8 });\n      }\n    });\n  }\n\n  \/\/ Kullan\u0131c\u0131 etkile\u015fimiyle \u015fekil ekleme \u00f6rne\u011fi\n  addCustomMarker(): void {\n    const randomLat = 39.8 + Math.random() * 0.2;\n    const randomLng = 32.7 + Math.random() * 0.3;\n    this.shapeService.addMarker(this.map, [randomLat, randomLng], {\n      title: 'Yeni \u0130\u015faretleyici',\n      icon: L.icon({\n        iconUrl: 'assets\/marker-icon-2x.png', \/\/ Kendi ikonunuzu kullanabilirsiniz\n        iconSize: [25, 41],\n        iconAnchor: [12, 41]\n      })\n    }).bindPopup('Dinamik olarak eklenen i\u015faretleyici');\n  }\n\n  \/\/ T\u00fcm \u015fekilleri temizleme \u00f6rne\u011fi\n  clearMapShapes(): void {\n    this.shapeService.clearAllShapes(this.map);\n    console.log('Haritadaki t\u00fcm \u015fekiller temizlendi.');\n  }\n}\n<\/code><\/pre>\n<pre><code class=\"language-html\"><!-- map.component.html -->\n<div id=\"map\" style=\"height: 500px; width: 100%;\"><\/div>\n<div style=\"margin-top: 10px;\">\n  <button (click)=\"addCustomMarker()\">Rastgele \u0130\u015faretleyici Ekle<\/button>\n  <button (click)=\"clearMapShapes()\">T\u00fcm \u015eekilleri Temizle<\/button>\n<\/div>\n<\/code><\/pre>\n<p>Bu \u00f6rnekte:<\/p>\n<ul>\n<li><code>MapComponent<\/code>, <code>ShapeService<\/code>&#8216;i constructor&#8217;\u0131nda enjekte eder.<\/li>\n<li><code>ngAfterViewInit<\/code> ya\u015fam d\u00f6ng\u00fcs\u00fc kancas\u0131nda harita ba\u015flat\u0131l\u0131r ve ard\u0131ndan <code>addInitialShapes()<\/code> metodu ile \u00f6nceden tan\u0131mlanm\u0131\u015f baz\u0131 \u015fekiller servisi kullanarak haritaya eklenir.<\/li>\n<li><code>subscribeToShapeClicks()<\/code> metodu, servisin <code>shapeClicked$<\/code> Observable&#8217;\u0131na abone olur. Bu sayede, herhangi bir \u015fekle t\u0131kland\u0131\u011f\u0131nda <code>MapComponent<\/code> bilgilendirilir ve t\u0131klanan \u015fekle \u00f6zel i\u015flemler yapabilir (\u00f6rne\u011fin, rengini de\u011fi\u015ftirmek veya detaylar\u0131n\u0131 bir kenar \u00e7ubu\u011funda g\u00f6stermek).<\/li>\n<li><code>addCustomMarker()<\/code> ve <code>clearMapShapes()<\/code> gibi y\u00f6ntemler, kullan\u0131c\u0131 etkile\u015fimleriyle servisin nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><code>ngOnDestroy<\/code> i\u00e7inde aboneliklerin iptal edilmesi ve harita kaynaklar\u0131n\u0131n serbest b\u0131rak\u0131lmas\u0131 \u00f6nemlidir.<\/li>\n<\/ul>\n<hr>\n<h2>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h2>\n<h3>Leaflet.Draw ile Entegrasyon<\/h3>\n<p>E\u011fer kullan\u0131c\u0131lar\u0131n harita \u00fczerinde kendi \u015fekillerini \u00e7izmesine izin vermek istiyorsan\u0131z, <a href=\"https:\/\/leaflet.github.io\/Leaflet.draw\/docs\/leaflet-draw-latest.html\" target=\"_blank\">Leaflet.Draw<\/a> eklentisini kullanabilirsiniz. Shape Service&#8217;imiz do\u011frudan \u00e7izim ara\u00e7lar\u0131n\u0131 sa\u011flamasa da, Leaflet.Draw taraf\u0131ndan \u00e7izilen \u015fekilleri y\u00f6netmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Leaflet.Draw&#8217;\u0131n <code>draw:created<\/code> olay\u0131n\u0131 dinleyerek olu\u015fturulan \u015fekilleri Shape Service&#8217;e ekleyebilir ve b\u00f6ylece merkezi y\u00f6netimden faydalanabilirsiniz.<\/p>\n<pre><code class=\"language-typescript\">\/\/ MapComponent i\u00e7inde veya ayr\u0131 bir DrawingService i\u00e7inde\nthis.map.on(L.Draw.Event.CREATED, (event: any) => {\n  const layer = event.layer;\n  \/\/ Burada layer'\u0131 uygun \u015fekilde ShapeService'e ekleyebilirsiniz\n  if (layer instanceof L.Marker) {\n      this.shapeService.addMarker(this.map, layer.getLatLng(), layer.options);\n  } else if (layer instanceof L.Polyline) {\n      this.shapeService.addPolyline(this.map, layer.getLatLngs() as L.LatLngExpression[], layer.options);\n  } \/\/ Di\u011fer \u015fekil t\u00fcrleri i\u00e7in de benzer \u015fekilde devam edilebilir\n  layer.addTo(this.map); \/\/ Leaflet.Draw otomatik ekler, bu sat\u0131r gerekli olmayabilir\n  console.log('Yeni \u015fekil \u00e7izildi:', layer);\n});\n<\/code><\/pre>\n<h3>\u015eekilleri Kal\u0131c\u0131 Hale Getirme (Persistence)<\/h3>\n<p>\u00c7izilen veya eklenen \u015fekilleri bir veritaban\u0131nda saklamak ve daha sonra y\u00fcklemek, bir\u00e7ok harita uygulamas\u0131n\u0131n temel gereksinimidir. \u015eekilleri genellikle GeoJSON format\u0131nda saklamak en yayg\u0131n yakla\u015f\u0131md\u0131r. Leaflet, her \u015feklin <code>toGeoJSON()<\/code> metodunu sunar.<\/p>\n<pre><code class=\"language-typescript\">\/\/ ShapeService i\u00e7inde yeni bir metod\nexport class ShapeService {\n  \/\/ ... di\u011fer metotlar ...\n\n  \/<em><\/em>\n   * T\u00fcm \u00e7izilmi\u015f \u015fekilleri GeoJSON format\u0131nda d\u00f6nd\u00fcr\u00fcr.\n   * @returns FeatureCollection GeoJSON nesnesi.\n   *\/\n  getShapesAsGeoJSON(): GeoJSON.FeatureCollection {\n    const features: GeoJSON.Feature[] = [];\n    this.drawnShapes.forEach(shape => {\n      if (shape.toGeoJSON) { \/\/ toGeoJSON metodunun varl\u0131\u011f\u0131n\u0131 kontrol et\n        const geoJsonFeature = shape.toGeoJSON();\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131 olarak \u00f6zellikler ekleyebilirsiniz\n        \/\/ geoJsonFeature.properties = { ... };\n        features.push(geoJsonFeature);\n      }\n    });\n    return {\n      type: 'FeatureCollection',\n      features: features\n    };\n  }\n\n  \/<em><\/em>\n   * GeoJSON verilerinden haritaya \u015fekiller ekler.\n   * @param map Harita nesnesi.\n   * @param geojsonData GeoJSON FeatureCollection nesnesi.\n   *\/\n  addShapesFromGeoJSON(map: L.Map, geojsonData: GeoJSON.FeatureCollection): void {\n    L.geoJSON(geojsonData, {\n      onEachFeature: (feature, layer) => {\n        \/\/ Her GeoJSON \u00f6zelli\u011fini Leaflet katman\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\n        \/\/ ve ShapeService taraf\u0131ndan y\u00f6netilmesini sa\u011flar.\n        if (layer instanceof L.Marker) {\n          this.addMarker(map, layer.getLatLng(), layer.options);\n        } else if (layer instanceof L.Polyline) { \/\/ Hem Polyline hem Polygon i\u00e7in ge\u00e7erli\n          this.addPolyline(map, layer.getLatLngs() as L.LatLngExpression[], layer.options);\n        } else if (layer instanceof L.Polygon) {\n            this.addPolygon(map, layer.getLatLngs() as L.LatLngExpression[], layer.options);\n        }\n        \/\/ Daha karma\u015f\u0131k senaryolarda L.geoJSON'un kendisi yeterli olabilir,\n        \/\/ ancak ShapeService'in 'drawnShapes' listesine eklemek i\u00e7in bu yakla\u015f\u0131m tercih edilebilir.\n      }\n    }).addTo(map);\n  }\n}\n<\/code><\/pre>\n<h3>Tip G\u00fcvenli\u011fi ve Aray\u00fczler<\/h3>\n<p>Leaflet&#8217;in se\u00e7enek nesneleri (<code>MarkerOptions<\/code>, <code>PolylineOptions<\/code> vb.) zaten iyi tan\u0131mlanm\u0131\u015ft\u0131r. Ancak, kendi \u00f6zel \u015fekil \u00f6zelliklerinizi veya meta verilerinizi saklamak isterseniz, bu t\u00fcr se\u00e7enekler i\u00e7in \u00f6zel TypeScript aray\u00fczleri olu\u015fturmak kodunuzu daha tip g\u00fcvenli hale getirir.<\/p>\n<hr>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehberde, Angular ve Leaflet ile haritalarda \u015fekil y\u00f6netimini merkezile\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc bir Shape Service&#8217;in nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 detayl\u0131ca inceledik. Bu servis sayesinde, harita bile\u015fenlerimiz daha temiz, daha odakl\u0131 hale gelirken, \u015fekil ekleme, kald\u0131rma ve olay i\u015fleme mant\u0131\u011f\u0131 yeniden kullan\u0131labilir ve bak\u0131m\u0131 kolay bir birimde kaps\u00fcllenmi\u015f olur. RxJS Subject&#8217;ler kullanarak bile\u015fenler aras\u0131 ileti\u015fimi sa\u011flamak, modern Angular uygulamalar\u0131nda yayg\u0131n ve etkili bir yakla\u015f\u0131md\u0131r. GeoJSON entegrasyonu gibi geli\u015fmi\u015f konular, uygulamalar\u0131n\u0131z\u0131n kapsam\u0131n\u0131 geni\u015fletmenize olanak tan\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>Neden \u015fekilleri do\u011frudan harita bile\u015feninde ekleyip y\u00f6netmiyorum?<\/strong><\/p>\n<p>Do\u011frudan bile\u015fende y\u00f6netmek, basit uygulamalar i\u00e7in yeterli olabilir. Ancak uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, bile\u015feniniz \u015fi\u015fkinle\u015fir, sorumluluklar\u0131 artar ve kodun bak\u0131m\u0131 zorla\u015f\u0131r. Bir servis kullanmak, sorumluluklar\u0131n ayr\u0131lmas\u0131n\u0131 sa\u011flar, kodu daha mod\u00fcler, yeniden kullan\u0131labilir ve test edilebilir hale getirir.<\/p>\n<\/li>\n<li>\n        <strong>Farkl\u0131 \u015fekil t\u00fcrlerini tek bir serviste nas\u0131l y\u00f6netebilirim?<\/strong><\/p>\n<p><code>CustomShape<\/code> gibi bir birle\u015fim tipi (union type) kullanarak farkl\u0131 Leaflet \u015fekil t\u00fcrlerini tek bir dizide saklayabilirsiniz. Her \u015fekil t\u00fcr\u00fc i\u00e7in ayr\u0131 <code>addXxx<\/code> metotlar\u0131 tan\u0131mlayarak API&#8217;yi temiz tutars\u0131n\u0131z. Olay i\u015fleme s\u0131ras\u0131nda <code>instanceof<\/code> operat\u00f6r\u00fcn\u00fc kullanarak \u015feklin t\u00fcr\u00fcn\u00fc belirleyebilir ve ona g\u00f6re i\u015flem yapabilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>\u015eekilleri nas\u0131l etkile\u015fimli hale getirebilirim (t\u0131klama, s\u00fcr\u00fckleme vb.)?<\/strong><\/p>\n<p>Leaflet \u015fekillerinin <code>.on('event', callback)<\/code> metodu bulunur. Shape Service i\u00e7inde <code>attachShapeEvents<\/code> gibi bir metot ile bu olay dinleyicilerini \u015fekillere ekleyebilirsiniz. T\u0131klama gibi olaylar\u0131 bir RxJS <code>Subject<\/code> arac\u0131l\u0131\u011f\u0131yla bile\u015fenlere yay\u0131nlayarak, bile\u015fenlerin bu olaylara abone olmas\u0131n\u0131 ve tepki vermesini sa\u011flayabilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>Bu servisi ba\u015fka harita k\u00fct\u00fcphaneleriyle (\u00f6rne\u011fin Google Maps) kullanabilir miyim?<\/strong><\/p>\n<p>Hay\u0131r, bu Shape Service tamamen Leaflet k\u00fct\u00fcphanesine \u00f6zg\u00fcd\u00fcr. Leaflet&#8217;in kendi API&#8217;sini (<code>L.marker<\/code>, <code>L.polyline<\/code> vb.) kullan\u0131r. Google Maps veya OpenLayers gibi ba\u015fka bir harita k\u00fct\u00fcphanesi kullan\u0131yorsan\u0131z, o k\u00fct\u00fcphanenin API&#8217;sine uygun benzer bir servis olu\u015fturman\u0131z gerekir.<\/p>\n<\/li>\n<li>\n        <strong>\u00c7izilen \u015fekilleri nas\u0131l kal\u0131c\u0131 hale getirebilirim (veritaban\u0131na kaydetme)?<\/strong><\/p>\n<p>\u015eekilleri kal\u0131c\u0131 hale getirmek i\u00e7in genellikle GeoJSON format\u0131 kullan\u0131l\u0131r. Leaflet&#8217;teki \u00e7o\u011fu \u015fekil, kendi durumlar\u0131n\u0131 GeoJSON format\u0131na d\u00f6n\u00fc\u015ft\u00fcren bir <code>toGeoJSON()<\/code> metoduna sahiptir. Bu GeoJSON verilerini bir sunucuya g\u00f6nderebilir ve bir veritaban\u0131nda saklayabilirsiniz. Uygulama y\u00fcklendi\u011finde, veritaban\u0131ndan GeoJSON verilerini al\u0131p <code>L.geoJSON()<\/code> metodu veya \u00f6zel olarak yaz\u0131lm\u0131\u015f <code>addShapesFromGeoJSON<\/code> metodu arac\u0131l\u0131\u011f\u0131yla tekrar haritaya ekleyebilirsiniz.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Angular uygulamalar\u0131nda haritalar olu\u015fturmak, \u00f6zellikle co\u011frafi verileri g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131 etkile\u015fimini sa\u011flamak s\u00f6z konusu ol","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-38541","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?\" \/>\n<meta property=\"og:description\" content=\"Angular uygulamalar\u0131nda haritalar olu\u015fturmak, \u00f6zellikle co\u011frafi verileri g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131 etkile\u015fimini sa\u011flamak s\u00f6z konusu ol\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-02T11:41:41+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?\",\"datePublished\":\"2026-02-02T11:41:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\"},\"wordCount\":1484,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\",\"name\":\"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-02T11:41:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/","og_locale":"tr_TR","og_type":"article","og_title":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?","og_description":"Angular uygulamalar\u0131nda haritalar olu\u015fturmak, \u00f6zellikle co\u011frafi verileri g\u00f6rselle\u015ftirmek ve kullan\u0131c\u0131 etkile\u015fimini sa\u011flamak s\u00f6z konusu ol","og_url":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-02T11:41:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?","datePublished":"2026-02-02T11:41:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/"},"wordCount":1484,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/","url":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/","name":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-02T11:41:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/temel-konseptler-ve-neden-bir-sekil-servisine-ihtiyac-duyariz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Temel Konseptler ve Neden Bir \u015eekil Servisine \u0130htiya\u00e7 Duyar\u0131z?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38541","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38541"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38541\/revisions"}],"predecessor-version":[{"id":38542,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38541\/revisions\/38542"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38541"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38541"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38541"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}