Рискуя не ответить на ваш вопрос, я обычно не делаю свои классы нижнего уровня, такие как фильтры и валидаторы, как в вашем вопросе, зависимыми от приложений в том смысле, что я делаю доступными для них всю конфигурацию приложения.
Скорее, я пытаюсь точно определить, какие части конфигурации приложения им нужны, и передать эти части фильтру / валидатору в качестве аргументов конструктора.
Это дает два преимущества:
- Он четко определяет зависимости
- Затем я могу использовать фильтр / валидатор в других проектах, которые могут иметь совершенно другую структуру конфигурации приложения.
В качестве примера предположим, что моему пользовательскому валидатору необходимо знать некоторый список адресов электронной почты для внесения в белый список при выполнении проверки; и что этот белый список хранится в application.ini
config как:
whitelist[] = "[email protected]"
whitelist[] = "[email protected]"
и что этот объект конфигурации приложения хранится в Zend_Registry
под ключом config.
Я мог бы сделать так, чтобы мой валидатор получил доступ к этой информации, используя:
$config = Zend_Registry::get('config');
$whitelist = $config['whitelist'];
// use the whitelist
Но это, ИМО, ужасно. Я не могу провести модульное тестирование валидатора, поскольку он извлекает информацию о конфигурации из эфира.
В качестве альтернативы я мог бы передать всю конфигурацию приложения валидатору в его конструкторе:
$validator = new My_Validate_ValidateName($config);
По крайней мере, сейчас, когда я хочу протестировать валидатор, я могу передавать разные $config
объекты / массивы, и ясно, что валидатор зависит от чего-то.
Но я думаю, что это дает валидатору больше информации, чем ему нужно. Кроме того, ему нужно знать, как получить доступ к белому списку из файла app-config. Эта информация может отличаться от проекта к проекту. И, в любом случае, непросто сразу увидеть, что валидатору нужен только белый список адресов электронной почты.
На мой взгляд, самое лучшее:
$config = Zend_Registry::get('config');
$whitelist = $config['whitelist'];
$validator = new My_Validate_ValidateName($whitelist);
Теперь мне ясно, что нужно валидатору. Неважно, где он это берет - из конфигурации приложения, из удаленной службы, откуда угодно. Именно потребитель валидатора несет ответственность за предоставление валидатору того, что ему нужно.
Если, например, потребителем этого валидатора является форма, то форма должна знать, как каким-то образом получить этот белый список. Применяется тот же принцип: дайте ему то, что ему нужно, в его конструкторе. Когда я наконец добрался до уровня контроллера, я считаю себя на уровне «приложения». В этот момент я чувствую себя комфортно, ожидая, что контроллер знает, где он может найти свою конфигурацию приложения и как получить доступ к его внутренним данным.
Просто мой взгляд на это. YMMV. ;-)
ОБНОВЛЕНИЕ
Что касается местоположения, я стараюсь размещать их в зависимости от предполагаемого использования. То есть, если я планирую использовать их в разных проектах, то помещаю их в library
. Если я планирую использовать их только в этом приложении, то помещаю их в application
.
person
David Weinraub
schedule
15.05.2013
isValid()
, а затем возвращает логическое значение, то это не валидатор. Фильтры имеют местоположение по умолчанию вapplication/views/filters
, просто они не так часто используются, как помощники. - person RockyFord   schedule 15.05.2013