Интеграция внешних скриптов с Zend Framework - PullRequest
4 голосов
/ 20 ноября 2008

Каков наилучший способ интеграции внешнего скрипта в Zend Framework? Позвольте мне объяснить, потому что я могу спросить это неправильно. У меня есть скрипт, который загружает и анализирует файл XML. Этот скрипт, который выполняется как ежедневное задание cron, должен выгружать свои данные в базу данных.

Я использую Zend Framework для сайта, который использует этот скрипт, и мне кажется, что было бы лучше использовать мою подклассовую модель Zend_Db_Abstract для добавления и обновления базы данных. Как можно это сделать? Идет ли мой скрипт в библиотеку рядом с компонентами Zend (т.е. library / Mine / Xmlparse.php) и, таким образом, имеет доступ к различным компонентам ZF? Нужно ли просто включать правильные файлы модели и компонент Zend DB в сам файл? Каков наилучший способ справиться с такой интеграцией?

Ответы [ 6 ]

3 голосов
/ 20 ноября 2008

Да, вы должны поместить свои собственные классы, которые могут наследовать классы Zend Framework, или добавить дополнительные классы в вашу собственную папку рядом с папкой Zend Framework в библиотеке.

Когда у вас включена автоматическая загрузка Zend_Loader, имена классов автоматически сопоставляются с созданным вами классом, например ::

My_Db_Abstract will map to My/Db/Abstract.php .
2 голосов
/ 28 сентября 2009

В вашей директории библиотеки у вас должна быть собственная библиотека рядом с папкой библиотеки Zend. Как бы вы это ни называли (Mylib, Project, ...), вы должны включить его в автозагрузчик Zend, и это делается следующим образом:

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Project_');
$loader->setFallbackAutoloader(true);
if ($configSection == 'development')
{
    $loader->suppressNotFoundWarnings(false);
}

Чтобы ваша библиотека могла хорошо интегрироваться с ZF и автозагрузчиком, вам следует придерживаться соглашений об именах ZF. Это означает две вещи:

  • если вы расширяете существующий класс ZF, скопируйте структуру папок ZF, чтобы у вашего файла был тот же путь и имя, за исключением имени библиотеки. Например. /library/Zend/Db/Abstract.php => /library/Project/Db/Abstract.php.
  • если вы пишете свои собственные классы, все равно придерживайтесь правил именования ZF, чтобы автозагрузчик мог их найти.
1 голос
/ 28 сентября 2009

Как сам ZF noob, я думаю, что понимаю кое-что из того, что ОП пытается выяснить. Итак, я просто объясню кое-что из того, что я понимаю, в надежде, что это будет полезно либо для ФП (или, скорее, для будущего читателя), поскольку первоначальный вопрос очень старый, и я думаю, что ФП теперь ZF гуру).

Я понимаю, что ZF утверждает, что он в значительной степени "используется по желанию", поэтому вам не нужно покупать целую структуру, такую ​​как Zend_Application, класс Zend_Bootstrap, весь подход MVC и т. Д.

Кроме того, я понимаю соглашения для именования классов и расположения файлов, которые обеспечивают легкую автозагрузку. Пример: class App_Model_User находится в папке App/Model/User.php

Я думаю, что может сбить с толку то, что в контексте сценария, где вы еще не сделали

  • сделал магию .htaccess, которая отправляет весь запрос на public/index.php
  • установите APPLICATION_PATH и включите пути в public/index.php
  • создал объект Application или Bootstrap, связанный с файлом конфигурации

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

Полагаю, мой ответ на исходный вопрос состоял в том, что обычная последовательность точек входа

http запрос -> .htaccess -> index.php -> config

настраивает большую часть нашего окружения для нас, нам нужно будет продублировать часть этого для другого пути входа.

Итак, для вашего сценария моим первым инстинктом было бы создание общего включаемого файла, который отражает большую часть того, что происходит в index.php - задает пути включения, APPLICATION_PATH, создает экземпляры и вызывает загрузчик, а затем выполняет ваш сценарий -специфическая обработка.

Еще лучше, возможно, было бы желательно создать единую точку входа для всех ваших сценариев, как мы делаем в контексте http / web. Расширьте Zend_Application для собственных сценариев, чтобы $application->run(); больше не запускал обработку диспетчеризации маршрутизатора-контроллера MVC, а выполнял ваши собственные задачи. Таким образом, эта единственная точка входа скрипта будет выглядеть почти идентично веб-точке входа, с той лишь разницей, какой экземпляр объекта приложения создается. Затем передайте в сценарий имя нужного класса приложения в качестве параметра командной строки.

Но здесь я признаюсь, что был менее уверен в себе и просто выбрасывал идеи.

Надеюсь, все это кому-нибудь поможет. Это действительно помогло мне записать все это. Спасибо и ура!

Обновление 2009-09-29: Только что наткнулся на эту статью: Использование Zend Framework из командной строки

Обновление 2009-11-20: И еще одна статья: Задания Cron в Zend Framework | GS Design

Обновление 2010-02-25: Простые сценарии командной строки с Zend Application - Дэвид Каунт

1 голос
/ 20 ноября 2008

Я обычно помещаю нестандартные вещи, которые, как мне кажется, можно использовать в разных проектах, в пользовательскую папку в библиотеке. Итак, у меня есть папка library / Ak33m, в которой есть сценарии, которые могут находиться за пределами фреймворка.

1 голос
/ 20 ноября 2008

Я не на 100% уверен, что вы пытаетесь спросить, но я постараюсь помочь. Если в какой-то момент вы добавите ссылку на «/ path / to / zend / framework» в ваш путь включения php, то вы по сути включили Zend Framework. Оттуда, если вы делаете:

require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();

Тогда в любой точке вашего скрипта вы можете просто создать новые объекты Zend Framework, а Zend_Loader будет обрабатывать все остальное.

Одна из важных особенностей Zend Framework - это не принуждение вас к определенным действиям. Вот почему иногда есть несколько способов сделать то же самое. Так что, если вы чувствуете, что вам нужно заставить ваш скрипт использовать Zend Framework просто ради этого, это не является действительно необходимым. Но если вы думаете, что это может улучшить ваш сценарий, сделайте это.

1 голос
/ 20 ноября 2008

Я только что столкнулся с чем-то, что может иметь отношение к этому вопросу. Эта статья IBM developerWorks.

Автор рекомендует просто создать папку скриптов в иерархии ZF и использовать ее как обычно в ZF (хотя он устанавливает путь ini и вызывает автозагрузку). Это так просто? Предоставляет ли ваш сценарий доступ ко всем вкусностям, будучи в иерархии фреймворка, включая путь и автозагрузчик?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...