Zend Framework способ хранения модифицированных классов? - PullRequest
1 голос
/ 04 августа 2010

У меня есть проект, который использует Zend Framework и Zend_Translate.

Мне пришлось немного изменить стандартный CSV-адаптер на Zend_Translate.Теперь я сталкиваюсь с вопросом, куда поместить этот измененный адаптер.

По умолчанию адаптеры хранятся в

/Library/Zend/Translate/Adapter/Adaptername.php

Здесь я также поместил новый адаптер.

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

Есть ли в Zend Framework способ справиться с этим или указать альтернативное место загрузки?

Языковые адаптеры загружаются с использованием

$this->_adapter = new $adapter($data, $locale, $options); 

(где $adapter будет Zend_Translate_Adapter_Adaptername)

, поэтому применяются стандартные правила автозагрузки.Есть ли простой способ заставить Zend Autoloader искать во втором месте?

Ответы [ 2 ]

5 голосов
/ 04 августа 2010

Вы можете добавить его в папку lib

/lib
 /Zend
  /Translate
   /Adapter
    /Csv.php
 /My
  /Translate
   /Adapter
    /Csv.php

В зависимости от того, как настроен ваш автозагрузчик, вам необходимо настроить с ним «пространство имен»:

$autoloader->registerNamespace('My_');

Или, если вам это не нравится, поместите его в папку с моделями.По сути, не имеет значения, куда вы его положили, если он доступен каким-то образом автозагрузчиком.Zend_Autoloader может регистрировать произвольные обратные вызовы автозагрузчика, так что это действительно ваше дело.

1 голос
/ 04 августа 2010

Я не могу комментировать ответ Гордона из-за правил этого сайта, но он правильно понял.Чтобы ответить на ваш вопрос о том, как загрузить адаптер, вам нужно передать полное имя класса конструктору объекта перевода:

$translate = new Zend_Translate('My_Translate_Adapter_Class', ...);

Компонент сначала проверяет пространство имен Zend, если вы 'мы передали короткое имя (например, 'gettext'), но затем попытаемся загрузить имя адаптера как класс напрямую.

По крайней мере, это верно в 1.10, и я предполагаю, что уже некоторое время.

...