POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.
Jestli jste četli jeden z mých předchozích článků, kde jsem publikoval komponentu pro Dependency Injection container (který počítá s tím, že třída v konstruktoru definuje veškeré závislosti), asi nejednoho z vás napadlo, jak předat například konfiguraci pro připojení k databázi.
Mé řešení je takové, že jako závislost požaduji specifický typ konfigurace jako objekt, který je závislý na obecné konfiguraci. Pokud to uvedu na konkrétním případu, že máme třídu Database, která (v rámci příkladu) požaduje v konstruktoru parametry $server, $user, $password, $port a potřebuji, aby byla použitelná v rámci DI kontejeneru, musí záviset na objektu DatabaseConfiguration.
Tedy kód přepíši z:
class Database {
public function __contructor($server, $user, $password, $port) {
// ...
}
}
Na:
class Database {
public function __contructor(DatabaseConfiguration $database_configuration) {
$server = $database_configuration->get("server");
$user = $database_configuration->get("user");
$password = $database_configuration->get("password");
$port = $database_configuration->get("port");
// ...
}
}
Je to na první pohled více psaní, ale získám tím navíc možnost, měnit počet potřebných parametrů, aniž bych musel měnit závislosti konstruktoru i veškeré inicializace třídy, kde parametry běžně předávám.
Na třídu DatabaseConfiguration nyní přešla zodpovědnost za to, že konfigurace obsahuje všechny potřebné parametry.
class DatabaseConfiguration {
private $database_configuration;
public function __contructor(Configuration $configuration) {
$must_have_parameters = ["server", "user", "password", "port"];
$database_configuration = $configuration->get("database");
foreach ($must_have_parameters as $must_have_parameter) {
if (!isset($database_configuration[$must_have_parameter]) {
throw new \Exception("Missing parameter in database configuration: '" . $must_have_parameter . "'.");
}
}
$this->database_configuration = $database_configuration;
}
public function get(string $key) {
return isset($database_configuration[$key]) ? $database_configuration[$key] : false;
}
}
Třída Configuration je v mojí nové komponentě, které se stará o to, že zpracuje konfigurační soubory. Podrobnější dokumentace o tom, jak Configuration použít je popsaná na github.com/gephart/configuration.
Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)