{"id":38375,"date":"2026-01-29T22:41:27","date_gmt":"2026-01-29T19:41:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38375"},"modified":"2026-01-29T22:41:27","modified_gmt":"2026-01-29T19:41:27","slug":"drush-komutlarinin-yapisi-ve-anatomisi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/","title":{"rendered":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi"},"content":{"rendered":"<p><body><\/p>\n<p>Drush, Drupal geli\u015ftiricilerinin ve sistem y\u00f6neticilerinin g\u00fcnl\u00fck i\u015flerini otomatikle\u015ftirmek, y\u00f6netmek ve h\u0131zland\u0131rmak i\u00e7in kulland\u0131\u011f\u0131 g\u00fc\u00e7l\u00fc bir komut sat\u0131r\u0131 arac\u0131d\u0131r. Drupal sitenizle etkile\u015fim kurman\u0131n ve karma\u015f\u0131k g\u00f6revleri tek bir komutla yerine getirmenin vazge\u00e7ilmez bir yoludur. Ancak Drush&#8217;\u0131n g\u00fcc\u00fc sadece mevcut komutlarla s\u0131n\u0131rl\u0131 de\u011fildir; kendi \u00f6zel ihtiya\u00e7lar\u0131n\u0131za y\u00f6nelik komutlar tan\u0131mlayarak bu arac\u0131 daha da \u00f6zelle\u015ftirebilirsiniz. Bu rehberde, bir VPS (Virtual Private Server) ortam\u0131nda kendi Drush komutlar\u0131n\u0131z\u0131 nas\u0131l bildirece\u011finizi, geli\u015ftirece\u011finizi ve kullanaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<p>\u00d6zel Drush komutlar\u0131, tekrarlayan g\u00f6revleri otomatikle\u015ftirmek, karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 basitle\u015ftirmek, \u00f6zel raporlar olu\u015fturmak veya Drupal API&#8217;si ile etkile\u015fim kuran benzersiz y\u00f6netim g\u00f6revleri tan\u0131mlamak i\u00e7in m\u00fckemmel bir y\u00f6ntemdir. Kendi sunucunuzda (VPS) bu komutlar\u0131 geli\u015ftirmek ve \u00e7al\u0131\u015ft\u0131rmak, size tam kontrol ve esneklik sa\u011flar.<\/p>\n<h2>Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi<\/h2>\n<p>Bir Drush komutu, temelde bir Drupal mod\u00fcl\u00fcn\u00fcn par\u00e7as\u0131 olarak tan\u0131mlanan bir PHP s\u0131n\u0131f\u0131d\u0131r. Bu s\u0131n\u0131f, belirli metodlar\u0131 Drush komutlar\u0131 olarak ortaya \u00e7\u0131kar\u0131r. Drush, bu komutlar\u0131 bulmak i\u00e7in mod\u00fcllerin <code>src\/Commands<\/code> dizinini tarar ve <code>drush.services.yml<\/code> dosyas\u0131nda tan\u0131mlanan servisleri kullan\u0131r.<\/p>\n<h3>Temel Bile\u015fenler:<\/h3>\n<ul>\n<li><strong>Mod\u00fcl Dizini:<\/strong> \u00d6zel komutlar\u0131n\u0131z, <code>modules\/custom<\/code> alt\u0131nda kendi mod\u00fcl\u00fcn\u00fcz i\u00e7inde yer almal\u0131d\u0131r.<\/li>\n<li><strong><code>drush.services.yml<\/code>:<\/strong> Bu dosya, Drush&#8217;a komut s\u0131n\u0131f\u0131n\u0131z\u0131n nerede oldu\u011funu ve nas\u0131l y\u00fcklenece\u011fini bildirir.<\/li>\n<li><strong>Komut S\u0131n\u0131f\u0131 (<code>.php<\/code> dosyas\u0131):<\/strong> As\u0131l komut mant\u0131\u011f\u0131n\u0131 i\u00e7eren PHP s\u0131n\u0131f\u0131d\u0131r. Genellikle <code>src\/Commands<\/code> dizini alt\u0131nda bulunur ve <code>\\Drush\\Commands\\DrushCommands<\/code> s\u0131n\u0131f\u0131n\u0131 extend eder.<\/li>\n<li><strong>Anotasyonlar:<\/strong> Komut metodlar\u0131n\u0131n \u00fczerinde kullan\u0131lan \u00f6zel yorum bloklar\u0131d\u0131r. Bunlar Drush&#8217;a komutun ad\u0131n\u0131, a\u00e7\u0131klamas\u0131n\u0131, arg\u00fcmanlar\u0131n\u0131, se\u00e7eneklerini ve di\u011fer metadata&#8217;y\u0131 bildirir (\u00f6rn. <code>@command<\/code>, <code>@usage<\/code>, <code>@option<\/code>, <code>@argument<\/code>).<\/li>\n<\/ul>\n<p>Bu yap\u0131y\u0131 anlamak, kendi komutlar\u0131n\u0131z\u0131 geli\u015ftirirken size yol g\u00f6sterecektir. \u015eimdi ad\u0131m ad\u0131m bir \u00f6rnek mod\u00fcl olu\u015ftural\u0131m.<\/p>\n<h2>\u00d6zel Drush Komut Mod\u00fcl\u00fc Olu\u015fturma<\/h2>\n<p>Kendi Drush komutlar\u0131n\u0131z\u0131 bildirmek i\u00e7in, standart bir Drupal mod\u00fcl\u00fc olu\u015fturman\u0131z ve i\u00e7ine Drush&#8217;\u0131n tan\u0131yaca\u011f\u0131 belirli dosyalar\u0131 yerle\u015ftirmeniz gerekir. A\u015fa\u011f\u0131daki ad\u0131mlar\u0131 VPS&#8217;inizin SSH terminalinde takip edebilirsiniz.<\/p>\n<h3>A\u015fama 1: Mod\u00fcl Dizini Yap\u0131s\u0131 Olu\u015fturma<\/h3>\n<p>Drupal kurulumunuzun ana dizininde (genellikle <code>\/var\/www\/html\/drupal<\/code> veya benzeri bir yer), \u00f6zel mod\u00fclleriniz i\u00e7in bir dizin olu\u015fturun ve ard\u0131ndan komutlar\u0131n\u0131z\u0131 i\u00e7erecek mod\u00fcl\u00fcn\u00fcz\u00fc olu\u015fturun. \u00d6rne\u011fin, <code>mymodule<\/code> ad\u0131nda bir mod\u00fcl olu\u015fturaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/html\/drupal\/web # Drupal k\u00f6k dizinine gidin\nmkdir -p modules\/custom\/mymodule\/src\/Commands<\/code><\/pre>\n<p>Bu komut, <code>mymodule<\/code> i\u00e7in gerekli dizin yap\u0131s\u0131n\u0131 olu\u015fturur: <code>modules\/custom\/mymodule<\/code> ve komut s\u0131n\u0131f\u0131m\u0131z\u0131n yer alaca\u011f\u0131 <code>src\/Commands<\/code>.<\/p>\n<h3>A\u015fama 2: <code>mymodule.info.yml<\/code> Dosyas\u0131 Olu\u015fturma<\/h3>\n<p>Her Drupal mod\u00fcl\u00fc gibi, \u00f6zel Drush komut mod\u00fcl\u00fcn\u00fcz\u00fcn de bir <code>.info.yml<\/code> dosyas\u0131na ihtiyac\u0131 vard\u0131r. Bu dosya, Drupal&#8217;a mod\u00fcl\u00fcn\u00fcz hakk\u0131nda temel bilgileri sa\u011flar.<\/p>\n<pre><code class=\"language-yaml\"># modules\/custom\/mymodule\/mymodule.info.yml\nname: 'My Custom Drush Commands'\ntype: module\ndescription: 'Provides custom Drush commands for specific tasks.'\ncore_version_requirement: ^9 || ^10\npackage: 'Custom'\n<\/code><\/pre>\n<p>Bu dosyay\u0131 <code>modules\/custom\/mymodule\/mymodule.info.yml<\/code> yoluna kaydedin.<\/p>\n<h3>A\u015fama 3: <code>drush.services.yml<\/code> Dosyas\u0131 Olu\u015fturma<\/h3>\n<p>Bu dosya, Drush&#8217;a komut s\u0131n\u0131f\u0131n\u0131z\u0131n bir servis olarak nas\u0131l y\u00fcklenece\u011fini bildirir. Bu, Drush&#8217;\u0131n komutlar\u0131n\u0131z\u0131 bulmas\u0131 ve \u00e7al\u0131\u015ft\u0131rmas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-yaml\"># modules\/custom\/mymodule\/drush.services.yml\nservices:\n  mymodule.commands:\n    class: Drupal\\mymodule\\Commands\\MyModuleCommands\n    tags:\n      - { name: drush.command }\n<\/code><\/pre>\n<p>Bu dosyay\u0131 <code>modules\/custom\/mymodule\/drush.services.yml<\/code> yoluna kaydedin. <code>class<\/code> anahtar\u0131, komut s\u0131n\u0131f\u0131n\u0131z\u0131n tam nitelikli ad\u0131n\u0131 (namespace dahil) belirtir. <code>tags: - { name: drush.command }<\/code> k\u0131sm\u0131 ise Drush&#8217;a bu servisin bir Drush komut servisi oldu\u011funu s\u00f6yler.<\/p>\n<h3>A\u015fama 4: Komut S\u0131n\u0131f\u0131n\u0131 Yazma (<code>src\/Commands\/MyModuleCommands.php<\/code>)<\/h3>\n<p>\u015eimdi as\u0131l komut mant\u0131\u011f\u0131m\u0131z\u0131 i\u00e7eren PHP s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f, <code>DrushCommands<\/code> s\u0131n\u0131f\u0131n\u0131 extend etmeli ve komut metodlar\u0131n\u0131 i\u00e7ermelidir.<\/p>\n<pre><code class=\"language-php\"><?php\n\nnamespace Drupal\\mymodule\\Commands;\n\nuse Drush\\Commands\\DrushCommands;\n\n\/<em><\/em>\n * Defines Drush commands for the MyModule module.\n *\/\nclass MyModuleCommands extends DrushCommands {\n\n  \/<em><\/em>\n   * Says hello to the user.\n   *\n   * @command mymodule:hello\n   * @aliases mh\n   * @usage mymodule:hello\n   *   Says hello to the current user.\n   *\/\n  public function hello() {\n    $this->say(\"Merhaba, Drush komutlar\u0131 d\u00fcnyas\u0131na ho\u015f geldiniz!\");\n  }\n\n  \/<em><\/em>\n   * Greets a specified person.\n   *\n   * @command mymodule:greet\n   * @param string $name The name of the person to greet.\n   * @option string $salutation The salutation to use (e.g., \"Hello\", \"Hi\").\n   * @aliases mg\n   * @usage mymodule:greet John --salutation=\"Selam\"\n   *   Greets John with a custom salutation.\n   *\/\n  public function greet($name, $options = ['salutation' => 'Merhaba']) {\n    $salutation = $options['salutation'];\n    $this->say(\"$salutation, $name!\");\n  }\n\n}\n<\/code><\/pre>\n<p>Bu dosyay\u0131 <code>modules\/custom\/mymodule\/src\/Commands\/MyModuleCommands.php<\/code> yoluna kaydedin.<\/p>\n<ul>\n<li><code>namespace Drupal\\mymodule\\Commands;<\/code>: Mod\u00fcl\u00fcn\u00fcz\u00fcn namespace&#8217;ini tan\u0131mlar.<\/li>\n<li><code>use Drush\\Commands\\DrushCommands;<\/code>: Drush komutlar\u0131 i\u00e7in temel s\u0131n\u0131f\u0131 import eder.<\/li>\n<li><code>class MyModuleCommands extends DrushCommands<\/code>: Komut s\u0131n\u0131f\u0131m\u0131z\u0131n <code>DrushCommands<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretildi\u011fini belirtir.<\/li>\n<li><code>@command mymodule:hello<\/code>: Bu anotasyon, <code>hello()<\/code> metodunu <code>mymodule:hello<\/code> olarak \u00e7a\u011fr\u0131labilecek bir Drush komutu olarak tan\u0131mlar.<\/li>\n<li><code>@aliases mh<\/code>: Komut i\u00e7in k\u0131sa bir takma ad tan\u0131mlar.<\/li>\n<li><code>@usage<\/code>: Komutun nas\u0131l kullan\u0131laca\u011f\u0131na dair bir \u00f6rnek sunar.<\/li>\n<li><code>$this->say()<\/code>: Drush&#8217;\u0131n \u00e7\u0131kt\u0131y\u0131 kullan\u0131c\u0131ya g\u00f6stermek i\u00e7in kulland\u0131\u011f\u0131 standart bir metottur.<\/li>\n<li><code>@param<\/code> ve <code>@option<\/code>: Komutun alaca\u011f\u0131 arg\u00fcmanlar\u0131 ve se\u00e7enekleri tan\u0131mlar. Drush, bu anotasyonlara g\u00f6re komut sat\u0131r\u0131 girdilerini otomatik olarak PHP metodunuzdaki parametrelerle e\u015fle\u015ftirir.<\/li>\n<\/ul>\n<h2>Geli\u015fmi\u015f Komut \u00d6zellikleri ve Pratik Kullan\u0131m<\/h2>\n<p>Sadece basit mesajlar g\u00f6stermek yerine, Drush komutlar\u0131n\u0131z\u0131 Drupal API&#8217;si ile etkile\u015fim kurarak \u00e7ok daha g\u00fc\u00e7l\u00fc hale getirebilirsiniz.<\/p>\n<h3>Servis Enjeksiyonu<\/h3>\n<p>Drush komut s\u0131n\u0131flar\u0131n\u0131zda, Drupal&#8217;\u0131n servislerini (veritaban\u0131, yap\u0131land\u0131rma, varl\u0131k y\u00f6neticisi vb.) kullanmak olduk\u00e7a yayg\u0131nd\u0131r. Bunu yapmak i\u00e7in constructor injection (yap\u0131c\u0131 enjeksiyonu) kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code class=\"language-php\"><?php\n\nnamespace Drupal\\mymodule\\Commands;\n\nuse Drush\\Commands\\DrushCommands;\nuse Drupal\\Core\\Logger\\LoggerChannelFactoryInterface;\nuse Drupal\\Core\\Entity\\EntityTypeManagerInterface;\n\n\/<em><\/em>\n * Defines Drush commands for the MyModule module with service injection.\n *\/\nclass MyModuleCommands extends DrushCommands {\n\n  \/<em><\/em>\n   * The logger channel factory.\n   *\n   * @var \\Drupal\\Core\\Logger\\LoggerChannelFactoryInterface\n   *\/\n  protected $loggerFactory;\n\n  \/<em><\/em>\n   * The entity type manager.\n   *\n   * @var \\Drupal\\Core\\Entity\\EntityTypeManagerInterface\n   *\/\n  protected $entityTypeManager;\n\n  \/<em><\/em>\n   * Constructs a MyModuleCommands object.\n   *\n   * @param \\Drupal\\Core\\Logger\\LoggerChannelFactoryInterface $logger_factory\n   *   The logger channel factory.\n   * @param \\Drupal\\Core\\Entity\\EntityTypeManagerInterface $entity_type_manager\n   *   The entity type manager.\n   *\/\n  public function __construct(LoggerChannelFactoryInterface $logger_factory, EntityTypeManagerInterface $entity_type_manager) {\n    parent::__construct();\n    $this->loggerFactory = $logger_factory;\n    $this->entityTypeManager = $entity_type_manager;\n  }\n\n  \/<em><\/em>\n   * Creates a test node.\n   *\n   * @command mymodule:create-test-node\n   * @option string $title The title of the node.\n   * @aliases mctn\n   * @usage mymodule:create-test-node --title=\"My Test Node\"\n   *   Creates a new 'article' node with the given title.\n   *\/\n  public function createTestNode($options = ['title' => 'Default Test Node Title']) {\n    try {\n      $node = $this->entityTypeManager->getStorage('node')->create([\n        'type' => 'article',\n        'title' => $options['title'],\n        'uid' => 1, \/\/ Admin user\n        'status' => 1, \/\/ Published\n      ]);\n      $node->save();\n      $this->say(\"Yeni makale olu\u015fturuldu: \" . $node->getTitle() . \" (NID: \" . $node->id() . \")\");\n      $this->loggerFactory->get('mymodule')->info('Yeni makale olu\u015fturuldu: {title} (NID: {nid})', [\n        'title' => $node->getTitle(),\n        'nid' => $node->id(),\n      ]);\n    }\n    catch (\\Exception $e) {\n      $this->loggerFactory->get('mymodule')->error('Makale olu\u015fturulurken hata olu\u015ftu: {message}', ['message' => $e->getMessage()]);\n      $this->say(\"Hata: \" . $e->getMessage());\n    }\n  }\n\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>LoggerChannelFactoryInterface<\/code> ve <code>EntityTypeManagerInterface<\/code> servisleri, yap\u0131c\u0131 metot (<code>__construct<\/code>) arac\u0131l\u0131\u011f\u0131yla enjekte edilir.<\/li>\n<li><code>createTestNode<\/code> komutu, <code>EntityTypeManagerInterface<\/code> kullanarak yeni bir &#8220;article&#8221; (makale) i\u00e7erik tipi olu\u015fturur.<\/li>\n<li><code>LoggerChannelFactoryInterface<\/code> kullan\u0131larak Drupal loglar\u0131na mesajlar yaz\u0131l\u0131r. Bu, hata ay\u0131klama ve denetim i\u00e7in \u00e7ok \u00f6nemlidir.<\/li>\n<\/ul>\n<h3>Veritaban\u0131 \u0130\u015flemleri<\/h3>\n<p>Do\u011frudan veritaban\u0131 sorgular\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>\\Drupal::database()<\/code> servisini kullanabilirsiniz. Ancak m\u00fcmk\u00fcn oldu\u011funca Drupal&#8217;\u0131n Entity API&#8217;sini veya Query API&#8217;sini kullanman\u0131z \u00f6nerilir, \u00e7\u00fcnk\u00fc bu daha g\u00fcvenli ve gelece\u011fe d\u00f6n\u00fck bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code class=\"language-php\">  \/<em><\/em>\n   * Updates a specific field for a node.\n   *\n   * @command mymodule:update-node-status\n   * @param int $nid The node ID to update.\n   * @param int $status The new status (0 for unpublished, 1 for published).\n   * @usage mymodule:update-node-status 5 0\n   *   Unpublishes node with NID 5.\n   *\/\n  public function updateNodeStatus($nid, $status) {\n    if (!is_numeric($nid) || !is_numeric($status) || ($status != 0 && $status != 1)) {\n      $this->logger()->error('Ge\u00e7ersiz NID veya durum girildi.');\n      return;\n    }\n\n    try {\n      $node = $this->entityTypeManager->getStorage('node')->load($nid);\n      if (!$node) {\n        $this->say(\"NID $nid bulunamad\u0131.\");\n        return;\n      }\n      $node->set('status', (bool) $status);\n      $node->save();\n      $this->say(\"NID $nid durumu g\u00fcncellendi: \" . ($status ? 'Yay\u0131nland\u0131' : 'Yay\u0131nlanmad\u0131'));\n    }\n    catch (\\Exception $e) {\n      $this->logger()->error('D\u00fc\u011f\u00fcm durumu g\u00fcncellenirken hata olu\u015ftu: {message}', ['message' => $e->getMessage()]);\n      $this->say(\"Hata: \" . $e->getMessage());\n    }\n  }\n<\/code><\/pre>\n<p>Bu \u00f6rnek, <code>entityTypeManager<\/code> kullanarak belirli bir d\u00fc\u011f\u00fcm\u00fcn yay\u0131nlanma durumunu g\u00fcnceller. Bu, do\u011frudan SQL sorgular\u0131 yazmaktan daha g\u00fcvenli ve Drupal&#8217;\u0131n varl\u0131k ya\u015fam d\u00f6ng\u00fcs\u00fcne uygun bir yoldur.<\/p>\n<h3>Kullan\u0131c\u0131dan Girdi Alma<\/h3>\n<p>Komutlar\u0131n\u0131z\u0131 interaktif hale getirmek i\u00e7in kullan\u0131c\u0131dan girdi alabilirsiniz:<\/p>\n<pre><code class=\"language-php\">  \/<em><\/em>\n   * Asks for user confirmation.\n   *\n   * @command mymodule:confirm-action\n   * @usage mymodule:confirm-action\n   *   Asks the user for confirmation before proceeding.\n   *\/\n  public function confirmAction() {\n    if ($this->io()->confirm('Bu i\u015flemi yapmak istedi\u011finizden emin misiniz?')) {\n      $this->say('\u0130\u015flem onayland\u0131. Devam ediliyor...');\n      \/\/ Ger\u00e7ek i\u015flemi burada yap\u0131n.\n    } else {\n      $this->say('\u0130\u015flem iptal edildi.');\n    }\n  }\n<\/code><\/pre>\n<p><code>$this->io()->confirm()<\/code> metodu, kullan\u0131c\u0131ya bir soru sorar ve &#8220;evet&#8221; veya &#8220;hay\u0131r&#8221; yan\u0131t\u0131na g\u00f6re boolean bir de\u011fer d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h2>VPS Ortam\u0131nda Komutlar\u0131 Test Etme ve Da\u011f\u0131tma<\/h2>\n<p>VPS&#8217;inizde komutlar\u0131 olu\u015fturduktan sonra, bunlar\u0131 etkinle\u015ftirmeniz ve test etmeniz gerekir.<\/p>\n<h3>Mod\u00fcl\u00fc Etkinle\u015ftirme<\/h3>\n<p>Drush komutlar\u0131n\u0131z\u0131n Drupal taraf\u0131ndan tan\u0131nmas\u0131 i\u00e7in \u00f6ncelikle mod\u00fcl\u00fcn\u00fcz\u00fc etkinle\u015ftirmeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">drush en mymodule -y<\/code><\/pre>\n<p>Bu komut, <code>mymodule<\/code>&#8216;\u00fc etkinle\u015ftirir. <code>-y<\/code> se\u00e7ene\u011fi, onay istemlerini atlar.<\/p>\n<h3>Drush \u00d6nbelle\u011fini Temizleme<\/h3>\n<p>Yeni Drush komutlar\u0131 ekledikten veya mevcut komutlar\u0131 de\u011fi\u015ftirdikten sonra Drush&#8217;\u0131n \u00f6nbelle\u011fini temizlemek <strong>mutlaka gereklidir<\/strong>. Aksi takdirde Drush yeni komutlar\u0131n\u0131z\u0131 bulamaz.<\/p>\n<pre><code class=\"language-bash\">drush cr<\/code><\/pre>\n<h3>Komutu \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Art\u0131k komutlar\u0131n\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">drush mymodule:hello\ndrush mymodule:greet 'Alice' --salutation='Hello there'\ndrush mymodule:create-test-node --title=\"My Drush Node\"\ndrush mymodule:update-node-status 10 0 # NID 10'u yay\u0131nlamadan kald\u0131r\ndrush mymodule:confirm-action\n<\/code><\/pre>\n<p>T\u00fcm mevcut Drush komutlar\u0131n\u0131z\u0131 g\u00f6rmek i\u00e7in <code>drush list<\/code> komutunu kullanabilirsiniz. Kendi komutlar\u0131n\u0131z da bu listede yer almal\u0131d\u0131r.<\/p>\n<h3>Hata Ay\u0131klama \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li><strong><code>drush cr<\/code>:<\/strong> Yeni kod de\u011fi\u015fikliklerinden sonra her zaman \u00f6nbelle\u011fi temizleyin.<\/li>\n<li><strong>PHP Hata Kay\u0131tlar\u0131:<\/strong> VPS&#8217;inizin PHP hata kay\u0131tlar\u0131n\u0131 (genellikle <code>\/var\/log\/apache2\/error.log<\/code> veya <code>\/var\/log\/nginx\/error.log<\/code> gibi bir yerde) kontrol edin.<\/li>\n<li><strong>Drush Hata Ay\u0131klama:<\/strong> <code>drush -vvv mymodule:my-command<\/code> komutu, daha ayr\u0131nt\u0131l\u0131 \u00e7\u0131kt\u0131 vererek sorunlar\u0131 tespit etmenize yard\u0131mc\u0131 olabilir.<\/li>\n<li><strong><code>$this->logger()->error()<\/code>:<\/strong> Komutlar\u0131n\u0131zda hata mesajlar\u0131n\u0131 Drupal&#8217;\u0131n log sistemine yazmak, sorunlar\u0131 izlemek i\u00e7in en iyi y\u00f6ntemdir.<\/li>\n<\/ul>\n<h3>Da\u011f\u0131t\u0131m Stratejileri<\/h3>\n<p>VPS ortam\u0131nda, \u00f6zel Drush komut mod\u00fcllerinizi da\u011f\u0131tmak i\u00e7in genellikle Git tabanl\u0131 bir i\u015f ak\u0131\u015f\u0131 kullan\u0131l\u0131r. Mod\u00fcl\u00fcn\u00fcz\u00fc bir Git deposuna ekleyin ve sunucunuzda bu depoyu \u00e7ekerek g\u00fcncellemeleri uygulay\u0131n. Da\u011f\u0131t\u0131m sonras\u0131 her zaman <code>drush en mymodule -y<\/code> (ilk da\u011f\u0131t\u0131m i\u00e7in) ve <code>drush cr<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmay\u0131 unutmay\u0131n.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Kendi Drush komutlar\u0131n\u0131z\u0131 tan\u0131mlamak, Drupal geli\u015ftirme ve y\u00f6netim s\u00fcre\u00e7lerinizde size inan\u0131lmaz bir g\u00fc\u00e7 ve esneklik sa\u011flar. Bu rehberde \u00f6\u011frendi\u011finiz ad\u0131mlar\u0131 takip ederek, tekrarlayan g\u00f6revleri otomatikle\u015ftirebilir, Drupal API&#8217;si ile derinlemesine etkile\u015fim kurabilir ve VPS ortam\u0131n\u0131zda verimlili\u011finizi art\u0131rabilirsiniz. Drush&#8217;\u0131n sundu\u011fu imkanlar\u0131 ke\u015ffetmekten \u00e7ekinmeyin ve kendi \u00f6zel \u00e7\u00f6z\u00fcmlerinizi yarat\u0131n.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>1. Drush komutum neden \u00e7al\u0131\u015fm\u0131yor?<\/strong><\/p>\n<p>En yayg\u0131n nedenler \u015funlard\u0131r: mod\u00fcl\u00fcn\u00fcz etkinle\u015ftirilmemi\u015ftir (<code>drush en mymodule -y<\/code>), Drush \u00f6nbelle\u011fi temizlenmemi\u015ftir (<code>drush cr<\/code>), <code>drush.services.yml<\/code> dosyan\u0131zda veya komut s\u0131n\u0131f\u0131n\u0131z\u0131n namespace&#8217;inde\/ad\u0131nda bir hata vard\u0131r. Ayr\u0131ca PHP s\u00f6zdizimi hatalar\u0131 da komutun y\u00fcklenmesini engelleyebilir; PHP hata g\u00fcnl\u00fcklerinizi kontrol edin.<\/p>\n<p><strong>2. Komutuma nas\u0131l parametre veya se\u00e7enek eklerim?<\/strong><\/p>\n<p><code>@param<\/code> anotasyonu ile zorunlu arg\u00fcmanlar\u0131 (\u00f6rne\u011fin <code>mymodule:greet <name><\/code>) ve <code>@option<\/code> anotasyonu ile iste\u011fe ba\u011fl\u0131 se\u00e7enekleri (\u00f6rne\u011fin <code>mymodule:greet --salutation=\"Hello\"<\/code>) tan\u0131mlayabilirsiniz. Metod imzas\u0131nda bunlar\u0131 PHP parametreleri olarak belirtmeniz gerekir.<\/p>\n<p><strong>3. Veritaban\u0131 ile nas\u0131l etkile\u015fim kurar\u0131m?<\/strong><\/p>\n<p>Do\u011frudan SQL sorgular\u0131 i\u00e7in <code>\\Drupal::database()<\/code> servisini kullanabilirsiniz. Ancak Drupal&#8217;\u0131n varl\u0131klar\u0131n\u0131 (node, user vb.) de\u011fi\u015ftirmek veya olu\u015fturmak i\u00e7in <code>EntityTypeManagerInterface<\/code> servisini kullanmak daha g\u00fcvenli ve \u00f6nerilen y\u00f6ntemdir. Yap\u0131c\u0131 enjeksiyonu ile bu servisi komut s\u0131n\u0131f\u0131n\u0131za dahil edebilirsiniz.<\/p>\n<p><strong>4. Komutumu ba\u015fka bir mod\u00fclden veya koddan \u00e7a\u011f\u0131rabilir miyim?<\/strong><\/p>\n<p>Evet, Drush komutlar\u0131n\u0131z\u0131 do\u011frudan PHP kodunuzdan \u00e7a\u011f\u0131rabilirsiniz. Bunun i\u00e7in <code>Drush\\Drush::drush()<\/code> statik metodunu kullanabilirsiniz. \u00d6rne\u011fin: <code>Drush\\Drush::drush('mymodule:hello');<\/code>. Ancak, bir komutun mant\u0131\u011f\u0131n\u0131 ba\u015fka bir yerden \u00e7a\u011f\u0131racaksan\u0131z, o mant\u0131\u011f\u0131 ayr\u0131 bir servise ta\u015f\u0131y\u0131p hem Drush komutundan hem de di\u011fer koddan bu servisi kullanmak daha iyi bir tasar\u0131m prati\u011fidir.<\/p>\n<p><strong>5. Drush komutlar\u0131 g\u00fcvenli midir?<\/strong><\/p>\n<p>Drush komutlar\u0131 genellikle sunucuya SSH eri\u015fimi olan yetkili kullan\u0131c\u0131lar taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 i\u00e7in g\u00fcvenlik riski d\u00fc\u015f\u00fckt\u00fcr. Ancak, komutlar\u0131n\u0131z\u0131 yazarken her zaman g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 (girdi do\u011frulama, yetkilendirme kontrol\u00fc, do\u011fru API kullan\u0131m\u0131) takip etmelisiniz. Asla do\u011frudan kullan\u0131c\u0131 girdisini SQL sorgular\u0131na enjekte etmeyin.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Drush, Drupal geli\u015ftiricilerinin ve sistem y\u00f6neticilerinin g\u00fcnl\u00fck i\u015flerini otomatikle\u015ftirmek, y\u00f6netmek ve h\u0131zland\u0131rmak i\u00e7in kulland\u0131\u011f\u0131","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-38375","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>Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi - 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\/drush-komutlarinin-yapisi-ve-anatomisi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi\" \/>\n<meta property=\"og:description\" content=\"Drush, Drupal geli\u015ftiricilerinin ve sistem y\u00f6neticilerinin g\u00fcnl\u00fck i\u015flerini otomatikle\u015ftirmek, y\u00f6netmek ve h\u0131zland\u0131rmak i\u00e7in kulland\u0131\u011f\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-29T19:41:27+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=\"4 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi\",\"datePublished\":\"2026-01-29T19:41:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\"},\"wordCount\":1623,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\",\"name\":\"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-29T19:41:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi\"}]},{\"@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":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi - 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\/drush-komutlarinin-yapisi-ve-anatomisi\/","og_locale":"tr_TR","og_type":"article","og_title":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi","og_description":"Drush, Drupal geli\u015ftiricilerinin ve sistem y\u00f6neticilerinin g\u00fcnl\u00fck i\u015flerini otomatikle\u015ftirmek, y\u00f6netmek ve h\u0131zland\u0131rmak i\u00e7in kulland\u0131\u011f\u0131","og_url":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-29T19:41:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"4 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi","datePublished":"2026-01-29T19:41:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/"},"wordCount":1623,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/","url":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/","name":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-29T19:41:27+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/drush-komutlarinin-yapisi-ve-anatomisi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Drush Komutlar\u0131n\u0131n Yap\u0131s\u0131 ve Anatomisi"}]},{"@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\/38375","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=38375"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38375\/revisions"}],"predecessor-version":[{"id":38376,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38375\/revisions\/38376"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}