{"id":37822,"date":"2026-01-16T11:30:55","date_gmt":"2026-01-16T08:30:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/"},"modified":"2026-01-16T11:30:55","modified_gmt":"2026-01-16T08:30:55","slug":"symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/","title":{"rendered":"Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde"},"content":{"rendered":"<h2>Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde<\/h2>\n<p>Symfony&#8217;nin servis konteyneri, uygulamalar\u0131n\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar. Bu mekanizman\u0131n kalbinde yer alan servis etiketleri (service tags), servislerinizi belirli gruplara ay\u0131rman\u0131za, dinamik olarak toplaman\u0131za ve farkl\u0131 davran\u0131\u015flar sergilemelerini sa\u011flaman\u0131za olanak tan\u0131r. Bu makalede, Symfony 7.4 ile etiketlerin temel kullan\u0131mlar\u0131n\u0131n \u00f6tesine ge\u00e7erek, uygulaman\u0131z\u0131n esnekli\u011fini ve geni\u015fletilebilirli\u011fini art\u0131racak ileri d\u00fczey teknikleri ke\u015ffedece\u011fiz.<\/p>\n<h3>Servis Etiketlerine Genel Bak\u0131\u015f ve Neden Geli\u015fmi\u015f Kullan\u0131m?<\/h3>\n<p>Servis etiketleri, Symfony&#8217;nin ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu konteynerindeki servisleri kategorize etmek ve daha sonra bu kategorilere g\u00f6re i\u015flem yapmak i\u00e7in kullan\u0131lan basit ama g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Temelde, bir servise bir veya daha fazla etiket atayarak, o servisin belirli bir rol\u00fc oldu\u011funu veya belirli bir grup i\u00e7inde yer ald\u0131\u011f\u0131n\u0131 belirtirsiniz.<\/p>\n<h4>Temel Etiketleme Mekanizmas\u0131<\/h4>\n<p>Bir servisi etiketlemek, genellikle <code>services.yaml<\/code> dosyas\u0131nda yap\u0131lan basit bir konfig\u00fcrasyonla ger\u00e7ekle\u015fir. Bir servise bir etiket atad\u0131\u011f\u0131n\u0131zda, Symfony bu servisi ilgili etiketle i\u015faretler ve daha sonra bu etikete sahip t\u00fcm servisleri kolayca bulman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    App\\Service\\MyLogger:\n        tags: ['app.logger']\n\n    App\\Service\\AnotherLogger:\n        tags:\n            - { name: 'app.logger', priority: 100 }<\/pre>\n<p><\/code><\/p>\n<h4>Etiketlerin Sa\u011flad\u0131\u011f\u0131 Esneklik<\/h4>\n<p>Etiketler, uygulaman\u0131z\u0131n bile\u015fenleri aras\u0131nda gev\u015fek bir ba\u011f (loose coupling) olu\u015fturman\u0131n anahtar\u0131d\u0131r. \u00d6rne\u011fin, bir \"veri toplay\u0131c\u0131\" aray\u00fcz\u00fcn\u00fc uygulayan birden fazla servisiniz varsa, her birine <code>app.data_collector<\/code> etiketi atayabilir ve daha sonra bu etiketli t\u00fcm servisleri tek bir noktadan toplay\u0131p i\u015fleyebilirsiniz. Bu, yeni bir toplay\u0131c\u0131 ekledi\u011finizde mevcut kodu de\u011fi\u015ftirmek zorunda kalmaman\u0131z anlam\u0131na gelir.<\/p>\n<h4>Neden Temellerin \u00d6tesine Ge\u00e7meliyiz?<\/h4>\n<p>Temel etiketleme, bir\u00e7ok senaryo i\u00e7in yeterli olsa da, Symfony'nin servis konteynerinin ger\u00e7ek g\u00fcc\u00fc, etiketlerin nitelikleri (attributes) ve <code>Compiler Pass<\/code>'ler ile birle\u015fti\u011finde ortaya \u00e7\u0131kar. Bu ileri d\u00fczey teknikler, daha karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131 olu\u015fturman\u0131za, servislerin davran\u0131\u015flar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmenize ve uygulaman\u0131z\u0131n mimarisini daha mod\u00fcler hale getirmenize olanak tan\u0131r.<\/p>\n<h3>\u00d6zel Etiket Nitelikleri (Custom Tag Attributes)<\/h3>\n<p>Servis etiketleri sadece bir isimden ibaret de\u011fildir; onlara \u00f6zel nitelikler ekleyerek daha fazla meta veri ta\u015f\u0131yabilirler. Bu nitelikler, etiketli servisleri i\u015flerken ek bilgiler sa\u011flamak i\u00e7in kullan\u0131l\u0131r ve etiketlerin esnekli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h4>Niteliklerin Tan\u0131mlanmas\u0131<\/h4>\n<p>Bir etikete nitelik eklemek, YAML konfig\u00fcrasyonunda anahtar-de\u011fer \u00e7iftleri kullanarak yap\u0131l\u0131r. \u00d6rne\u011fin, bir <code>app.command<\/code> etiketine <code>command_name<\/code> ve <code>description<\/code> gibi nitelikler ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    App\\Command\\MyCustomCommand:\n        tags:\n            - { name: 'app.command', command_name: 'my:custom:command', description: '\u00d6zel komutumu \u00e7al\u0131\u015ft\u0131r\u0131r.' }<\/pre>\n<p><\/code><\/p>\n<h4>Niteliklere Eri\u015fim ve Kullan\u0131m Senaryolar\u0131<\/h4>\n<p>Bu niteliklere, genellikle bir <code>Compiler Pass<\/code> i\u00e7inde eri\u015filir. Nitelikler, etiketli servislerin nas\u0131l i\u015flenece\u011fi veya hangi ko\u015fullar alt\u0131nda kullan\u0131laca\u011f\u0131 hakk\u0131nda bilgi sa\u011flayabilir. \u00d6rne\u011fin, bir komut etiketine ekledi\u011finiz <code>command_name<\/code> niteli\u011fini kullanarak, bu komutu Symfony konsoluna otomatik olarak kaydedebilirsiniz.<\/p>\n<h4>\u00d6rnek: Bir \"Strateji\" Deseni Uygulamas\u0131<\/h4>\n<p>Farkl\u0131 \u00f6deme y\u00f6ntemlerini (kredi kart\u0131, PayPal, havale) temsil eden servisleriniz oldu\u011funu varsayal\u0131m. Her bir \u00f6deme y\u00f6ntemine <code>app.payment_strategy<\/code> etiketi verebilir ve <code>type<\/code> niteli\u011fi ile hangi \u00f6deme y\u00f6ntemini temsil etti\u011fini belirtebilirsiniz.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    App\\Payment\\CreditCardStrategy:\n        tags: [{ name: 'app.payment_strategy', type: 'credit_card' }]\n    App\\Payment\\PaypalStrategy:\n        tags: [{ name: 'app.payment_strategy', type: 'paypal' }]<\/pre>\n<p><\/code><br \/>\nDaha sonra bir <code>PaymentStrategyResolver<\/code> servisi, bu etiketli servisleri toplayarak <code>type<\/code> niteli\u011fine g\u00f6re do\u011fru stratejiyi se\u00e7ebilir.<\/p>\n<h3>Compiler Pass'ler ile Etiket G\u00fcc\u00fcn\u00fc Ortaya \u00c7\u0131karmak<\/h3>\n<p><code>Compiler Pass<\/code>'ler, Symfony servis konteyneri derlenirken \u00e7al\u0131\u015fan \u00f6zel s\u0131n\u0131flard\u0131r. Bu pass'ler, servis tan\u0131mlamalar\u0131n\u0131 de\u011fi\u015ftirmek, yeni servisler eklemek veya mevcut servisleri kald\u0131rmak i\u00e7in kullan\u0131l\u0131r. Etiketli servisleri toplama ve i\u015fleme yetene\u011fi, <code>Compiler Pass<\/code>'leri ileri d\u00fczey etiket kullan\u0131m\u0131n\u0131n temel ta\u015f\u0131 yapar.<\/p>\n<h4>Compiler Pass Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h4>\n<p>Bir <code>Compiler Pass<\/code>, <code>Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface<\/code> aray\u00fcz\u00fcn\u00fc uygulayan bir PHP s\u0131n\u0131f\u0131d\u0131r. <code>process()<\/code> metodu i\u00e7inde, <code>ContainerBuilder<\/code> nesnesine eri\u015fiminiz olur. Bu nesne, uygulaman\u0131z\u0131n t\u00fcm servis tan\u0131mlamalar\u0131n\u0131 ve parametrelerini i\u00e7erir.<\/p>\n<pre><code class=\"language-php\">\/\/ src\/DependencyInjection\/Compiler\/MyCustomCompilerPass.php\nnamespace App\\DependencyInjection\\Compiler;\n\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\n\nclass MyCustomCompilerPass implements CompilerPassInterface\n{\n    public function process(ContainerBuilder $container): void\n    {\n        \/\/ Burada servisleri i\u015fleme mant\u0131\u011f\u0131 yer alacak\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu pass'i kaydetmek i\u00e7in <code>src\/Kernel.php<\/code> dosyas\u0131nda <code>build()<\/code> metodunu kullanman\u0131z gerekir:<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Kernel.php\n\/\/ ...\nuse App\\DependencyInjection\\Compiler\\MyCustomCompilerPass;\n\nclass Kernel extends BaseKernel\n{\n    \/\/ ...\n    protected function build(ContainerBuilder $container): void\n    {\n        $container->addCompilerPass(new MyCustomCompilerPass());\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h4>Etiketli Servisleri Toplama<\/h4>\n<p><code>Compiler Pass<\/code> i\u00e7inde, <code>ContainerBuilder<\/code> nesnesinin <code>findTaggedServiceIds()<\/code> metodunu kullanarak belirli bir etikete sahip t\u00fcm servislerin ID'lerini alabilirsiniz. Bu metod, servis ID'leri ve etiket niteliklerini i\u00e7eren bir dizi d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-php\">\/\/ Inside MyCustomCompilerPass::process()\nif (!$container->hasDefinition('app.main_service_collector')) {\n    return;\n}\n\n$collectorDefinition = $container->getDefinition('app.main_service_collector');\n$taggedServices = $container->findTaggedServiceIds('app.data_collector');\n\nforeach ($taggedServices as $id => $tags) {\n    \/\/ $id: Servisin ID'si (\u00f6rne\u011fin 'App\\Service\\MyDataCollector')\n    \/\/ $tags: Bu servise atanm\u0131\u015f 'app.data_collector' etiketlerinin bir dizisi,\n    \/\/       her etiket kendi nitelikleriyle birlikte (\u00f6rne\u011fin ['priority' => 100])\n    \n    \/\/ Burada servisleri i\u015fleyebiliriz\n    $collectorDefinition->addMethodCall('addCollector', [new Reference($id)]);\n}<\/pre>\n<p><\/code><\/p>\n<h4>Toplanan Servisleri \u0130\u015fleme ve Kay\u0131t<\/h4>\n<p>Toplad\u0131\u011f\u0131n\u0131z etiketli servisleri, ba\u015fka bir servise (\u00f6rne\u011fin bir \"toplay\u0131c\u0131\" servisi) enjekte edebilir veya onlar\u0131n davran\u0131\u015flar\u0131n\u0131 de\u011fi\u015ftirebilirsiniz. Yukar\u0131daki \u00f6rnekte, <code>app.main_service_collector<\/code> adl\u0131 bir servise, her bir <code>app.data_collector<\/code> etiketli servisi <code>addCollector<\/code> metodu arac\u0131l\u0131\u011f\u0131yla ekliyoruz. Bu, \"strateji\" veya \"dekorat\u00f6r\" desenlerini uygulamak i\u00e7in yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>\u00d6rnek: \u00d6zel Bir Veri Toplay\u0131c\u0131 Sistemi<\/h4>\n<p>Bir web uygulamas\u0131nda \u00e7e\u015fitli metrikleri toplayan servisleriniz oldu\u011funu d\u00fc\u015f\u00fcn\u00fcn. Her bir metrik toplay\u0131c\u0131ya <code>app.metric_collector<\/code> etiketi vererek, bunlar\u0131 merkezi bir <code>MetricAggregator<\/code> servisine otomatik olarak kaydetmek i\u00e7in bir <code>Compiler Pass<\/code> kullanabilirsiniz.<\/p>\n<pre><code class=\"language-php\">\/\/ src\/Service\/MetricAggregator.php\nnamespace App\\Service;\n\nclass MetricAggregator\n{\n    private array $collectors = [];\n\n    public function addCollector(MetricCollectorInterface $collector): void\n    {\n        $this->collectors[] = $collector;\n    }\n\n    public function collectAll(): array\n    {\n        $data = [];\n        foreach ($this->collectors as $collector) {\n            $data[$collector->getName()] = $collector->collect();\n        }\n        return $data;\n    }\n}\n\n\/\/ src\/DependencyInjection\/Compiler\/MetricCollectorPass.php\nnamespace App\\DependencyInjection\\Compiler;\n\nuse Symfony\\Component\\DependencyInjection\\Compiler\\CompilerPassInterface;\nuse Symfony\\Component\\DependencyInjection\\ContainerBuilder;\nuse Symfony\\Component\\DependencyInjection\\Reference;\n\nclass MetricCollectorPass implements CompilerPassInterface\n{\n    public function process(ContainerBuilder $container): void\n    {\n        if (!$container->hasDefinition(MetricAggregator::class)) {\n            return;\n        }\n\n        $aggregatorDefinition = $container->getDefinition(MetricAggregator::class);\n        $taggedServices = $container->findTaggedServiceIds('app.metric_collector');\n\n        foreach ($taggedServices as $id => $tags) {\n            $aggregatorDefinition->addMethodCall('addCollector', [new Reference($id)]);\n        }\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h3>Etiketlerle Servisleri \u00d6nceliklendirme<\/h3>\n<p>Baz\u0131 durumlarda, etiketli servislerin belirli bir s\u0131rada i\u015flenmesi gerekebilir. Symfony, etiketlere <code>priority<\/code> niteli\u011fi ekleyerek bu t\u00fcr s\u0131ralama ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131laman\u0131za olanak tan\u0131r.<\/p>\n<h4>\"priority\" Niteli\u011fi Kullan\u0131m\u0131<\/h4>\n<p><code>priority<\/code> niteli\u011fi, bir etikete say\u0131sal bir de\u011fer ataman\u0131z\u0131 sa\u011flar. Y\u00fcksek <code>priority<\/code> de\u011ferine sahip servisler, d\u00fc\u015f\u00fck de\u011fere sahip olanlardan \u00f6nce i\u015flenir. Varsay\u0131lan <code>priority<\/code> de\u011feri 0'd\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    App\\EventSubscriber\\HighPrioritySubscriber:\n        tags: [{ name: 'kernel.event_subscriber', priority: 200 }]\n    App\\EventSubscriber\\LowPrioritySubscriber:\n        tags: [{ name: 'kernel.event_subscriber', priority: 50 }]<\/pre>\n<p><\/code><\/p>\n<h4>S\u0131ralama Mekanizmalar\u0131<\/h4>\n<p><code>Compiler Pass<\/code> i\u00e7inde etiketli servisleri toplad\u0131\u011f\u0131n\u0131zda, <code>findTaggedServiceIds()<\/code> metodu size servis ID'lerini ve etiket niteliklerini verir. Bu verileri kullanarak, servisleri <code>priority<\/code> niteli\u011fine g\u00f6re manuel olarak s\u0131ralayabilirsiniz. Symfony'nin kendi bile\u015fenleri (\u00f6rne\u011fin olay dinleyicileri) bu s\u0131ralamay\u0131 otomatik olarak yapar.<\/p>\n<pre><code class=\"language-php\">\/\/ Compiler Pass i\u00e7inde s\u0131ralama \u00f6rne\u011fi\n$taggedServices = $container->findTaggedServiceIds('app.ordered_service');\n\n\/\/ Servisleri priority'ye g\u00f6re s\u0131rala (y\u00fcksekten d\u00fc\u015f\u00fc\u011fe)\nuasort($taggedServices, function ($a, $b) {\n    $priorityA = $a[0]['priority'] ?? 0;\n    $priorityB = $b[0]['priority'] ?? 0;\n    return $priorityB <=> $priorityA; \/\/ Y\u00fcksek \u00f6ncelik \u00f6nce gelir\n});\n\nforeach ($taggedServices as $id => $tags) {\n    \/\/ S\u0131ralanm\u0131\u015f servisleri i\u015fleyin\n}<\/pre>\n<p><\/code><\/p>\n<h4>Uygulama Alanlar\u0131: Olay Dinleyicileri ve Middleware<\/h4>\n<p><code>priority<\/code> niteli\u011fi, \u00f6zellikle olay dinleyicileri (<code>kernel.event_listener<\/code> veya <code>kernel.event_subscriber<\/code>) ve middleware benzeri yap\u0131lar i\u00e7in kritik \u00f6neme sahiptir. Hangi dinleyicinin \u00f6nce \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirlemek, uygulaman\u0131z\u0131n davran\u0131\u015f\u0131n\u0131 hassas bir \u015fekilde kontrol etmenizi sa\u011flar.<\/p>\n<h3>Dinamik Etiketleme ve Otomatik Konfig\u00fcrasyon<\/h3>\n<p>Symfony'nin otomatik konfig\u00fcrasyon (autoconfiguration) \u00f6zelli\u011fi, servislerinizi manuel olarak etiketlemek zorunda kalmadan, belirli ko\u015fullara g\u00f6re otomatik olarak etiketlemenizi sa\u011flar. Bu, \u00f6zellikle bir\u00e7ok benzer servise sahip oldu\u011funuzda geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r.<\/p>\n<h4>Autoconfigure ve Autowire ile Etiketleme<\/h4>\n<p><code>services.yaml<\/code> dosyas\u0131nda <code>_defaults<\/code> alt\u0131nda <code>autoconfigure: true<\/code> ayar\u0131n\u0131 etkinle\u015ftirdi\u011finizde, Symfony belirli aray\u00fczleri uygulayan veya belirli bir temel s\u0131n\u0131ftan t\u00fcreyen servisleri otomatik olarak etiketleyebilir. \u00d6rne\u011fin, <code>EventSubscriberInterface<\/code> uygulayan t\u00fcm s\u0131n\u0131flar otomatik olarak <code>kernel.event_subscriber<\/code> etiketiyle etiketlenir.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    _defaults:\n        autowire: true      # Otomatik ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu\n        autoconfigure: true # Otomatik etiketleme ve konfig\u00fcrasyon\n        public: false\n\n    App\\:\n        resource: '..\/src\/'\n        exclude: '..\/src\/{DependencyInjection,Entity,Kernel.php}'<\/pre>\n<p><\/code><\/p>\n<h4>\u00d6zel Etiketlere Otomatik Atama<\/h4>\n<p>Kendi \u00f6zel etiketlerinizi otomatik olarak atamak i\u00e7in <code>config\/services.yaml<\/code> i\u00e7inde <code>_instanceof<\/code> b\u00f6l\u00fcm\u00fcn\u00fc kullanabilirsiniz. Bu, belirli bir aray\u00fcz\u00fc uygulayan veya bir temel s\u0131n\u0131ftan t\u00fcreyen t\u00fcm servislere otomatik olarak bir etiket ve hatta \u00f6zel nitelikler ataman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    _defaults:\n        autoconfigure: true\n        autowire: true\n\n    App\\Payment\\:\n        resource: '..\/src\/Payment'\n        tags: ['app.payment_strategy'] # T\u00fcm Payment servislerine bu etiketi ver\n\n    App\\Payment\\PaymentStrategyInterface:\n        _instanceof:\n            App\\Payment\\CreditCardStrategy:\n                tags: [{ name: 'app.payment_strategy', type: 'credit_card' }]\n            App\\Payment\\PaypalStrategy:\n                tags: [{ name: 'app.payment_strategy', type: 'paypal' }]<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte, <code>PaymentStrategyInterface<\/code> uygulayan s\u0131n\u0131flara <code>app.payment_strategy<\/code> etiketi atan\u0131r. <code>_instanceof<\/code> ile daha spesifik s\u0131n\u0131flar i\u00e7in \u00f6zel niteliklere sahip etiketler de tan\u0131mlanabilir.<\/p>\n<h4>Dinamik Etiketleme Senaryolar\u0131<\/h4>\n<p>Dinamik etiketleme, \u00f6zellikle bir paketin veya mod\u00fcl\u00fcn kendi i\u00e7inde belirli servis t\u00fcrlerini y\u00f6netmesi gerekti\u011finde kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, bir CMS paketi, kendi \"widget\" servislerini <code>app.widget<\/code> etiketiyle otomatik olarak etiketleyebilir ve bu widget'lar\u0131 bir aray\u00fcz \u00fczerinden y\u00f6netebilir.<\/p>\n<h3>Etiketler Arac\u0131l\u0131\u011f\u0131yla Servisleri Dekore Etme<\/h3>\n<p>Servis dekorasyonu, mevcut bir servisin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek veya geni\u015fletmek i\u00e7in yeni bir servis olu\u015fturman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc bir Symfony \u00f6zelli\u011fidir. Etiketler, dekorasyon s\u00fcrecinde hangi servislerin dekore edilece\u011fini veya belirli dekorat\u00f6rlerin ne zaman uygulanaca\u011f\u0131n\u0131 belirlemek i\u00e7in kullan\u0131labilir.<\/p>\n<h4>Dekorasyon Mekanizmas\u0131 ve Etiketler<\/h4>\n<p>Bir servisi dekore etmek i\u00e7in, yeni servisinizi tan\u0131mlarken <code>decorates<\/code> niteli\u011fini kullan\u0131rs\u0131n\u0131z. Bu nitelik, hangi servisin dekore edilece\u011fini belirtir. Etiketler, belirli bir etikete sahip t\u00fcm servisleri dekore etmek i\u00e7in do\u011frudan kullan\u0131lmasa da, bir <code>Compiler Pass<\/code> i\u00e7inde etiketli servisleri toplay\u0131p onlara \u00f6zel dekorat\u00f6rler atayarak dolayl\u0131 yoldan kullan\u0131labilir.<\/p>\n<pre><code class=\"language-yaml\"># config\/services.yaml\nservices:\n    App\\Service\\MyService:\n        # ...\n\n    App\\Service\\MyServiceDecorator:\n        decorates: App\\Service\\MyService\n        arguments: ['@.inner'] # Orijinal servisi enjekte eder\n        public: false<\/pre>\n<p><\/code><\/p>\n<h4>Etiketli Servisleri Dekore Etme Yakla\u015f\u0131mlar\u0131<\/h4>\n<p>En yayg\u0131n yakla\u015f\u0131m, bir <code>Compiler Pass<\/code> kullanarak belirli bir etikete sahip t\u00fcm servisleri bulmak ve her biri i\u00e7in dinamik olarak bir dekorat\u00f6r tan\u0131mlamas\u0131 olu\u015fturmakt\u0131r. Bu, ayn\u0131 t\u00fcrdeki bir\u00e7ok servise ayn\u0131 dekorasyon mant\u0131\u011f\u0131n\u0131 uygulamak istedi\u011finizde \u00e7ok etkilidir.<\/p>\n<pre><code class=\"language-php\">\/\/ Compiler Pass i\u00e7inde dinamik dekorasyon \u00f6rne\u011fi\n\/\/ Bu, her 'app.loggable_service' etiketli servisi,\n\/\/ bir 'App\\Service\\LoggerDecorator' ile sarar.\nforeach ($container->findTaggedServiceIds('app.loggable_service') as $id => $tags) {\n    $decoratedId = $id . '.logger_decorator';\n    $decoratorDefinition = (new Definition(LoggerDecorator::class))\n        ->setDecoratedService($id, null, 0) \/\/ $id servisini dekore et\n        ->setArguments([new Reference($decoratedId . '.inner')]);\n    \n    $container->setDefinition($decoratedId, $decoratorDefinition);\n}<\/pre>\n<p><\/code><\/p>\n<h4>\u00d6rnek: Loglama veya Profilleme \u0130\u00e7in Dekorasyon<\/h4>\n<p>Uygulaman\u0131zdaki belirli servislerin (\u00f6rne\u011fin, t\u00fcm API istemcileri) metot \u00e7a\u011fr\u0131lar\u0131n\u0131 loglamak veya performanslar\u0131n\u0131 profillemek istedi\u011finizi varsayal\u0131m. Bu servisleri <code>app.loggable_service<\/code> etiketiyle i\u015faretleyebilir ve yukar\u0131daki <code>Compiler Pass<\/code> \u00f6rne\u011fini kullanarak her birine otomatik olarak bir <code>LoggerDecorator<\/code> enjekte edebilirsiniz. Bu, mevcut servis kodunu de\u011fi\u015ftirmeden \u00e7apraz kesen endi\u015feleri (cross-cutting concerns) y\u00f6netmenin zarif bir yoludur.<\/p>\n<h3>En \u0130yi Uygulamalar ve S\u0131k Yap\u0131lan Hatalar<\/h3>\n<p>Geli\u015fmi\u015f servis etiketlerini kullan\u0131rken, kodunuzun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve performans\u0131n\u0131 art\u0131rmak i\u00e7in belirli en iyi uygulamalara uymak \u00f6nemlidir.<\/p>\n<h4>Etiket \u0130simlendirme Kurallar\u0131<\/h4>\n<p>Etiket isimleri i\u00e7in tutarl\u0131 bir adland\u0131rma \u015femas\u0131 kullan\u0131n. Genellikle, etiketleri ters alan ad\u0131 (reverse domain name) format\u0131nda (<code>vendor.bundle.tag_name<\/code> veya <code>app.tag_name<\/code>) adland\u0131rmak iyi bir uygulamad\u0131r. Bu, etiket \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler ve etiketlerin amac\u0131n\u0131 netle\u015ftirir. \u00d6rne\u011fin: <code>app.data_collector<\/code>, <code>acme_blog.post_processor<\/code>.<\/p>\n<h4>Performans ve Bak\u0131m \u0130pu\u00e7lar\u0131<\/h4>\n<p>- <strong>Gereksiz Etiketlerden Ka\u00e7\u0131n\u0131n:<\/strong> Her servise gereksiz yere etiket atamay\u0131n. Yaln\u0131zca bir <code>Compiler Pass<\/code> taraf\u0131ndan toplanacak veya belirli bir amaca hizmet edecek servisleri etiketleyin.<br \/>\n- <strong>Compiler Pass'leri Optimize Edin:<\/strong> <code>Compiler Pass<\/code>'ler konteyner derlenirken \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, performans a\u00e7\u0131s\u0131ndan kritik olabilirler. Gereksiz d\u00f6ng\u00fclerden veya pahal\u0131 i\u015flemlerden ka\u00e7\u0131n\u0131n. Sadece ihtiyac\u0131n\u0131z olan etiketli servisleri toplay\u0131n.<br \/>\n- <strong>Kodu D\u00fczenli Tutun:<\/strong> <code>Compiler Pass<\/code>'lerinizi mant\u0131ksal olarak grupland\u0131r\u0131n ve iyi yorumlay\u0131n. Her pass'in tek bir sorumlulu\u011fu olmas\u0131na dikkat edin.<br \/>\n- <strong>Hata Ay\u0131klama:<\/strong> Etiketli servisleri ve niteliklerini kontrol etmek i\u00e7in <code>bin\/console debug:container --tag=your_tag_name<\/code> komutunu kullan\u0131n. Bu, beklendi\u011fi gibi etiketlenip etiketlenmedi\u011fini g\u00f6rmenize yard\u0131mc\u0131 olur.<\/p>\n<h4>Yayg\u0131n Tuzaklar ve \u00c7\u00f6z\u00fcmleri<\/h4>\n<p>- <strong>Yanl\u0131\u015f Etiket Nitelikleri:<\/strong> Etiket niteliklerini yanl\u0131\u015f yazmak veya beklenen t\u00fcrde de\u011ferler sa\u011flamamak, <code>Compiler Pass<\/code>'inizde hatalara yol a\u00e7abilir. Nitelik adlar\u0131n\u0131 ve de\u011ferlerini dikkatlice kontrol edin.<br \/>\n- <strong>Compiler Pass S\u0131ralamas\u0131:<\/strong> Birden fazla <code>Compiler Pass<\/code>'iniz varsa ve bunlar birbirine ba\u011f\u0131ml\u0131ysa, s\u0131ralamalar\u0131 \u00f6nemli olabilir. <code>addCompilerPass()<\/code> metoduna <code>PassConfig::TYPE_BEFORE_OPTIMIZATION<\/code> veya <code>PassConfig::TYPE_AFTER_REMOVING<\/code> gibi ikinci bir arg\u00fcman ekleyerek pass'lerin \u00e7al\u0131\u015fma s\u0131ras\u0131n\u0131 kontrol edebilirsiniz.<br \/>\n- <strong>Servis G\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc (Public\/Private):<\/strong> Varsay\u0131lan olarak, Symfony 4.0'dan itibaren servisler \u00f6zeldir (<code>private<\/code>). <code>Compiler Pass<\/code> i\u00e7inde servis tan\u0131mlamalar\u0131na eri\u015firken bu durumu g\u00f6z \u00f6n\u00fcnde bulundurun. Bir servisi bir <code>Reference<\/code> olarak enjekte ediyorsan\u0131z, genellikle \u00f6zel olmas\u0131 sorun te\u015fkil etmez. Ancak do\u011frudan <code>ContainerBuilder::getDefinition()<\/code> ile eri\u015fiyorsan\u0131z, servisin var oldu\u011fundan emin olun.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Symfony 7.4'teki geli\u015fmi\u015f servis etiketleri, uygulaman\u0131z\u0131n mimarisini daha mod\u00fcler, esnek ve s\u00fcrd\u00fcr\u00fclebilir hale getirmek i\u00e7in paha bi\u00e7ilmez ara\u00e7lard\u0131r. \u00d6zel etiket nitelikleri ve <code>Compiler Pass<\/code>'ler arac\u0131l\u0131\u011f\u0131yla, servislerinizi dinamik olarak toplayabilir, i\u015fleyebilir, \u00f6nceliklendirebilir ve hatta dekore edebilirsiniz. Bu teknikleri ustaca kullanarak, karma\u015f\u0131k i\u015f gereksinimlerini kar\u015f\u0131layan ve kolayca geni\u015fletilebilen g\u00fc\u00e7l\u00fc uygulamalar geli\u015ftirebilirsiniz. Temellerin \u00f6tesine ge\u00e7mek, Symfony'nin ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu konteynerinin ger\u00e7ek potansiyelini a\u00e7\u0131\u011fa \u00e7\u0131kar\u0131r ve size daha fazla kontrol ve esneklik sa\u011flar.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>Etiketler performans\u0131 etkiler mi?<\/h4>\n<p>Servis etiketleri, derleme zaman\u0131nda i\u015flendi\u011fi i\u00e7in uygulaman\u0131z\u0131n \u00e7al\u0131\u015fma zaman\u0131 performans\u0131n\u0131 do\u011frudan etkilemez. <code>Compiler Pass<\/code>'ler sadece konteyner ilk kez derlenirken (genellikle \u00f6nbellek temizlendi\u011finde) \u00e7al\u0131\u015f\u0131r. Bu nedenle, do\u011fru bir \u015fekilde uyguland\u0131klar\u0131nda performans \u00fczerinde ihmal edilebilir bir etkisi vard\u0131r.<\/p>\n<h4>Hangi Symfony s\u00fcr\u00fcmlerinde bu \u00f6zellikler mevcut?<\/h4>\n<p>Servis etiketleri ve <code>Compiler Pass<\/code>'ler Symfony'nin ilk s\u00fcr\u00fcmlerinden beri mevcuttur. <code>autoconfigure<\/code> ve <code>_instanceof<\/code> gibi otomatik konfig\u00fcrasyon \u00f6zellikleri Symfony 3.3 ve sonraki s\u00fcr\u00fcmlerde tan\u0131t\u0131lm\u0131\u015ft\u0131r. Bu makaledeki t\u00fcm kavramlar Symfony 7.4'te tamamen desteklenmektedir.<\/p>\n<h4>Etiketler ve servis tan\u0131mlamalar\u0131 aras\u0131ndaki fark nedir?<\/h4>\n<p>Servis tan\u0131mlamalar\u0131, bir servisin nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 (s\u0131n\u0131f\u0131, arg\u00fcmanlar\u0131, metod \u00e7a\u011fr\u0131lar\u0131 vb.) belirtirken, etiketler bir servise ek meta veri ataman\u0131n ve onu belirli bir kategoriye yerle\u015ftirmenin bir yoludur. Etiketler, servis tan\u0131mlamalar\u0131n\u0131n bir par\u00e7as\u0131 olarak kullan\u0131l\u0131r.<\/p>\n<h4>Ne zaman etiket kullanmal\u0131y\u0131m, ne zaman do\u011frudan servis enjekte etmeliyim?<\/h4>\n<p>- <strong>Do\u011frudan Enjeksiyon:<\/strong> Belirli bir servise do\u011frudan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131z oldu\u011funda (\u00f6rne\u011fin, bir kontrol\u00f6r\u00fcn belirli bir hizmeti kullanmas\u0131 gerekti\u011finde) do\u011frudan servis enjeksiyonunu kullan\u0131n.<br \/>\n- <strong>Etiketler:<\/strong> Bir aray\u00fcz\u00fc uygulayan veya belirli bir kategoriye giren birden fazla servisi dinamik olarak toplaman\u0131z veya i\u015flemeniz gerekti\u011finde etiketleri kullan\u0131n. Bu, \"strateji\", \"dekorat\u00f6r\" veya \"toplay\u0131c\u0131\" desenlerini uygularken idealdir. Etiketler, gelecekte eklenebilecek yeni servisleri mevcut kodu de\u011fi\u015ftirmeden desteklemenizi sa\u011flar.<\/p>\n","protected":false},"excerpt":{"rendered":"Symfony 7.","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":[133],"tags":[],"class_list":{"0":"post-37822","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","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>Symfony 7.4&#039;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde - 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\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Symfony 7.4&#039;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde\" \/>\n<meta property=\"og:description\" content=\"Symfony 7.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-16T08:30:55+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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde\",\"datePublished\":\"2026-01-16T08:30:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\"},\"wordCount\":2090,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\",\"name\":\"Symfony 7.4'te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-16T08:30:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde\"}]},{\"@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":"Symfony 7.4'te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde - 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\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/","og_locale":"tr_TR","og_type":"article","og_title":"Symfony 7.4'te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde","og_description":"Symfony 7.","og_url":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-16T08:30:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde","datePublished":"2026-01-16T08:30:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/"},"wordCount":2090,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/","url":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/","name":"Symfony 7.4'te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-16T08:30:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/symfony-7-4te-gelismis-servis-etiketlerini-ustalasmak-temellerin-otesinde\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Symfony 7.4&#8217;te Geli\u015fmi\u015f Servis Etiketlerini Ustala\u015fmak: Temellerin \u00d6tesinde"}]},{"@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\/37822","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=37822"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37822\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37822"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37822"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37822"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}