Внедрение зависимостей и сериализованные классы - PullRequest
3 голосов
/ 12 января 2012

Я просто займусь этим.У меня есть класс 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 из суперглобалистов отговорило бы использование некоторых неприятных глобальных переменных.

Есть предложения?

1 Ответ

3 голосов
/ 12 января 2012

Поскольку ваш пользовательский объект имеет зависимость от объекта БД и объект БД не может быть сериализован, сам пользовательский объект также не может быть сериализован.

Итак, в основном ваша проблема заключается в том, что вы сериализуете объект, который не поддерживает сериализацию.

Что вам действительно нужно, так это состояние сеанса. Создайте объект состояния сеанса, который может выбирать модели (набор) и может предоставлять модели (получать).

При добавлении логики к объекту сеанса, как конкретный объект может быть сериализован (или лучше: сохранен в сеансе, например, вам обычно нужно хранить идентификатор, только если это модель базы данных), это будет работать как любая другая фабрика. 1007 *

Затем внедрите объект Session как зависимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...