Özet - Composer
composer.json, require ve autoload'la bağımlılıkları yönetilen bir proje kurarsın.
Özet - Composer
Bu grupta Composer'ın ne olduğunu, yapılandırma dosyasının yapısını, require ile paket eklemeyi, PSR-4 autoload'u, Packagist'ten paket kurmayı ve install/update farkını öğrendin. Ayrıca dump-autoload ile autoloader'ı yeniden üretmeyi gördün. Şimdi bunları birleştirip bağımlılıkları yönetilen küçük bir proje kuracaksın: yapılandırmayı tanımlayıp autoload ile sınıf kullanacaksın.
Bağımlılıkları yönetilen proje iskeleti
Composer'lı bir projede önce yapılandırma dosyası tanımlanır; require bölümüne gerekli paketler eklenir, autoload psr-4 bölümüne namespace eşlemesi yazılır. composer install paketleri kurar ve vendor/autoload.php üretir.
Kod başında require_once vendor/autoload.php çağrılır; bundan sonra use ile içe aktarılan tüm sınıflar otomatik yüklenir.
Uygulama Yapılandırma + autoload + sınıf kullanımı
namespace App; tanımla; içinde Application sınıfı olsun. public string $name özelliği ve public function __construct() metodu $this->name = "shop" atasın. public function name(): string metodu $this->name döndürsün.
Sonra $config = ["name" => "app/shop", "autoload" => ["psr-4" => ["App\\" => "src/"]]] tanımla. $app = new \App\Application() ile örnek oluştur ve $app->name değerini yazdır. En son autoload psr-4 eşlemesini App\ => src/ biçiminde yazdır.
Örnek çözümü göster
string { return $this->name; } } tanımla. $config = ["name" => "app/shop", "autoload" => ["psr-4" => ["App\\" => "src/"]]]; yaz. $app = new \App\Application(); echo $app->name . "\n"; ile özellik değerini yazdır. foreach ($config["autoload"]["psr-4"] as $ns => $path) { echo $ns . " => " . $path . "\n"; } ile eşlemeyi yazdır.
Örnek çözüm:
<?php
namespace App;
class Application {
public string $name;
public function __construct() {
$this->name = "shop";
}
public function name(): string {
return $this->name;
}
}
$config = ["name" => "app/shop", "autoload" => ["psr-4" => ["App\\" => "src/"]]];
$app = new \App\Application();
echo $app->name . "\n";
foreach ($config["autoload"]["psr-4"] as $ns => $path) {
echo $ns . " => " . $path . "\n";
}
Uygulama PSR-4 classmap üretici
composer dump-autoload'un ürettiği classmap'i taklit et. buildClassmap(array $classes, array $map): array fonksiyonu yaz: $classes listesindeki her sınıf için $map üzerinden dön; strpos ile 0 kontrolü yap, eşleşen prefix'i substr ile çıkar, kalan \ işaretlerini str_replace ile / yap, başına base ekle ve sonuna .php koy; sonucu $classmap[$class] olarak kaydet.
$map = ["App\\" => "src/"] ve $classes = ["App\\Models\\User", "App\\Services\\Auth"] tanımla. classmap'i üret ve her satırı App\Models\User => src/Models/User.php biçiminde yazdır.
Örnek çözümü göster
array { $classmap = []; foreach ($classes as $class) { foreach ($map as $prefix => $base) { if (strpos($class, $prefix) === 0) { $relative = substr($class, strlen($prefix)); $relative = str_replace("\\", "/", $relative); $classmap[$class] = $base . $relative . ".php"; break; } } } return $classmap; } yaz. $map = ["App\\" => "src/"]; $classes = ["App\\Models\\User", "App\\Services\\Auth"]; tanımla. $classmap = buildClassmap($classes, $map); foreach ($classmap as $class => $file) { echo $class . " => " . $file . "\n"; } ile yazdır.
Örnek çözüm:
<?php
function buildClassmap(array $classes, array $map): array {
$classmap = [];
foreach ($classes as $class) {
foreach ($map as $prefix => $base) {
if (strpos($class, $prefix) === 0) {
$relative = substr($class, strlen($prefix));
$relative = str_replace("\\", "/", $relative);
$classmap[$class] = $base . $relative . ".php";
break;
}
}
}
return $classmap;
}
$map = ["App\\" => "src/"];
$classes = ["App\\Models\\User", "App\\Services\\Auth"];
$classmap = buildClassmap($classes, $map);
foreach ($classmap as $class => $file) {
echo $class . " => " . $file . "\n";
}
Kendini test et
-
Yapılandırma dosyası neyi tanımlar?
- Yalnızca paket adını
- Bağımlılıkları ve autoload'u
- Veritabanı bağlantı şifresini
- Tarayıcı HTTP başlıklarını
Cevabı göster
Bağımlılıkları ve autoload'u — Doğru. Yapılandırma dosyası require ve autoload'u taşır.