Я просто займусь этим.У меня есть класс User
, который должен выполнять некоторые операции с БД (используя класс DB
).Контроллеры создают DB
соответствующим образом и внедряют его в User
с помощью своего конструктора.
Когда пользователь вошел в систему, объект User
сохраняется в сеансе.Проблема в том, что DB
нельзя сериализовать в сеанс, поэтому, когда User
просыпается, его член db
равен null
, что плохо.Я решил это довольно просто с помощью
public function __wakeup() { $this->db = new DB; }
.. однако, это определенно является нарушением DI, и это может даже вызвать проблемы в будущем, если DB
должен отличаться в зависимости от контроллера (в конце концов, контроллер создает DB
, в котором он нуждается).
Проблема в том, что когда User
не сериализуется из сеанса, он не создается снова, поэтому у него нет возможности получить БДчлен.У меня есть несколько возможных решений, и у каждой из них есть следующие проблемы:
- Разрешить установку БД с помощью установки сеттера
- Это также не кажется отличным решением.Это также открывает возможность установки
DB
в неподходящее время и все еще, кажется, нарушает дух DI.Контроллер также должен знать, чтобы установить DB
- Не сериализуйте объект, а сериализуйте токен и воссоздайте объект каждый раз
- Это будетнеудобно и кажется неэффективным.Это также может привести к некоторому повторению (каждый контроллер должен будет сделать что-то вроде
$usr = new User($_SESSION['user-token'], new DB);
).С другой стороны, исключение объекта User
из суперглобалистов отговорило бы использование некоторых неприятных глобальных переменных.
Есть предложения?