Установить значение по умолчанию для статического метода в bootstrap

#zend-framework #static #lucene #bootstrapping

#zend-framework #статический #lucene #начальная загрузка

Вопрос:

этот параграф является частью книги «Zend Framework в действии».

 SearchIndexer::setIndexDirectory(ROOT_DIR . '/var/search_index');
Places_Db_Table_Row_Observable::attachObserver('SearchIndexer');
  

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

Теперь у меня проблема! Я поместил этот код в файл начальной загрузки в методе runapp, но он не может распознать каталог, который я установил в bootstrap!

Он показывает мне эту ошибку

 An error occurred exception 'Zend_Search_Exception' with message 'No index directory specified' in E:xamppphpPEARZendSearchLucene.php:497
  

=======================================================

другой тип моего вопроса :

У меня есть этот код в файле начальной загрузки (метод runApp):

 SearchIndexer::setIndexDirectory(ROOT_DIR.'/var/search_index');  
Places_Db_Table_Row_Observable::attachObserver('SearchIndexer'); 
  

Я задал путь к каталогу поиска в классе SearchIndexer, но есть проблема!

Когда я использую приведенный ниже код в действии контроллера, он не может распознать каталог, который я установил в bootstrap!

код контроллера :

 $index = Places_Search_Lucene::open(SearchIndexer::getIndexDirectory());
  

это код seachIndexer :

 public static function setIndexDirectory($directory){
    if(!is_dir($directory)) {
        throw new Exception('Directory for SearchIndexer is invalid ('. $directory .')');
    }
    self::$_indexDirectory = $directory;
}

public static function getIndexDirectory(){
    return self::$_indexDirectory;
}
  

Комментарии:

1. независимо от вашего вопроса, попробуйте поисковую систему Solr, это намного лучше 😉

2. вы уверены, что метод в вашем bootstrap был выполнен? методы в bootstrap должны вызываться _initSomething() AFAIR

3. И как вы определили $_indexDirectory в SearchIndexer? Вы включили ведение журнала ошибок PHP и проверяли журналы на наличие ошибок / предупреждений / уведомлений? И, наконец, какую версию PHP вы используете 5.2 или 5.3?

4. да, вы re right. it don не выполняете . я должен поместить свой код после выполнения frontcontroller dispactch, потому что каталог модели, установленный в frontcontroler, и searchindexer находятся в каталоге модели! итак, где должен быть мой код? после отправки кода в методе runapp это не работает!

Ответ №1:

Ваша getIndexDirectory функция не возвращает путь, поэтому Places_Search_Lucene::open происходит сбой.

Возможно, setIndexDirectory не удается задать путь. Выполните некоторую отладку этого.


Возможно, вы используете класс в своем bootstrap до того, как он будет загружен автозагрузчиком zend. Где вы это выполняете?

Попробуйте загрузить класс вручную перед использованием:

 Zend_Loader::loadClass('Path_To_SearchIndexer',
    array(
        '/home/production/mylib',
    )
);
  

Документация по zend loader: http://framework.zend.com/manual/en/zend.loader.load.html

Комментарии:

1. я опровергаю это! когда я ввел этот код в метод действия, каталог был установлен без проблем. но мне нужно установить каталог в bootstap, потому что мне это нужно в моделях, и этот код Places_Db_Table_Row_Observable::attachObserver('SearchIndexer'); должен быть установлен в bootstarp

2. я хочу не использовать zend_loader в своем коде, например, метод, который будет запускаться после runapp, и я помещаю в него свой код, есть ли какой-нибудь способ?

3. Это был бы правильный способ сделать это. Автозагрузчик Zend, который выполняется в методе _initAutoload, должен быть инициализирован, прежде чем вы сможете использовать свои классы

4. хорошо, большое спасибо . этот вопрос был действительно дорогим для меня 😉

5. Нажмите на синюю кнопку, чтобы назначить вознаграждение за мой ответ 😉