Sobes.tech
Middle

Mis on sõltuvuste süstimine ja kuidas seda rakendatakse PHP arenduses?

sobes.tech AI

Vastus AI-lt

Sõltuvuste rakendamine (DI) on disainimuster, mis võimaldab ühel objektil saada sõltuvusi teiselt objektilt või raamistikult, mitte neid ise luua. See lihtsustab klasside sõltuvuste haldamist ning muudab koodi paindlikumaks, testitavamaks ja hooldatavamaks.

PHP-s kasutatakse DI-d:

  • Seotuduse vähendamine (coupling): Klassid ei ole rangelt seotud konkreetsete teostustega.
  • Ühiku testimise lihtsustamine: Reaalsete sõltuvuste asendamine mock-objektidega testimiseks on lihtne.
  • Paindlikkuse ja laiendatavuse suurendamine: Sõltuvuste teostusi on lihtne muuta või asendada ilma klassi, mis neid kasutab, muutmata.

On kolm peamist lähenemisviisi sõltuvuste rakendamiseks:

  1. Konstruktoriga (Constructor Injection): Sõltuvused edastatakse klassi konstruktorile argumentidena. See on kõige eelistatum, kuna tagab vajalike sõltuvuste olemasolu objekti loomisel.

    <?php
    class DatabaseConnection
    {
        // Andmebaasi ühenduse üksikasjad
    }
    
    class UserRepository
    {
        private DatabaseConnection $db;
    
        public function __construct(DatabaseConnection $db)
        {
            $this->db = $db;
        }
    
        // Repositooriumi meetodid
    }
    
    // Objekti loomine sõltuvusega
    $db = new DatabaseConnection();
    $userRepository = new UserRepository($db);
    
  2. Setteri kaudu (Setter Injection): Sõltuvused sisestatakse avalike setter-meetodite kaudu. See võimaldab teha sõltuvused valikulisteks.

    <?php
    class Logger
    {
        // Logimine
    }
    
    class UserService
    {
        private ?Logger $logger = null; // Valikuline sõltuvus
    
        public function setLogger(Logger $logger): void
        {
            $this->logger = $logger;
        }
    
        public function doSomething(): void
        {
            if ($this->logger) {
                $this->logger->log("Midagi tehakse...");
            }
            // Põhilogika
        }
    }
    
    // Objekti loomine ja valikulise sõltuvuse sisestamine
    $userService = new UserService();
    $logger = new Logger();
    $userService->setLogger($logger);
    
  3. Interfeisi kaudu (Interface Injection): Klass, millele sõltuvus on vajalik, rakendab liidest, mis määratleb meetodi selle sõltuvuse seadmiseks. PHP-s on see vähem levinud kui esimesed kaks.

Populaarsed DI konteinerid:

  • PHP-DI
  • Symfony\DependencyInjection
  • Laravel Service Container (Laravelisse kuulub)

Konteineri kasutamine:

<?php
// Pseudo-konteineri näide
// Tavaliselt konfigureeritakse konteiner konfiguratsiooni abil (YAML, PHP massiivid ja muud)

// Konteineri konfiguratsioon (lihtsustatud)
$container->set(DatabaseConnection::class, function() {
    return new DatabaseConnection(); // Objekti loomine
});

$container->set(UserRepository::class, function($container) {
    // Sõltuvuse sisestamine läbi konteineri
    return new UserRepository($container->get(DatabaseConnection::class));
});

// Objekti saamine konteinerist — konteiner ise loob ja sisestab sõltuvused
$userRepository = $container->get(UserRepository::class);

Lõpuks on PHP-s sõltuvuste rakendamine põhinev muster, mis võimaldab luua paindlikku, testitavat ja hooldatavat koodi, eriti suurtes projektides ja raamistikute kasutamisel.