CodeBlanks Logo Icon CodeBlanks

Özet - Composer

PHP kursu · İleri seviye · Ders 40/92

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

  1. 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.

İleri seviye bölümündeki tüm dersler