Sobes.tech
Middle

Asılılıqların injeksiyası nədir və PHP-də necə tətbiq olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Asılılıqların inyeksiyası (DI) - bu, bir obyektin digər obyekt və ya çərçivəkdən asılılıqları almağa imkan verən dizayn nümunəsidir, onları öz-özünə yaratmaq yerinə. Bu, sinif asılılıqlarının idarə olunmasını asanlaşdırır və kodu daha çevik, test edilə bilən və dəstəklənən edir.

PHP-də DI istifadə olunur:

  • Əlaqəliliyin azaldılması (coupling): Siniflər öz asılılıqlarının konkret tətbiqlərinə sərt şəkildə bağlı deyil.
  • Vahid testlərin sadələşdirilməsi: Əsasən, real asılılıqları mock obyektlərlə asanlıqla dəyişdirmək mümkündür.
  • Çevik və genişləndirilə bilənlik: Asılılıqların tətbiqlərini dəyişdirmək və ya əvəz etmək, onları istifadə edən sinifi dəyişdirmədən mümkündür.

Asılılıqların inyeksiyası üçün üç əsas yanaşma mövcuddur:

  1. Konstruktor vasitəsilə inyeksiya (Constructor Injection): Asılılıqlar sinifin konstruktoruna arqument kimi ötürülür. Bu, ən üstün üsuldur, çünki obyekt yaradılarkən lazım olan asılılıqların mövcudluğunu təmin edir.

    <?php
    class DatabaseConnection
    {
        // Baza məlumatlarının əlaqə detalları
    }
    
    class UserRepository
    {
        private DatabaseConnection $db;
    
        public function __construct(DatabaseConnection $db)
        {
            $this->db = $db;
        }
    
        // Repository metodları
    }
    
    // Asılılıq inyeksiyası ilə obyektin yaradılması
    $db = new DatabaseConnection();
    $userRepository = new UserRepository($db);
    
  2. Setter vasitəsilə inyeksiya (Setter Injection): Asılılıqlar ümumi istifadə olunan metodlar vasitəsilə inject edilir. Bu, asılılıqları opsional edir.

    <?php
    class Logger
    {
        // Loglama
    }
    
    class UserService
    {
        private ?Logger $logger = null; // Opsional asılılıq
    
        public function setLogger(Logger $logger): void
        {
            $this->logger = $logger;
        }
    
        public function doSomething(): void
        {
            if ($this->logger) {
                $this->logger->log("Nə isə edir...");
            }
            // Əsas loqika
        }
    }
    
    // Obyektin yaradılması və opsional asılılığın inject edilməsi
    $userService = new UserService();
    $logger = new Logger();
    $userService->setLogger($logger);
    
  3. Interfeys vasitəsilə inyeksiya (Interface Injection): Asılılığa ehtiyacı olan sinif, bu asılılığı qoymaq üçün metod təyin edən interfeysi həyata keçirir. PHP-də ilk iki üsulla müqayisədə daha az yaygındır.

Həqiqi PHP tətbiqlərində, çox vaxt Asılılıq İnyeksiya Konteynerləri istifadə olunur. Bunlar, obyektlərin və onların asılılıqlarının yaradılmasını avtomatlaşdıran kitabxanalar və ya çərçivələrdir. Konteyner, sinifin asılılıqlarını analiz edə və avtomatik olaraq lazım olan obyektləri yarada və inject edə bilər.

PHP üçün məşhur DI konteyner nümunələri:

  • PHP-DI
  • Symfony\DependencyInjection
  • Laravel Service Container (Laravel-ə daxildir)

DI konteynerindən istifadə:

<?php
// Pseudo-konteyner nümunəsi
// Adətən, konteyner konfiqurasiya ilə tənzimlənir (YAML, PHP massivləri və s.)

// Konteynerin konfiqurasiyası (sadələşdirilmiş)
$container->set(DatabaseConnection::class, function() {
    return new DatabaseConnection(); // Nümunənin yaradılması
});

$container->set(UserRepository::class, function($container) {
    // DatabaseConnection asılılığını inject edərək UserRepository yaradılması
    return new UserRepository($container->get(DatabaseConnection::class));
});

// Konteynerdən obyektin alınması - konteyner özü asılılıqları yaradacaq və inject edəcək
$userRepository = $container->get(UserRepository::class);

Nəticədə, PHP-də asılılıqların inyeksiyası, çevik, test edilə bilən və dəstəklənən kodun qurulması üçün əsas nümunədir, xüsusən böyük layihələrdə və çərçivələrdən istifadə zamanı.