Позвольте мне начать с того, что я разместил это на нескольких форумах и даже попытался получить помощь по каналу IRC ZF. Я был Googling в течение недели и все еще никаких результатов. В прошлом я читал много Q и A на этом сайте, поэтому я решил, что сделаю учетную запись и попрошу вас спросить.
(Да, я искал ранее заданные вопросы, но ни один из ответов не помог мне.)
Я пытаюсь узнать, как использовать Zend Framework для нового проекта, к которому я присоединился. По соображениям совместимости они используют Zend 1 (а не новый Zend 2). Я нашел и последовал за несколькими учебниками по онлайн-и физическим книгам, но у меня одни и те же результаты снова и снова.
Итак, здесь идет (это инструкции, которые дают все уроки). Я пошел в framework.zend.com и загрузил полную версию ZF 1.12.
Я побежал
zf –help
Эта команда работала по назначению. Я также успешно выполнил zf show version (Zend Framework Version 1.12.7).
Я выполнил команду
zf создать проект myproject
После этого я получаю следующее сообщение об ошибке:
Fatal error: Class 'PHPUnit_Framework_TestCase' not found in D:\Zend\library\Zend\Test\PHPUnit\ControllerTestCase.php on line 48
Эта конкретная строка является объявлением класса, которое расширяет PHPUnit_Framework_TestCase. Я не знаю, где определена PHPUnit_Framework_TestCase. Он не находится ни в одном из файлов или каталогов, которые вошли в один ZIP-файл, который я загрузил из Zend. Я даже запускал grep для всех файлов и папок, ища строку «class PHPUnit_Framework_TestCase», но не печатал никаких результатов.
Некоторые предположили, что у меня нет PHPUnit (что очевидно сейчас). Часть, которая меня беспокоит, заключается в том, что абсолютно ни одна из обучающих программ, которые я прочитал, не упоминает ничего об установке PHPUnit до того, как это сделать, или о том, как установить его или какие зависимости у него есть у Zend. Многие из них были начальными учебниками, которые предполагали, что у вас есть только базовые знания PHP, и это довольно шокирует меня, что никто даже не упоминал PHPUnit. Если бы PHPUnit был таким важным, я бы подумал, что файл, который я загрузил из Zend, включил бы его. Наверное, нет.
Поэтому я снова вернулся в интернет и получил файл PHAR для PHPUnit, но что теперь? Я попытался поместить его в несколько разных каталогов, но я все равно получаю ту же ошибку. Я не должен использовать файл PHAR? Должен ли я использовать фактические файлы вместо этого?
Что мне нужно сделать, чтобы заставить ZF распознавать PHPUnit, разрешить эту ошибку и создать мой первый проект ZF?
Дополнительная информация: Windows 7, XAMPP Server (работает на локальном хосте), PHP 5.5.6
Предполагая, что у вас установлен PHPUnit, и он находится на вашем пути включения (учитывая, что ZF1 официально поддерживает PHPUnit 3.4.x и определенно не поддерживает ничего выше PHPUnit 3.5.x, поэтому, если вы используете XAMPP, вам может потребоваться понизить PHPUnit, как описано здесь ). Проблема, скорее всего, связана с этой фиксацией , когда требования для вызова PHPUnit были удалены в пользу использования автозагрузчика. Инструмент ZF через CLI не устанавливает автозагрузчик, поэтому PHPUnit не найден, потому что просто не require
d! Чтобы исправить это, вы можете вернуть эти строки в начало Zend/Test/PHPUnit/ControllerTestCase.php
/** @see PHPUnit_Runner_Version */ require_once 'PHPUnit/Runner/Version.php'; /** * Depending on version, include the proper PHPUnit support * @see PHPUnit_Autoload */ require_once (version_compare(PHPUnit_Runner_Version::id(), '3.5.0', '>=')) ? 'PHPUnit/Autoload.php' : 'PHPUnit/Framework.php';
Стоит отметить, что даже с указанной вами ошибкой инструмент ZF должен по-прежнему работать правильно при настройке проекта, он просто не будет производить единичные тестовые действия (вам нужно будет сделать их самостоятельно). Если вы не хотите понижать версию XAMPP PHPUnit, вы должны иметь возможность добавить правильную версию локально в свой проект, используя композитор, как описано здесь .
Обновление Январь 2015: Снижение PHPUnit для XAMPP больше не требуется, поскольку ZF1 поддерживал хотя бы версию 4.1 PHPUnit с 1.12.7 (я не тестировал выше 4.1). Это полезно, поскольку PHPUnit полностью удалил устаревший репозиторий Pear с декабря 2014 года, а это значит, что вы больше не можете скачивать версии старше 3.7! (В настоящее время XAMPP поставляется с PHPUnit 3.6). В эти дни, хотя, вероятно, стоит бросить XAMPP для бродяг и глобально установить PHPUnit 4.1 через Composer во время резервного копирования.
Я рекомендую использовать Composer для загрузки как ZF, так и PHPUnit. Затем обязательно включите файл autoload.php Composer как ваш / в файл phpunit boostrap.
У меня была такая же проблема, когда я настраивал свой ноутбук как вторую машину разработки и загружал самую новую версию Zend Framework 1 (1.12.9). Всякий раз, когда я пытался создать новое действие в контроллере, я получил ту же ошибку. Тем не менее, на моем основном компьютере это работало нормально.
Я понял, что это потому, что версия ZF1, которую я имел в моем php, включает в себя путь, была фактически 1.11.11. Поэтому я пошел и получил 1.11.14 с страницы архивов ZF , поместил его в каталог include, и он работал нормально.
Не совсем уверен, что это лучший способ заставить его работать, поскольку это более старая версия, но, по крайней мере, она работает. И пока кто-то действительно не придет сюда и не предложит лучшее решение, я намерен придерживаться этого.
Вы можете создать или отредактировать файл .zf.ini
в своем домашнем каталоге ( ~/.zf.ini
или C:\Users\YOUR_ACCOUNT\.zf.ini
в Windows)
php.include_path = "PATH_TO_THE_LIBRARY_FOLDERS_CONTAINING_ZEND_AND_PHPUnit" basicloader.classes.0 = "PHPUnit_Framework_SelfDescribing" basicloader.classes.1 = "PHPUnit_Framework_Test" basicloader.classes.2 = "PHPUnit_Framework_Assert" basicloader.classes.3 = "PHPUnit_Framework_TestCase"
Если вы используете Netbeans в Windows, это может выглядеть так (вы можете поместить несколько библиотек, просто отделите их точкой с запятой ;
):
php.include_path = "C:\Users\romain\dev\ZendFramework-1.12.17\library;C:\Program Files\NetBeans 8.1\php\zend;C:\xampp\php\pear" basicloader.classes.0 = "NetBeansCommandsProvider" basicloader.classes.1 = "PHPUnit_Framework_SelfDescribing" basicloader.classes.2 = "PHPUnit_Framework_Test" basicloader.classes.3 = "PHPUnit_Framework_Assert" basicloader.classes.4 = "PHPUnit_Framework_TestCase"