Zend Framework - Структура приложения - Расположение настраиваемых фильтров и валидаторов

Я уже написал несколько пользовательских валидаторов и фильтров. Я кладу их в библиотеку вот так:

/library
    /My
        /Filter
            /FilterName.php
        /Validate
            /ValidateName.php
    /Zend
    /Zendx

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

ONE: поместите код в /application каталог. Какая структура каталогов является стандартной / рекомендуемой?

ДВА: поместите код в /library структуру каталогов. Каков предпочтительный способ передачи параметров конфигурации валидатору?


person Sonny    schedule 14.05.2013    source источник
comment
Если ваш валидатор делает больше, чем проверяет заданное значение для isValid(), а затем возвращает логическое значение, то это не валидатор. Фильтры имеют местоположение по умолчанию в application/views/filters, просто они не так часто используются, как помощники.   -  person RockyFord    schedule 15.05.2013


Ответы (1)


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

Скорее, я пытаюсь точно определить, какие части конфигурации приложения им нужны, и передать эти части фильтру / валидатору в качестве аргументов конструктора.

Это дает два преимущества:

  1. Он четко определяет зависимости
  2. Затем я могу использовать фильтр / валидатор в других проектах, которые могут иметь совершенно другую структуру конфигурации приложения.

В качестве примера предположим, что моему пользовательскому валидатору необходимо знать некоторый список адресов электронной почты для внесения в белый список при выполнении проверки; и что этот белый список хранится в 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
comment
Это именно тот ответ, который я искал. Моему валидатору, как и вашему, будет предоставлен белый список. - person Sonny; 16.05.2013