Как обрабатывать зависимости, которые не являются «настоящими» зависимостями? - PullRequest
4 голосов
/ 03 сентября 2011

У меня есть класс «Validator», который может выполнять произвольные проверки массива данных.Например, проверьте длину строки данного значения в массиве.Валидатор также может проверить заданное значение и посмотреть, является ли оно уникальным в базе данных.

Я хотел бы сделать правильное внедрение зависимостей для этого класса, однако я борюсь с тем, как реализовать его в этом сценарии.,Валидатору не требуется подключение к базе данных для работы.Все остальные проверки правильности работают без подключения к базе данных.Прямо сейчас у меня есть возможность указать соединение с помощью внедрения свойства.Или, если не указано подключение через внедрение свойства, я использую шаблон Service Locator для разрешения подключения по умолчанию из контейнера IoC.

Я делаю это неправильно?Как правильно обрабатывать зависимости класса, которые не требуются для функционирования класса?

В настоящее время я использую валидатор примерно так:

$rules = array(
    'email'    => 'required|unqiue:users',
    'password' => 'required|confirmed',
);

$validator = new Validator($attributes, $rules);

Конечно, «уникальный»Правило говорит валидатору проверять уникальность адреса электронной почты в таблице «пользователи».

Ответы [ 2 ]

1 голос
/ 03 сентября 2011

Используйте интерфейсы или абстрактные классы для загрузки только правильной реализации для текущего случая.Лично у меня почти никогда не было необходимости использовать ни один из них, но они разработаны специально для решения проблем зависимости.

0 голосов
/ 03 сентября 2011

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

Как вы отметили в своем вопросе, поскольку ваш валидатор требует соединения с базой данных, то есть вы не полагаетесь на реализацию внедренного экземпляра, чтобы «выполнить какую-то работу», тогда вам может не потребоваться реализовать DI.

В конце концов вам это может не понадобиться, и вам нужно только передать обработчик подключений к БД или ссылку на уровень доступа к базе данных тому методу, который в этом нуждается. Конечно, это может потребовать некоторых изменений в вашем коде.

...