Php mixing singleton с инъекцией зависимостей

Я оказался в ситуации, когда не уверен, куда идти. До сих пор я использую инъекцию зависимостей, где я передаю объект PDO в качестве зависимости.

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

class Context
{
 private $Pdo;

 function __construct(PDO $Pdo) {
 $this->Pdo = $Pdo;
 }

 function CurrentUser(){
 if ($this->CurrentUser == null){
 // get user logic 
 $this->CurrentUser = User;
 }
 return $this->CurrentUser;
 }
}

Поэтому каждый раз, когда я хотел бы получить текущего пользователя, мне нужно было бы сделать что-то вроде этого:

$Context = new Context($Pdo);
$User = $Context->CurrentUser();

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

Я мог бы сделать одноэлементный класс для получения объекта PDO в любом месте и использовать его в своем классе Context. Будет ли это хорошим aproach? Или дизайн фабрики будет лучше?

До сих пор я использовал глобальные в таких случаях, но, вероятно, я бы хотел избежать этого, поскольку проект быстро растет.

1 ответ

Я мог бы сделать одноэлементный класс для получения объекта PDO в любом месте и использовать его в своем классе Context. Будет ли это хорошим aproach? Или дизайн фабрики будет лучше?

Ну, Singleton и Factory на самом деле не то же самое, и ваши особые потребности должны диктовать решение.

Вот краткое резюме более углубленного сообщения:

Шаблон Singleton ограничивает экземпляр класса одним объектом. Это обеспечивает единую точку доступа по всему приложению и гарантирует, что вы всегда имеете дело с одним и тем же объектом.

Шаблон Factory предоставляет новый экземпляр объекта всякий раз, когда он вызывается. Это может быть или не быть одним и тем же экземпляром. По сути, фабрика определяет интерфейс для создания объектов.

Таким образом, ваши потребности будут определять, какой шаблон лучше для вашего приложения. Если вам нужен один экземпляр объекта, зайдите в одноэлементный.

licensed under cc by-sa 3.0 with attribution.