Autor Zpráva
midlan
Profil
Ahoj.
Postupně jsem začal přicházet na kouzlo dependecy injection a zalíbilo se mi tak, že ho nasazuji úplně všude. Jen jsem teď narazil na problém, Nevím jak předat kofigurační údaje mysql, smpt apod. abych neporušil dependency injection. Nejradši bych je měl uložené někde v externích konfiguračních souborech, ale nenapdá mě jak to skloubit s dependecy injection. Věděl by někdo? Díky.

Moderátor Majkl578: Titulek „dependency injection“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
Majkl578
Profil
midlan:
ale nenapdá mě jak to skloubit s dependecy injection
Poměrně jednoduše. Konfiguraci předáš objektu konstruktorem.
midlan
Profil
Majkl578:
ale to už nebudou v externím souboru...
Jan Tvrdík
Profil
midlan:
Nic ti nebrání je do externího souboru umístit a composition rootu je z něj načíst.
Majkl578
Profil
Proč by nemohly být?
Není přeci důležité, jak a odkud konfigurace pochází. Důležité je, že v moment, kdy to bude potřeba, budou dostupné.
Pokud znáš Nette Framework, tam se toto samozřejmě řeší také pomocí konfiguračních souborů. V určitou chvíli dojde k načtení konfigurace a k následnému sestavení objektového grafu (v tzv. composition rootu aplikace), kdy se každá služba vytvoří na základě v konfiguraci nadefinovaných pravidel.
Pokud chceš používat dependency injection, velmi doporučuji podívat se na nějaký kvalitní framework, který tuto techniku používá, ať už zmíněné Nette nebo Symfony. Každopádně doporučuji podívat se do dokumentace Nette, alespoň pro inspiraci, jak to lze řešit: Konfigurace a Dependency Injection.
midlan
Profil
Jan Tvrdík:
Moc nechápu ten composition root, mohl byste mi to trochu objasnit?
Majkl578:
Není přeci důležité, jak a odkud konfigurace pochází. Důležité je, že v moment, kdy to bude potřeba, budou dostupné.
Není tohle náhodou přesný opak dependency injection? Při správném dependecy injection by mělo být i nezasvěceným jasné kde se data berou.
composition rootu
Jak píšeu výše tohle nechápu.

Každopádně doporučuji podívat se do dokumentace Nette, alespoň pro inspiraci, jak to lze řešit: Konfigurace a Dependency Injection.
Nette nepoužívám, ale ten článek o DI jsem četl už předtím. V tom článku konfigurace moc nevidím řešení mého problému.
Jan Tvrdík
Profil
midlan:
Moc nechápu ten composition root, mohl byste mi to trochu objasnit?
Používáš-li nějaký DI container, tak je to místo, kde je tento DI container sestaven. Pro jednoduchost budu předpokládat použití triviální DI containeru – Pimple.

// Composition root start
$container = new Pimple();
$container['db_params'] = json_decode(file_get_contents('db_params.json')); // konfigurace v externím souboru
$container['db_connection'] = function ($c) {
    return new mysqli($c['db_params']->host, $c['db_params']->user, $c['db_params']->password, $c['db_params']->database);
};
$container['app'] = function ($c) {
    return new App($c['db_connection']);
};
// Composition root end

$container['app']->start();

Nepoužíváš-li DI container, tak je to místo, kde ručně sestavuješ objektový graf závislostí.

// Composition root start
$dbParams = json_decode(file_get_contents('db_params.json')); // konfigurace v externím souboru;
$dbConnection = new mysqli($dbParams->host, $dbParams->user, $dbParams->password, $dbParams->database);
$app = new App($dbConnection);
// Composition root end

$app->start();

Všimni si, že composition root je jediné místo v aplikaci, kde je z hlediska DI v pořádku vytvářet nové instance pomocí new a používat DI container.
midlan
Profil
Jan Tvrdík:
Omlouvám se za odmlku a děkuji za vysvětlení, už to chápu :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: