Почему автозагрузчик ZF2 неправильно строит путь?

У меня есть приложение с некоторыми модулями. Один из них CourseSearch. Теперь я хочу добавить еще один, SportsPartnerSearch. Так как эти два модуля очень похожи друг на друга, я просто "клонировал"/скопировал CourseSearch и заменил все "Курс" на "SportsPartner" (во всех вариациях: $course на $sportsPartner, course-...phtml на sports-partner-...phtml и т.д.), чтобы отредактировать Логика второго шага. Теперь я получаю следующие ошибки:

Предупреждение: require_once(/path/to/project/module/SportsPartnerSearch//src/CourseSearch/View/Helper/CourseSearchForm.php): не удалось открыть поток: Нет такого файла или каталога в /path/to/project/vendor/zendframework /zendframework/library/Zend/Loader/ClassMapAutoloader.php в строке 140

Неустранимая ошибка: require_once(): Не удалось открыть требуемый '/path/to/project/module/SportsPartnerSearch//src/CourseSearch/View/Helper/CourseSearchForm.php' (include_path='.:/usr/share/php:/usr /share/pear') в /path/to/project/vendor/zendframework/zendframework/library/Zend/Loader/ClassMapAutoloader.php в строке 140

Почему путь к файлу строится таким странным образом: /path/to/project/module/SportsPartnerSearch//src/CourseSearch/View/Helper/CourseSearchForm.php? Где я сделал ошибку?


Некоторая дополнительная информация.

Класс, который не может быть найден, так как в модуле CourseSearch указан неверный путь CourseSearch\View\Helper\CourseSearchForm. Его можно найти, когда я деактивирую новый модуль SportsPartnerSearch, содержащий класс SportsPartnerSearch\View\Helper\SportsPartnerSearchForm.

Помощник вида CourseSearchForm создан в CourseSearchForm\Module

class Module {
    public function getViewHelperConfig() {
        return array(
            'factories' => array(
                'courseSearchForm' => function($serviceManager) {
                    $helper = new View\Helper\CourseSearchForm(array('render' => true, 'redirect' => false));
                    // ERROR. This code is not executed anymore.
                    $helper->setViewTemplate('course-search/course-search/course-search-form');
                    $courseSearchForm = $serviceManager->getServiceLocator()->get('CourseSearch\Form\CourseSearchForm');
                    $helper->setCourseSearchForm($courseSearchForm);
                    return $helper;
                }
            )
        );
    }
}

И вызывается в файле макета:

echo $this->courseSearchForm();

SportsPartnerSearch\View\Helper\SportsPartnerSearchForm создается таким же образом в SportsPartnerSearch\Module#getViewHelperConfig() и еще не вызывается.


person automatix    schedule 04.10.2013    source источник


Ответы (1)


Вы создали карту классов? Проверьте файл autoload_classmap.php в модулях CourseSearch и SportsPartnerSearch. Я думаю, у вас все еще есть старая карта классов. Думаю проблема скрыта внутри classmap из-за ошибки в ClassMapAutoloader от Zend, а не стандартного автозагрузчика.

Вы можете создать новую карту классов с помощью генератора карт классов, предоставленного в ZF2 (при условии, что вы загружаете его через Composer) с помощью:

cd module/SportsPartnerSearch
../../vendor/bin/classmap_generator.php

Это создаст новый файл карты классов внутри модуля SportsPartnerSearch.

person Jurian Sluiman    schedule 04.10.2013
comment
Большое спасибо! Оно работает! Теперь он также работает на основе пространства имен без сгенерированных карт классов. Вчера я почистил свои файлы autoload_classmap.php и попробовал без них, но ошибка все еще возникает. Теперь я снова сгенерировал карты классов (это сработало) и снова очистил карты, и теперь это также работает на основе пространства имен. Итак, я думаю, вчера я забыл почистить одну карту классов. - person automatix; 04.10.2013