#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');
должен быть установлен в bootstarp2. я хочу не использовать zend_loader в своем коде, например, метод, который будет запускаться после runapp, и я помещаю в него свой код, есть ли какой-нибудь способ?
3. Это был бы правильный способ сделать это. Автозагрузчик Zend, который выполняется в методе _initAutoload, должен быть инициализирован, прежде чем вы сможете использовать свои классы
4. хорошо, большое спасибо . этот вопрос был действительно дорогим для меня 😉
5. Нажмите на синюю кнопку, чтобы назначить вознаграждение за мой ответ 😉