Composer: Autoload Sınıf Yükleme

Bir önceki yazımda; "Composer'ın nedir, ne işe yarar?" konusundan bahsetmiştim. Bu yazımda ise composer'da autoload'ların nasıl tanımlanacağından bahsedeceğim.

Composer ile 4 farklı autoload tanımlaması yapabilirsiniz.

  1. PSR-4
  2. Classmap
  3. files
  4. PSR-0
 

PSR-4 Standartlarında Autoload:

{
    "autoload": {
        "psr-4": {
            "Illuminate\\": "src/Illuminate/"
        }
    }
}

Yukarıdaki örnek: laravel paketlerinin autoload tanımlamasıdır. Illuminate\ adında sağlayıcı adı kullanılmıştır ve bu namepace'in dizin(klasör) karşığı "src/Illuminate" olarak ayarlanmıştır.

Aşağıdaki örnekte bir nesne oluşturdum ve yukarıdaki PSR-4 autload tanımlamasındaki dizin karşılığını belirttim.

new \Illuminate\Auth\AuthManger;
  • src
    • Illuminate
      • Auth
        • AuthManager.php

Aynı namespace'i birden fazla dizine tanımlayabilrsiniz.

{
    "autoload": {
        "psr-4": {
            "Illuminate\\": ["src/Illuminate/", "lib/"]
        }
    }
}

Yukarıdaki örnekte Illuminate\ namespace'ini hem "src/Illuminate" dizinine hemde "lib" dizinine tanımladım. Dizinleri ","  karakteri ile istediğiniz kadar çoğaltabilirsiniz.

new \Illuminate\Database\Connect;
  • src
    • Illuminate
      • Auth
        • AuthManager.php
  • lib
    • Database
      • Connect.php

Alt namespace ekleyebileceğiniz gibi namespace kısmını, global de bırakabilirsiniz.

{
    "autoload": {
        "psr-4": {
            "": ["lib/"]
        }
    }
}

OOP geliştiriclerin bir çoğu namespace'lerine özel bir isim(sağlayıcı adı) vermektedir. Bu psr-4 standartlarında da yer almaktadır. Ama tabi verip vermemek size kalmış.

new \Database\Connect;
  • lib
    • Database
      • Connect.php

Classmap

{
"autoload": {
			"classmap": [
			"app/commands",
			"app/controllers",
			"app/models",
			"app/library"
			]
			}
}

Namespace tanımlamadığınız sınıfların dizin konumunu classmap anahtarıyla tanımlayabilirsiniz.

Files

{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

Namespace tanımlamadığınız sınıfların tam adresini files anahtarıyla tanımlayabilirsiniz.
Bunların dışında PSR-0 tanımlaması da vardır. Artık kullanılmadığı için yazıma dahil etmedim. 

Son olarak testleriniz için ayrı autload tanımlaması da yapabilirsiniz. Yukarıdaki işlemlerin hepsi autoload-dev anahrarı için geçerlidir.

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" }
    }
}

Daha detaylı bilgi almak istiyorsanız bu sayfayı inceleyebilirsiniz.

Kendinize iyi bakın :)


Kategoriler: PHP