Подключение к базе данных MySQL с помощью внедрения зависимостей в переполнении стека

В настоящее время я пытаюсь понять основы инъекций зависимости, и у меня немало проблем.

Хотя я понимаю основную предпосылку его полезности (простота модульного тестирования, удаление жестко запрограммированных классов), я не совсем понимаю, как это работает с базами данных.

По сути, я не могу понять, как я могу подключиться к базе данных, используя технику DI.

Насколько я понимаю, мне пришлось бы передать все переменные через конструктор

Class DatabaseConfiguration
{
private $servername;
private $dbname;
private $dbuser;
private $dbpass;

public function __construct(string $server, string $name, string $user,
string $pass, string $charset){
$this->servername = $server;
$this->dbname = $name;
$this->dbuser = $user;
$this->dbpass = $pass;
$this->dbcharset = $charset;
}

Вот где я застреваю. Я совершенно не знаю, что мне делать дальше, чтобы установить соединение.

Обычно я жестко кодирую значения и затем вызываю функцию, в которой я делаю что-то вроде этого:

public function connectDB(){
try{
$conn = "mysql:host=".$this->servername.";dbname=".$this->dbname.";charset=".$this->dbcharset;
$pdo = new PDO($conn, $this->dbuser, $this->dbpass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}catch(PDOException $e){
echo "Connection failed: ".$e->getMessage();
}
}

Однако я понятия не имею, как это сделать DI.

0

Решение

Чтобы расширить мои комментарии выше, внедрение зависимости включает в себя передачу объектов другим классам, где это необходимо.

Например, скажем, у вас были некоторые модель класс, который требует подключения к базе данных. Одним из вариантов является впрыскивать PDO экземпляр в конструктор, например

class UserModel {
private $conn;

public function __construct(PDO $conn) { // injected here
$this->conn = $conn;
}

В приведенном выше UserModel знает только то, что у него есть PDO экземпляр доступен для него. Он не знает ничего о деталях соединения или конфигурации, и не должен этого делать.

Вы бы тогда использовали это так …

$conn = new PDO(
"mysql:host=${server};dbname=${name};charset=${charset}",
$user,
$pass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);

$user = new UserModel($conn); // dependency provided here

Этот пример использует PDO в качестве зависимости, но то же самое можно применять для любого объекта, который предоставляет API или службу. Пример, иллюстрирующий вашу точку зрения о …

удаление жестко закодированных классов

было бы что-то вроде

interface Foo {
public function getFoo(): string;
}

class FooConsumer {
public function __construct(Foo $foo) { // interface dependency defined here
echo $foo->getFoo();
}
}

class FooImpl implements Foo {
public function getFoo(): string {
return 'foo';
}
}

$foo = new FooImpl();
$consumer = new FooConsumer($foo); // echos "foo"
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector