ZendFramework

Как создавать Providers для Zend_Tool

Posted in ZendFramework on July 3rd, 2010 by Yaroslav Vorozhko – Be the first to comment

Matthew Weier O’Phinney ведущий разработчик Zend Framework опубликовал новую статью про то, как создавать Providers для Zend_Tool.
В общем провайдеры (providers) Zend Tool отвечают за команды выполняемые через командную строку, CLI – приложений. Например таких как крон скрипты, миграционные скрипты и т.п.
Советую прочитать статью Matthew о провайдерах, чтоб ближе узнать о том, что представлят собой командная строка Zend Tool.

Создание простого доступа к ресурсам из ZF контроллера

Posted in PHP, Tips And Tricks, ZendFramework on March 22nd, 2010 by Yaroslav Vorozhko – 2 Comments

Было бы очень хорошо иметь возможность доступа к загружаемым в bootstrap ресурсам из контроллеров приложения. Например, я хотел бы получить доступ к "DB" ресурсу из контроллера следующим образом $this->db;
Для этого напишем Action Helper, который будет загружать определенные ресурсы в контроллер приложения:

CODE:
  1. class My_ResourceInjector extends Zend_Controller_Action_Helper_Abstract
  2. {
  3.     protected $_resources;
  4.  
  5.     public function __construct(array $resources = array())
  6.     {
  7.         $this->_resources = $resources;
  8.     }
  9.  
  10.     public function preDispatch()
  11.     {
  12.         $bootstrap  = $this->getBootstrap();
  13.         $controller = $this->getActionController();
  14.         foreach ($this->_resources as $name) {
  15.             if ($bootstrap->hasResource($name)) {
  16.                 $controller->$name = $bootstrap->getResource($name);
  17.             }
  18.         }
  19.     }
  20.  
  21.     public function getBootstrap()
  22.     {
  23.         return $this->getFrontController()->getParam('bootstrap');
  24.     }
  25. }

и инициализируем его в bootstrap:

CODE:
  1. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  2. {
  3.     protected function _initResourceInjector()
  4.     {
  5.         Zend_Controller_Action_HelperBroker::addHelper(
  6.             new My_ResourceInjector(array(
  7.                 'db',
  8.                 'layout',
  9.                 'navigation',
  10.             ));
  11.         );
  12.     }
  13. }

Код выше, создаст ссылки на ресурсы: db, layout и navigation. Это значит, что теперь вы можете получить к ним прямой доступ из контроллеров.

CODE:
  1. class FooController extends Zend_Controller_Action
  2. {
  3.     public function barAction()
  4.     {
  5.         $this->layout->disableLayout();
  6.         $model = $this->getModel();
  7.         $model->setDbAdapter($this->db);
  8.         $this->view->assign(
  9.             'model'      => $this->model,
  10.             'navigation' => $this->navigation,
  11.         );
  12.     }
  13.  
  14.     // ...
  15. }

Этото решение ведет к некоторому упрощению - теперь нет необходимости вытягивать bootstrap из объекта инициализации, а потом вытягивать ресурс.
Но, у этого решения есть несколько проблем: Откуда мы знаем, какие ресурсы были связаны с контроллером? Как мы можем это контролировать?
Отсюда, вытекает решение создать пул необходимых ресурсов для контроллера.
read more »

Настраиваем PHPUnit тесты в Zend Framework 1.10

Posted in Development, PHP, Testing, ZendFramework on February 9th, 2010 by Yaroslav Vorozhko – 4 Comments

В документации к Zend Framework есть описание как создавать PHPUnit тесты для контроллеров и для баз данных. Но, к сожалению они не объясняют как настроить приложения для выполнения Unit тестов.
В данной статье приведены шаги по настройке Unit тестов:
1. Установка phpunit
2. Установка xdebug
3. Настройка phpunit.xml
4. Создание TestHelper.php для инициализации приложения
5. Написание и выполнение простого теста

В первую очередь для выполнения тестов нам понадобится phpunit, который можео установить из PEAR пакета PHPUnit.

CODE:
  1. $ pear channel-discover pear.phpunit.de
  2. $ pear config-set preferred_state alpha
  3. $ pear install phpunit/PHPUnit
  4. or you may wish to install all the optional supporting packages:
  5. $ nano /usr/local/php5/etc/php.ini  // memory_limit = 32M; change this to at least 32M
  6. // if you get a permission denied error on the ZF community server, send an email to fw-servers mail list
  7. $ pear install --alldeps  phpunit/PHPUnit

Следующим шагом установим xdebug. Xdebug мы будем использовать для проверки покрытие кода тестами.

CODE:
  1. $ pecl install xdebug-beta

Теперь откройте ваш php.ini файл и пропишите загрузку xdebug.

CODE:
  1. zend_extension=/usr/lib/..../..../php5/20060613/xdebug.so

read more »

Как вы используете Sphinx Search API?

Posted in Development, LinkAider, Projects, Sphinx Search, ZendFramework on December 21st, 2009 by Yaroslav Vorozhko – Be the first to comment

Sphinx Search API для PHP пердставляет собой единый класс, который позволяет использовать все возможности Sphinx Search через его интерфейс. Но, такой класс является удобным только для небольших скриптов и задач.
Для более сложных задач и больших веб приложений необходимо другое решение. И это решения является проектированием и реализацией собственной обертки для Sphinx Search API.

В нашем проекте LinkAider.com мы используем следующие понятия и классы при работе с Sphinx Search:

  1. Сфинкс клиент, отвечающий за подключение, выполнение запросов и обработку ошибок. Для разработчика сфинкс клиент невидим, мы только сообщаем ему параметры подключения к searchd.
  2. Сфинкс индекс - это один из основных классов, с которым работает разработчик, этот класс отвечает за формирование запросов и выполнение запросов через Сфинкс клиент, а также за обработку результатов запроса.
  3. Сфинкс запрос - это еще один класс к которому обращается разработчик для составления запросов. Каждый запрос отвечает за свои индекс к которому обращается, а также содержит свои фильтры, группировки, сортировки и собственно сам запрос.
  4. Сфинкс результат - это класс, который разбирает ответ сфинкса и предоставляет удобный интерфейс к информации по каждому запросу, также он содержит информацию об ошибках, которую испльзуетя Сфинкс клиент для логирования. Сфинкс результат используется разработчиками для создания запросов к базе данных и получения искомых данных.

Пример работы выглядит следующим образом:

  1. Мы создаем объект Сфинкс индекс, который инициализирует Сфинкс клиент, устанавливая для него параметры подключения.
  2. Потом мы создаем объекты запросы для каждого указываем фильтры, группировки и т.п., и указываем к какому индексу делать запрос. Запросов может быть один или несколько, несколько запросов обрабатываються паралельно, что улучшает общую производительность системы.
  3. Каждый созданный запрос мы добавляем в Сфинкс индекс, при добавлении мы можем также указатьк какому индексу делать запрос.
  4. Специальный метод Run класса Сфинкс индекс запускает все запросы и как результат возвращает нам объект Сфинкс результат.
  5. Данные из Сфинкс результата мы используем чтоб создать запросы к базе данных и получить искомые данные.

Преимущеста, которые мы получем от работы с такой библотекой - это простота. Разработчик используя объект Сфинкс запрос может выполнять любые запросы.
Сфинкс результат предоставляет удобную обертку над массивом результата.
Нет необходимости помнить множество констант SphinxClient и парсить массив результата. В общем это выглдит так, как будто вы работаете с обычной таблицой, но не до конца. :)

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

Решение я вижу, в привязке каждого запроса к определенной таблице или группе таблиц.

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

Поэтому хотелось бы узнать как вы используете Sphinx Search и какие преимущества и недостатки вывидите у вашего подхода.

Буду рад любым советам и рекомендациям.

Простой загрузчик файлов для Zend Framework

Posted in Development, Tips And Tricks, ZendFramework on December 17th, 2009 by Yaroslav Vorozhko – Be the first to comment

Сегодня увидел хороший code snippet простого лоадера файлов в проект на Zend Framework.

CODE:
  1. class App_Application_Resource_Fileloader extends Zend_Application_Resource_ResourceAbstract {
  2.   /**
  3.    * @return null
  4.    */
  5.  
  6. public function init() {
  7.         $options = $this->getOptions ();
  8.         foreach ($options as $filePath)
  9.             include $filePath;
  10. return null;
  11.        
  12.     }
  13.    
  14. }
  15.  
  16.  
  17. resources.fileLoader[] = LIBRARY_PATH "/App/Regex_Functions.php"
  18. resources.fileLoader[] = LIBRARY_PATH "/App/Api_Functions.php"

Autoload своих библотек в Zend Framework 1.8+

Posted in Development, PHP, Tips And Tricks, ZendFramework on December 11th, 2009 by Yaroslav Vorozhko – Be the first to comment

Чтоб загружать в Zend Framework свои библиотеки, нам надо сделать следующее:
Первое - это добавить физический путь к библиотеке в include_path.
Второе - это указать префикс классов библиотеки, если такой вообще используется.

Добавить путь в include_path можно двумя способами:
1. Жетско прописать путь в public/index.php файле:

CODE:
  1. set_include_path(implode(PATH_SEPARATOR, array(
  2.     realpath(APPLICATION_PATH . '/../library'),
  3.     realpath(APPLICATION_PATH . '/../mylib'),
  4.     get_include_path(),
  5. )));

2. Прописать путь в конфигруационном файле application/configs/application.ini

CODE:
  1. includePaths.mylib = APPLICATION_PATH "/../mylib"

В обоих случаях мы добавляем путь к mylib в include_path. Второй способ более предпочтительный, так как на основе выбранной конфигурации (production, develeopment, test) можно устанавливать путь к различным версиям mylib.
Кстати используя этот же прием, можно устанавливать путь и к каталогу library/Zend и на основе конфигураций подгружать различный версии Zend Framework.

И так, второе что нам необходимо сделать - это подключить автозагрузчик и установить префикс используемый классами библиотеки.
Я прописал автозагрузчик в файле public/index.php

CODE:
  1. require_once 'Zend/Loader/Autoloader.php';
  2. $loader = Zend_Loader_Autoloader::getInstance();
  3. $loader->registerNamespace('My_');

В данном случае префикс классов в моей библиотеки "My_".

Также, этот же код можно прописать и в классе Bootstrap.php

CODE:
  1. protected function _initAutoload()
  2.     {
  3.         require_once 'Zend/Loader/Autoloader.php';
  4.         $loader = Zend_Loader_Autoloader::getInstance();
  5.         $loader->registerNamespace('My');
  6.     }

Все, теперь ZF знает как загружать классы из вашей бибилиотеки.

Введение в Unit тестрование на Zend Framework 1.8+

Posted in Clear Code, MySQL, Testing, ZendFramework on November 2nd, 2009 by Yaroslav Vorozhko – 2 Comments

Michelangelo van Dam написал краткое введение в Unit тестрование на Zend Framework 1.8+.
Так как версия Zend Framwork 1.8 была сильно переработана, то по сути это первое руководство описывающее как писать Unit тесты в ZF 1.8+.
Начиная с этого момента, можно сказать, что теперь разработчикам не на что жаловаться - руководство есть, начинаем писать тесты. :)