{"id":36530,"date":"2025-12-19T12:00:43","date_gmt":"2025-12-19T09:00:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/"},"modified":"2025-12-19T12:00:43","modified_gmt":"2025-12-19T09:00:43","slug":"drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/","title":{"rendered":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131"},"content":{"rendered":"<h2>Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131<\/h2>\n<p>Drupal, g\u00fc\u00e7l\u00fc ve esnek bir i\u00e7erik y\u00f6netim sistemi olmas\u0131n\u0131n yan\u0131 s\u0131ra, modern PHP geli\u015ftirme prensiplerini benimseyen bir framework&#8217;t\u00fcr. Bu prensiplerden biri de servis tabanl\u0131 mimari ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonudur. Ancak bazen, Drupal \u00e7ekirde\u011fi veya katk\u0131da bulunan mod\u00fcller taraf\u0131ndan sa\u011flanan mevcut bir servisin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmemiz veya geni\u015fletmemiz gerekebilir. \u0130\u015fte tam bu noktada, &#8220;Service Decorator&#8221;lar devreye girer. Bu makale, Drupal Service Decorator&#8217;lar\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve mevcut kodu bozmadan, temiz ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde nas\u0131l de\u011fi\u015fiklik yapabilece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>Giri\u015f: Neden Service Decorator&#8217;lara \u0130htiya\u00e7 Duyar\u0131z?<\/h3>\n<p>Drupal projelerinde geli\u015ftirme yaparken s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir senaryo, mevcut bir servisin belirli bir y\u00f6ntemini de\u011fi\u015ftirmek veya bu y\u00f6nteme ek i\u015flevsellik katmakt\u0131r. Do\u011frudan \u00e7ekirdek veya katk\u0131da bulunan mod\u00fcl kodunu de\u011fi\u015ftirmek (hacklemek) kesinlikle ka\u00e7\u0131n\u0131lmas\u0131 gereken bir uygulamad\u0131r, zira bu t\u00fcr de\u011fi\u015fiklikler g\u00fcncelleme s\u00fcre\u00e7lerini kabusa \u00e7evirir ve projenin bak\u0131m\u0131n\u0131 imkans\u0131z hale getirir. Service Decorator&#8217;lar, bu soruna zarif bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h4>Mevcut Hizmetleri Geni\u015fletme \u0130htiyac\u0131<\/h4>\n<p>Bir\u00e7ok durumda, Drupal&#8217;\u0131n varsay\u0131lan davran\u0131\u015flar\u0131 projenizin \u00f6zel gereksinimlerini kar\u015f\u0131lamayabilir. \u00d6rne\u011fin, kullan\u0131c\u0131 oturumlar\u0131n\u0131 farkl\u0131 bir \u015fekilde y\u00f6netmek, bir \u00f6nbellekleme servisine \u00f6zel bir mant\u0131k eklemek veya bir g\u00fcnl\u00fck kayd\u0131 servisine ek bilgiler yazd\u0131rmak isteyebilirsiniz. Bu t\u00fcr senaryolarda, mevcut bir servisi geni\u015fletmek veya sarmalamak gerekir.<\/p>\n<h4>Kodu Korumak ve Bak\u0131m Kolayl\u0131\u011f\u0131<\/h4>\n<p>Service Decorator&#8217;lar, mevcut kod taban\u0131n\u0131 dokunulmaz b\u0131rakarak, de\u011fi\u015fikliklerinizi ayr\u0131 bir katmanda yapman\u0131z\u0131 sa\u011flar. Bu, \u00e7ekirdek veya katk\u0131da bulunan mod\u00fcl g\u00fcncellemelerinin sorunsuz bir \u015fekilde uygulanabilece\u011fi anlam\u0131na gelir. Ayr\u0131ca, kendi kodunuzun sorumluluklar\u0131n\u0131 net bir \u015fekilde ay\u0131rarak, bak\u0131m kolayl\u0131\u011f\u0131n\u0131 ve hata ay\u0131klama s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<h4>Esneklik ve Mod\u00fclerlik<\/h4>\n<p>Decorator deseni, uygulaman\u0131za daha fazla esneklik ve mod\u00fclerlik kazand\u0131r\u0131r. Bir servisin davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek istedi\u011finizde, mevcut servisi de\u011fi\u015ftirmek yerine, yeni bir &#8220;dekorasyon&#8221; katman\u0131 eklersiniz. Bu, farkl\u0131 projelerde veya farkl\u0131 durumlarda ayn\u0131 servisin farkl\u0131 \u015fekillerde dekore edilmesine olanak tan\u0131r.<\/p>\n<h3>Drupal&#8217;da Servisler ve Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu<\/h3>\n<p>Service Decorator&#8217;lar\u0131 anlamak i\u00e7in \u00f6ncelikle Drupal&#8217;daki servis kavram\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonunu iyi kavramak gerekir.<\/p>\n<h4>Servislerin Temelleri<\/h4>\n<p>Drupal 8 ve sonras\u0131, Symfony \u00e7er\u00e7evesinin bile\u015fenlerini yo\u011fun bir \u015fekilde kullan\u0131r. &#8220;Servis&#8221;, belirli bir i\u015flevselli\u011fi yerine getiren bir PHP s\u0131n\u0131f\u0131d\u0131r. Bu s\u0131n\u0131flar, genellikle tekil (singleton) olarak tan\u0131mlan\u0131r ve uygulaman\u0131n farkl\u0131 yerlerinden eri\u015filebilir. \u00d6rne\u011fin, veritaban\u0131 i\u015flemleri i\u00e7in bir servis, kullan\u0131c\u0131 y\u00f6netimi i\u00e7in ba\u015fka bir servis veya \u00f6nbellekleme i\u00e7in ayr\u0131 bir servis bulunur.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ve Servis Konteyneri<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI), bir s\u0131n\u0131f\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (yani, ihtiya\u00e7 duydu\u011fu di\u011fer nesneleri) kendisinin olu\u015fturmas\u0131 yerine, d\u0131\u015far\u0131dan sa\u011flanmas\u0131 prensibidir. Drupal&#8217;da bu, bir &#8220;Servis Konteyneri&#8221; (Symfony&#8217;nin <code>ContainerBuilder<\/code>&#8216;\u0131) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. Servis konteyneri, t\u00fcm servis tan\u0131mlar\u0131n\u0131 bilir ve bir servise ihtiya\u00e7 duyuldu\u011funda, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak enjekte ederek servisin bir \u00f6rne\u011fini olu\u015fturur.<\/p>\n<h4>Servis Tan\u0131mlamalar\u0131: <code>services.yml<\/code><\/h4>\n<p>Drupal&#8217;da servisler, genellikle bir mod\u00fcl\u00fcn veya teman\u0131n k\u00f6k dizinindeki <code>services.yml<\/code> dosyas\u0131nda tan\u0131mlan\u0131r. Bu YAML dosyas\u0131, servisin ad\u0131n\u0131, s\u0131n\u0131f\u0131n\u0131, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (arg\u00fcmanlar\u0131n\u0131) ve di\u011fer yap\u0131land\u0131rma se\u00e7eneklerini belirtir. \u0130\u015fte basit bir servis tan\u0131m\u0131 \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  mymodule.my_service:\n    class: Drupal\\mymodule\\MyService\n    arguments: ['@logger.factory', '@current_user']\n<\/pre>\n<p><\/code><\/p>\n<p>Bu tan\u0131m, <code>mymodule.my_service<\/code> ad\u0131nda bir servis olu\u015fturur ve bu servisin yap\u0131c\u0131 metoduna <code>logger.factory<\/code> ve <code>current_user<\/code> servislerini enjekte eder.<\/p>\n<h3>Service Decorator Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Service Decorator, mevcut bir servisi sarmalayarak (decorate ederek) onun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftiren veya geni\u015fleten \u00f6zel bir servis t\u00fcr\u00fcd\u00fcr. Bu, orijinal servisin kodunu de\u011fi\u015ftirmeden ek i\u015flevsellik eklemenizi sa\u011flar.<\/p>\n<h4>Decorator Tasar\u0131m Deseni<\/h4>\n<p>Decorator, nesne y\u00f6nelimli programlamada iyi bilinen bir yap\u0131sal tasar\u0131m desenidir. Amac\u0131, mevcut bir nesneye dinamik olarak yeni sorumluluklar eklemektir. Dekorasyon, alt s\u0131n\u0131flara ay\u0131rma (inheritance) yoluyla geni\u015fletmeye esnek bir alternatif sunar. Bir dekorat\u00f6r, sarmalad\u0131\u011f\u0131 nesneyle ayn\u0131 aray\u00fcze sahip olmal\u0131 ve orijinal nesnenin y\u00f6ntemlerini \u00e7a\u011f\u0131rarak kendi ek mant\u0131\u011f\u0131n\u0131 uygulayabilir.<\/p>\n<h4>Drupal'daki Service Decorator Mekanizmas\u0131<\/h4>\n<p>Drupal'da bir servisi dekore etmek i\u00e7in, yeni servisinizi <code>services.yml<\/code> dosyas\u0131nda tan\u0131mlarken <code>decorates<\/code> anahtar\u0131n\u0131 kullan\u0131rs\u0131n\u0131z. Bu anahtar, hangi servisi dekore etti\u011finizi belirtir. Ayr\u0131ca, dekore edilen orijinal servisi yeni servisinize ba\u011f\u0131ml\u0131l\u0131k olarak enjekte etmek i\u00e7in \u00f6zel bir arg\u00fcman kullanman\u0131z gerekir.<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  mymodule.my_decorated_service:\n    class: Drupal\\mymodule\\MyDecoratedService\n    decorates: original_service_id\n    arguments: ['@mymodule.my_decorated_service.inner']\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>original_service_id<\/code> dekore edilen servisin kimli\u011fidir. <code>@mymodule.my_decorated_service.inner<\/code> ise Drupal'\u0131n otomatik olarak olu\u015fturdu\u011fu, orijinal servisin \u00f6rne\u011fini temsil eden \u00f6zel bir referanst\u0131r. Bu referans, dekore eden servisin yap\u0131c\u0131 metoduna orijinal servisi enjekte etmesini sa\u011flar.<\/p>\n<h4>Decorator'\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h4>\n<p><strong>Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Non-invaziv:<\/strong> \u00c7ekirdek veya katk\u0131da bulunan mod\u00fcl kodunu de\u011fi\u015ftirmenize gerek kalmaz.<\/li>\n<li><strong>S\u00fcrd\u00fcr\u00fclebilirlik:<\/strong> G\u00fcncellemelerden etkilenmez, projenizin bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>Mod\u00fclerlik:<\/strong> Farkl\u0131 dekorat\u00f6rler zincirleyerek karma\u015f\u0131k davran\u0131\u015flar olu\u015fturabilirsiniz.<\/li>\n<li><strong>Sorumluluk Ayr\u0131m\u0131:<\/strong> Her dekorat\u00f6r\u00fcn belirli bir sorumlulu\u011fu vard\u0131r, bu da kodun okunabilirli\u011fini art\u0131r\u0131r.<\/li>\n<\/ul>\n<p><strong>Dezavantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Karma\u015f\u0131kl\u0131k:<\/strong> A\u015f\u0131r\u0131 kullan\u0131ld\u0131\u011f\u0131nda, bir servisin davran\u0131\u015f\u0131n\u0131 izlemek zorla\u015fabilir.<\/li>\n<li><strong>Hata Ay\u0131klama:<\/strong> Bir servisin birden fazla dekorat\u00f6r taraf\u0131ndan sarmalanmas\u0131, hata ay\u0131klamay\u0131 biraz daha karma\u015f\u0131k hale getirebilir.<\/li>\n<li><strong>Performans:<\/strong> Her dekorasyon katman\u0131, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131na ek bir ad\u0131m ekler, ancak genellikle ihmal edilebilir bir performans maliyeti vard\u0131r.<\/li>\n<\/ul>\n<h3>Bir Service Decorator Olu\u015fturma Ad\u0131mlar\u0131<\/h3>\n<p>\u015eimdi pratik bir \u00f6rnek \u00fczerinden bir Service Decorator'\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h4>Hedef Servisi Belirleme<\/h4>\n<p>\u0130lk ad\u0131m, hangi servisi dekore etmek istedi\u011finizi belirlemektir. Bu \u00f6rnekte, Drupal'\u0131n varsay\u0131lan g\u00fcnl\u00fck kayd\u0131 servisi olan <code>logger.factory<\/code> servisini dekore edece\u011fiz. Amac\u0131m\u0131z, her g\u00fcnl\u00fck kayd\u0131 i\u015flemine \u00f6zel bir \u00f6n ek eklemek olsun.<\/p>\n<h4>Decorator Servis Tan\u0131mlamas\u0131 (<code>services.yml<\/code>)<\/h4>\n<p>Mod\u00fcl\u00fcn\u00fcz\u00fcn (\u00f6rne\u011fin, <code>mymodule<\/code>) <code>mymodule.services.yml<\/code> dosyas\u0131na a\u015fa\u011f\u0131daki tan\u0131m\u0131 ekleyin:<\/p>\n<pre><code class=\"language-yaml\">\n# mymodule\/mymodule.services.yml\nservices:\n  mymodule.logger_factory_decorator:\n    class: Drupal\\mymodule\\Logger\\MyModuleLoggerFactoryDecorator\n    decorates: logger.factory\n    public: false # Bu servisin do\u011frudan \u00e7a\u011fr\u0131lmas\u0131n\u0131 engeller\n    arguments: ['@mymodule.logger_factory_decorator.inner']\n<\/pre>\n<p><\/code><\/p>\n<p>Burada:<\/p>\n<ul>\n<li><code>mymodule.logger_factory_decorator<\/code>: Yeni dekorat\u00f6r servisimizin benzersiz kimli\u011fi.<\/li>\n<li><code>class<\/code>: Dekorasyon mant\u0131\u011f\u0131n\u0131 i\u00e7eren PHP s\u0131n\u0131f\u0131m\u0131z\u0131n yolu.<\/li>\n<li><code>decorates: logger.factory<\/code>: Hangi servisi dekore etti\u011fimizi belirtiriz. Bu, Drupal'a <code>logger.factory<\/code> servisi \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda asl\u0131nda bizim dekorat\u00f6r\u00fcm\u00fcz\u00fcn \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 s\u00f6yler.<\/li>\n<li><code>public: false<\/code>: Genellikle dekorat\u00f6r servisleri do\u011frudan kullan\u0131lmad\u0131\u011f\u0131 i\u00e7in <code>public: false<\/code> olarak ayarlan\u0131r. Bu, servisin sadece i\u00e7 kullan\u0131m i\u00e7in oldu\u011funu belirtir.<\/li>\n<li><code>arguments: ['@mymodule.logger_factory_decorator.inner']<\/code>: Bu \u00f6zel arg\u00fcman, orijinal <code>logger.factory<\/code> servisini dekorat\u00f6r s\u0131n\u0131f\u0131m\u0131z\u0131n yap\u0131c\u0131 metoduna enjekte eder.<\/li>\n<\/ul>\n<h4>Decorator S\u0131n\u0131f\u0131n\u0131 Yazma<\/h4>\n<p>\u015eimdi <code>Drupal\\mymodule\\Logger\\MyModuleLoggerFactoryDecorator<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f, orijinal <code>LoggerFactory<\/code> s\u0131n\u0131f\u0131n\u0131n aray\u00fcz\u00fcn\u00fc (<code>\\Psr\\Log\\LoggerFactoryInterface<\/code>) uygulamal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-php\">\n\/\/ mymodule\/src\/Logger\/MyModuleLoggerFactoryDecorator.php\nnamespace Drupal\\mymodule\\Logger;\n\nuse Psr\\Log\\LoggerInterface;\nuse Psr\\Log\\LoggerFactoryInterface;\n\n\/**\n * Decorates the core logger.factory service to add custom prefixes.\n *\/\nclass MyModuleLoggerFactoryDecorator implements LoggerFactoryInterface {\n\n  \/**\n   * The decorated logger factory.\n   *\n   * @var \\Psr\\Log\\LoggerFactoryInterface\n   *\/\n  protected $inner;\n\n  \/**\n   * Constructs a MyModuleLoggerFactoryDecorator object.\n   *\n   * @param \\Psr\\Log\\LoggerFactoryInterface $inner\n   *   The decorated logger factory service.\n   *\/\n  public function __construct(LoggerFactoryInterface $inner) {\n    $this->inner = $inner;\n  }\n\n  \/**\n   * {@inheritdoc}\n   *\/\n  public function get(string $channel): LoggerInterface {\n    \/\/ Get the original logger for the given channel.\n    $original_logger = $this->inner->get($channel);\n\n    \/\/ Now, we can wrap this logger with our own custom logger that adds prefixes.\n    \/\/ For simplicity, let's assume we return a custom logger instance.\n    \/\/ In a real-world scenario, you might have a custom Logger class\n    \/\/ that wraps the original one and modifies its log() method.\n    \/\/ For this example, we'll just demonstrate the decoration principle.\n\n    \/\/ A more realistic approach would be to decorate the LoggerInterface itself,\n    \/\/ not just the factory. But for demonstrating LoggerFactory decoration:\n    return new MyModuleLoggerDecorator($original_logger, 'MY_PREFIX');\n  }\n\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>MyModuleLoggerFactoryDecorator<\/code> s\u0131n\u0131f\u0131, <code>LoggerFactoryInterface<\/code> aray\u00fcz\u00fcn\u00fc uygular ve yap\u0131c\u0131 metodunda orijinal <code>logger.factory<\/code> servisini al\u0131r. <code>get()<\/code> metodunu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, orijinal factory'den bir logger al\u0131r ve onu kendi \u00f6zel logger'\u0131m\u0131z olan <code>MyModuleLoggerDecorator<\/code> ile sarmalar. \u015eimdi <code>MyModuleLoggerDecorator<\/code> s\u0131n\u0131f\u0131n\u0131 da olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-php\">\n\/\/ mymodule\/src\/Logger\/MyModuleLoggerDecorator.php\nnamespace Drupal\\mymodule\\Logger;\n\nuse Psr\\Log\\AbstractLogger;\nuse Psr\\Log\\LoggerInterface;\n\n\/**\n * Decorates a logger to add a custom prefix to log messages.\n *\/\nclass MyModuleLoggerDecorator extends AbstractLogger {\n\n  \/**\n   * The decorated logger.\n   *\n   * @var \\Psr\\Log\\LoggerInterface\n   *\/\n  protected $innerLogger;\n\n  \/**\n   * The custom prefix to add to log messages.\n   *\n   * @var string\n   *\/\n  protected $prefix;\n\n  \/**\n   * Constructs a MyModuleLoggerDecorator object.\n   *\n   * @param \\Psr\\Log\\LoggerInterface $innerLogger\n   *   The decorated logger service.\n   * @param string $prefix\n   *   The prefix to add to log messages.\n   *\/\n  public function __construct(LoggerInterface $innerLogger, string $prefix) {\n    $this->innerLogger = $innerLogger;\n    $this->prefix = $prefix;\n  }\n\n  \/**\n   * {@inheritdoc}\n   *\/\n  public function log($level, $message, array $context = []): void {\n    \/\/ Add our custom prefix to the message.\n    $prefixed_message = '[' . $this->prefix . '] ' . $message;\n\n    \/\/ Call the original logger's log method with the modified message.\n    $this->innerLogger->log($level, $prefixed_message, $context);\n  }\n\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>MyModuleLoggerDecorator<\/code> s\u0131n\u0131f\u0131, <code>AbstractLogger<\/code>'\u0131 geni\u015fleterek <code>LoggerInterface<\/code>'in t\u00fcm metodlar\u0131n\u0131 devral\u0131r ve sadece <code>log()<\/code> metodunu ge\u00e7ersiz k\u0131lar. Bu metod, orijinal mesaj\u0131n ba\u015f\u0131na bir \u00f6n ek ekler ve ard\u0131ndan orijinal logger'\u0131n <code>log()<\/code> metodunu \u00e7a\u011f\u0131r\u0131r. Bu sayede, <code>logger.factory<\/code> servisini kullanan her yerde, g\u00fcnl\u00fck mesajlar\u0131m\u0131z\u0131n ba\u015f\u0131nda art\u0131k \u00f6zel \u00f6n ekimiz olacakt\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Kullan\u0131m Senaryolar\u0131 ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Service Decorator'lar sadece basit de\u011fi\u015fiklikler i\u00e7in de\u011fil, daha karma\u015f\u0131k senaryolar i\u00e7in de kullan\u0131labilir.<\/p>\n<h4>Birden Fazla Decorator Zincirleme<\/h4>\n<p>Bir servisi birden fazla dekorat\u00f6r ile sarmalayabilirsiniz. Drupal, bu zinciri <code>services.yml<\/code> dosyas\u0131ndaki <code>decorates<\/code> tan\u0131mlar\u0131na g\u00f6re otomatik olarak y\u00f6netir. \u00d6rne\u011fin, <code>logger.factory<\/code> servisini \u00f6nce bir dekorat\u00f6r, sonra ba\u015fka bir dekorat\u00f6r ile sarmalayabilirsiniz. Drupal, en son dekore eden servisi \u00e7a\u011f\u0131r\u0131r ve bu servis, bir \u00f6nceki dekorat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131r ve bu b\u00f6yle devam eder. Bu, her bir dekorat\u00f6r\u00fcn kendi \u00f6zel mant\u0131\u011f\u0131n\u0131 eklemesine olanak tan\u0131r.<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  mymodule.logger_factory_decorator_one:\n    class: Drupal\\mymodule\\Logger\\DecoratorOne\n    decorates: logger.factory\n    public: false\n    arguments: ['@mymodule.logger_factory_decorator_one.inner']\n\n  mymodule.logger_factory_decorator_two:\n    class: Drupal\\mymodule\\Logger\\DecoratorTwo\n    decorates: logger.factory\n    public: false\n    arguments: ['@mymodule.logger_factory_decorator_two.inner']\n    # priority: 100 # \u0130ste\u011fe ba\u011fl\u0131, varsay\u0131lan 0'd\u0131r. Daha y\u00fcksek \u00f6ncelik, daha \u00f6nce dekore eder.\n<\/pre>\n<p><\/code><\/p>\n<p>Bu durumda, <code>DecoratorTwo<\/code>, <code>DecoratorOne<\/code>'\u0131 sarmalar ve <code>DecoratorOne<\/code> da orijinal <code>logger.factory<\/code>'yi sarmalar.<\/p>\n<h4>Decorator \u00d6ncelikleri (<code>priority<\/code>)<\/h4>\n<p>E\u011fer birden fazla dekorat\u00f6r ayn\u0131 servisi dekore ediyorsa ve bunlar\u0131n uygulanma s\u0131ras\u0131 \u00f6nemliyse, <code>priority<\/code> anahtar\u0131n\u0131 kullanabilirsiniz. Daha y\u00fcksek <code>priority<\/code> de\u011ferine sahip dekorat\u00f6rler, daha d\u00fc\u015f\u00fck \u00f6ncelikli dekorat\u00f6rlerden \u00f6nce uygulan\u0131r (yani, en d\u0131\u015ftaki sarmalay\u0131c\u0131 olurlar). Varsay\u0131lan \u00f6ncelik 0'd\u0131r.<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  mymodule.logger_factory_decorator_one:\n    class: Drupal\\mymodule\\Logger\\DecoratorOne\n    decorates: logger.factory\n    public: false\n    arguments: ['@mymodule.logger_factory_decorator_one.inner']\n    priority: 100 # Bu, di\u011ferlerinden \u00f6nce uygulan\u0131r.\n\n  mymodule.logger_factory_decorator_two:\n    class: Drupal\\mymodule\\Logger\\DecoratorTwo\n    decorates: logger.factory\n    public: false\n    arguments: ['@mymodule.logger_factory_decorator_two.inner']\n    priority: 50 # Bu, DecoratorOne'dan sonra uygulan\u0131r.\n<\/pre>\n<p><\/code><\/p>\n<h4>Hata Ay\u0131klama ve Sorun Giderme<\/h4>\n<p>Bir servisin dekore edilip edilmedi\u011fini veya hangi dekorat\u00f6rler taraf\u0131ndan sarmaland\u0131\u011f\u0131n\u0131 anlamak i\u00e7in <code>drush debug:container<\/code> komutunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\ndrush debug:container logger.factory\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, servisin tan\u0131m\u0131n\u0131 ve varsa hangi dekorat\u00f6rler taraf\u0131ndan sarmaland\u0131\u011f\u0131n\u0131 g\u00f6sterecektir. Bu, \u00f6zellikle karma\u015f\u0131k servis zincirlerinde hata ay\u0131klama yaparken \u00e7ok faydal\u0131d\u0131r.<\/p>\n<h4>Ne Zaman Decorator Kullanmal\u0131, Ne Zaman Farkl\u0131 Bir Yakla\u015f\u0131m?<\/h4>\n<p>Service Decorator'lar g\u00fc\u00e7l\u00fc olsa da, her senaryo i\u00e7in en iyi \u00e7\u00f6z\u00fcm de\u011fildir. \u0130\u015fte baz\u0131 alternatifler:<\/p>\n<ul>\n<li><strong>Event Subscriber (Olay Dinleyicisi):<\/strong> E\u011fer bir olay (\u00f6rne\u011fin, bir varl\u0131k kaydedildi\u011finde) ger\u00e7ekle\u015fti\u011finde ek bir i\u015flem yapmak istiyorsan\u0131z, Event Subscriber'lar daha uygun olabilir. Decorator'lar bir servisin metod \u00e7a\u011fr\u0131lar\u0131n\u0131 do\u011frudan de\u011fi\u015ftirmek veya sarmalamak i\u00e7in kullan\u0131l\u0131rken, Event Subscriber'lar daha \u00e7ok \"bir \u015fey oldu\u011funda tepki ver\" senaryolar\u0131 i\u00e7indir.<\/li>\n<li><strong>Plugin'ler:<\/strong> Drupal'da belirli bir t\u00fcrde (\u00f6rne\u011fin, bloklar, alan bi\u00e7imlendiriciler) yeni bir i\u015flevsellik eklemek istedi\u011finizde Plugin'ler kullan\u0131l\u0131r. Plugin'ler, belirli bir aray\u00fcz\u00fc uygulayan k\u00fc\u00e7\u00fck, tak\u0131labilir bile\u015fenlerdir.<\/li>\n<li><strong>Service Provider:<\/strong> E\u011fer bir servisin tan\u0131m\u0131n\u0131 veya arg\u00fcmanlar\u0131n\u0131 dinamik olarak de\u011fi\u015ftirmek istiyorsan\u0131z, bir Service Provider kullanabilirsiniz. Bu, genellikle daha d\u00fc\u015f\u00fck seviyeli bir kontrol sa\u011flar.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, bir servisin mevcut metodlar\u0131n\u0131n davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek veya geni\u015fletmek istedi\u011finizde, Decorator'lar genellikle en temiz ve en s\u00fcrd\u00fcr\u00fclebilir yoldur. E\u011fer sadece bir olaya tepki vermek veya yeni bir t\u00fcr i\u015flevsellik eklemek istiyorsan\u0131z, di\u011fer yakla\u015f\u0131mlar\u0131 de\u011ferlendirmelisiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Drupal Service Decorator'lar, mevcut \u00e7ekirdek veya katk\u0131da bulunan mod\u00fcl servislerinin davran\u0131\u015f\u0131n\u0131 g\u00fcvenli, temiz ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde de\u011fi\u015ftirmek veya geni\u015fletmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar. Bu desen, projenizin esnekli\u011fini art\u0131r\u0131r, bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr ve gelecekteki g\u00fcncellemelerle uyumlulu\u011fu sa\u011flar. <code>services.yml<\/code> dosyas\u0131ndaki basit bir tan\u0131m ve uygun bir PHP s\u0131n\u0131f\u0131 ile, Drupal'\u0131n g\u00fc\u00e7l\u00fc servis mimarisinden tam olarak yararlanabilirsiniz.<\/p>\n<h4>\u00d6zet ve \u00d6nemli \u00c7\u0131kar\u0131mlar<\/h4>\n<ul>\n<li>Service Decorator'lar, mevcut servisleri \"hacklemek\" yerine sarmalayarak de\u011fi\u015ftirmenin en iyi yoludur.<\/li>\n<li><code>decorates<\/code> anahtar\u0131 ve <code>.inner<\/code> arg\u00fcman\u0131, bir dekorat\u00f6r tan\u0131mlaman\u0131n temelidir.<\/li>\n<li>Decorator'lar, orijinal servisin aray\u00fcz\u00fcn\u00fc uygulamal\u0131d\u0131r.<\/li>\n<li>Birden fazla dekorat\u00f6r\u00fc zincirleyebilir ve <code>priority<\/code> ile s\u0131ralar\u0131n\u0131 belirleyebilirsiniz.<\/li>\n<li><code>drush debug:container<\/code>, dekorat\u00f6rleri hata ay\u0131klamak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r.<\/li>\n<\/ul>\n<p>Bu yakla\u015f\u0131m\u0131 benimseyerek, Drupal projelerinizde daha temiz, daha mod\u00fcler ve daha y\u00f6netilebilir bir kod taban\u0131 olu\u015fturabilirsiniz. Mevcut yap\u0131y\u0131 bozmadan, l'art de modifier l'existant sans tout casser prensibini benimseyerek, Drupal geli\u015ftirme deneyiminizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4>Decorator kullanmak performans d\u00fc\u015f\u00fcr\u00fcr m\u00fc?<\/h4>\n<p>Her dekorasyon katman\u0131, bir metod \u00e7a\u011fr\u0131s\u0131na ek bir ad\u0131m ekler. Teorik olarak bu, \u00e7ok k\u00fc\u00e7\u00fck bir performans maliyeti anlam\u0131na gelir. Ancak modern PHP yorumlay\u0131c\u0131lar\u0131 ve Drupal'\u0131n \u00f6nbellekleme mekanizmalar\u0131 sayesinde, bu maliyet \u00e7o\u011fu zaman ihmal edilebilir d\u00fczeydedir ve \u00e7o\u011fu uygulama i\u00e7in fark edilmez. A\u015f\u0131r\u0131ya ka\u00e7mad\u0131\u011f\u0131n\u0131z s\u00fcrece performans endi\u015fesi ta\u015f\u0131man\u0131za gerek yoktur.<\/p>\n<h4>Hangi Drupal s\u00fcr\u00fcmlerinde Service Decorator'lar desteklenir?<\/h4>\n<p>Service Decorator'lar, Drupal 8'den itibaren tam olarak desteklenmektedir. Drupal 9 ve Drupal 10'da da ayn\u0131 mekanizma ge\u00e7erlidir.<\/p>\n<h4>Decorator yerine Event Subscriber veya Plugin kullanmak ne zaman daha iyi olur?<\/h4>\n<p>Decorator'lar, mevcut bir servisin belirli bir metodunun davran\u0131\u015f\u0131n\u0131 de\u011fi\u015ftirmek veya sarmalamak istedi\u011finizde idealdir. E\u011fer bir olay (\u00f6rne\u011fin, bir varl\u0131k g\u00fcncellendi\u011finde) ger\u00e7ekle\u015fti\u011finde tetiklenecek ek bir mant\u0131k eklemek istiyorsan\u0131z Event Subscriber kullan\u0131n. E\u011fer Drupal'\u0131n belirli bir uzant\u0131 noktas\u0131na (\u00f6rne\u011fin, bir blok, bir alan bi\u00e7imlendirici) yeni bir t\u00fcr i\u015flevsellik eklemek istiyorsan\u0131z Plugin'leri tercih edin.<\/p>\n<h4>Bir servisi dekore etti\u011fimi nas\u0131l anlar\u0131m?<\/h4>\n<p>En kolay yol, <code>drush debug:container [servis_adi]<\/code> komutunu kullanmakt\u0131r. Bu komut, servisin tan\u0131m\u0131n\u0131 ve varsa hangi dekorat\u00f6rler taraf\u0131ndan sarmaland\u0131\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde g\u00f6sterir. Ayr\u0131ca, kodunuzda <code>services.yml<\/code> dosyalar\u0131n\u0131 kontrol ederek <code>decorates<\/code> anahtar\u0131n\u0131 arayabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Drupal, g\u00fc\u00e7l\u00fc ve esnek bir i\u00e7erik y\u00f6netim sistemi olmas\u0131n\u0131n yan\u0131 s\u0131ra, modern PHP geli\u015ftirme prensiplerini benimseyen bir framework&#8217;t\u00fcr. Bu prensi&#8230;","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-36530","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>Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131 - 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\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"Drupal, g\u00fc\u00e7l\u00fc ve esnek bir i\u00e7erik y\u00f6netim sistemi olmas\u0131n\u0131n yan\u0131 s\u0131ra, modern PHP geli\u015ftirme prensiplerini benimseyen bir framework&#039;t\u00fcr. Bu prensi...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-19T09:00:43+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\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131\",\"datePublished\":\"2025-12-19T09:00:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\"},\"wordCount\":2225,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\",\"name\":\"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-19T09:00:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131\"}]},{\"@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":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131 - 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\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131","og_description":"Drupal, g\u00fc\u00e7l\u00fc ve esnek bir i\u00e7erik y\u00f6netim sistemi olmas\u0131n\u0131n yan\u0131 s\u0131ra, modern PHP geli\u015ftirme prensiplerini benimseyen bir framework't\u00fcr. Bu prensi...","og_url":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-19T09:00:43+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\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131","datePublished":"2025-12-19T09:00:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/"},"wordCount":2225,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/","name":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-19T09:00:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/drupal-service-decorators-mevcut-yapiyi-bozmadan-degistirmenin-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Drupal Service Decorators: Mevcut Yap\u0131y\u0131 Bozmadan De\u011fi\u015ftirmenin Sanat\u0131"}]},{"@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\/36530","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=36530"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36530\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}