Всем привет.
Сегодня была выпущена в свет очередная версия ZF: 1.10.7. Релиз содержит около 60 исправлений.
Скачать
Changelog

О главном всё. А теперь немного информации по теме.
Во-первых, Если вы используете Zend_Service_Twitter, обновитесь до версии ZF 1.10.6 или 1.10.7 – твиттер переходит на использование OAuth, а разработчики ZF готовят пользователей к этому. Подробнее читайте в статье Twitter OAuthcalypse. Если вы не можете обновиться, можете изучитьещё три способа интегрировать Zend_OAuth и Twitter.

Также мы узнали, что на конец сентября запланирован релиз ZF 1.11.0, который стандартизирует переводы валидаторов и ещё делает много хорошего для нас с вами.

И, напоследок, немного новостей о ZF 2.0. Уже реализована миграция на PHP 5.3 namespaces, удалены все require_once и проведён рефакторинг юнит-тестов. Ждать остаётся недолго ;)
Всего доброго, будем ждать новых известий от разработчиков ZF.

Оригинал новости на DevZone

Вчера, 28 апреля, был выпущен четвёртый релиз ветки 1.10 – ZF 1.10.4. Скачать его вы можете по ссылке:
http://framework.zend.com/download/latest
Релиз содержит исправления около 50 ошибок, большая часть которых исправлена на прошедшем две недели назад дне охоты на багов.
Некоторые исправления заслуживают отдельного упоминания:

  • ZF-7493:
    Улучшение сериализации в Zend_Amf, что привело к ускорению сериализации больших наборов данных на 200-300%.
  • ZF-9263:
    Устранён вывод warning’ов при вызове Zend_Loader::isReadable() на WAMP-платформе
  • ZF-9504:
    Генерация кода при помощи Zend_XmlRpc_Value стала более эффективной на больших наборах данных.
    В одном из примеров использование памяти снизилось с 1GB до 20MB с уменьшением скорости выполнения с 60 секунд до 10.

Полный список изменений
Оригинал новости

Автор: Rob Allen, www.akrabat.com
Также доступна устаревшая версия руководства, ориентированная на старые версии Zend Framework.

Это руководство предназначено для введения в использование Zend Framework для создания простых приложений с использованием БД с использованием парадигмы Model-View-Controller. Оно было переписано для версии фреймворка 1.8 и использует все преимущества скриптов командной строки Zend_Tool и Zend_Application для бутстраппинга. Используются другие компоненты, включая Zend_Controller, Zend_View, Zend_Db_Table и Zend_Form.
Continue reading ‘Начало работы с Zend Framework’ »

Релиз содержит более 50 багфиксов, во многом благодаря прошедшим Дням Охоты на Баги (Bug Hunting Days).
Скачать

Сегодня команда разработчиков Zend Framework выпустила новую версию – 1.10.1. Исправлено более 50 багов, обнаруженных с момента выпуска версии 1.10.0.
Список исправлений
Скачать Zend Framework 1.10.1
Оффициальный анонс новой версии

Также в руководстве по Zend Framework появилась возможность комментирования, что очень полезно – в документации описаны далеко не все тонкости. Надеюсь, комментарии устранят этот недостаток.

Всем привет.
Активисты русскоязычного сообщества ZF организуют первую в России конференцию. Судя по списку тем, мероприятие обещает быть интересным. Доступна предварительная регистрация.
Организаторы обещают, что мероприятие будет бесплатным или почти бесплатным.
Место проведения: Санкт-Петербург.

За последними новостями можно следить здесь:
RSS-канал: feeds.feedburner.com/zfconf
Twitter: @zfconf
Группа Вконтакте: vkontakte.ru/club14951507

11 января вышли новые версии сразу трёх веток Zend Framework: 1.9.7, 1.8.5 и 1.7.9.
Эти релизы содержат более 40 багфиксов и включают в себя уведомление о новой политике безопасности Zend Framework.
На протяжении декабря Padraic Brady проводил аудит безопасности фреймворка и работал совместно с разработчиками ZF над устранением проблем.
Устранены следующие уязвимости:

Потенциальная инъекция MIME-type в Zend_File_Transfer
В случае, если не установлено расширение ext/finfo и недоступна функция mime_content_type() использовался MIME-type, хранящийся в массиве $_FILES. Это небезопасно, т.к. злоумышленник может подделать значение. Теперь в случае, если не удаётся корректно определить MIME-type, передаётся значение “application/octet”
Потенциальная XSS/HTML инъекция в Zend_Json
Zend_Json_Encode не экранировал символ слэша (“/”), что противоречит спецификации JSON и открывает возможность для инъекции XSS или HTML. В новых версиях проблема устранена, символ экранируется.
Потенциальная XSS-уязвимость в компоненте Zend_Service_ReCaptcha_MailHide
Zend_Service_ReCaptcha_MailHide не проделывал валидацию переданного e-mail’а, а при вызове htmletities() не указывалась текущая кодировка, злоумыленник мог передать специально сформированную строку.
Потенциальная XSS-уязвимость в Zend_Dojo_View_Helper_Editor
Zend_Dojo_View_Helper_Editor использовал TEXTAREA вместо DIV’а. Команда разработчиков Dojo сообщила, что тектовый редактор на базе TEXTAREA не обеспечивает должный уровень безопасности.
Потенциальный XSS из-за несовместимости кодировок
Множество классов ZF, в том числе Zend_Form, Zend_Filter, Zend_Form, Zend_Log и Zend_View, вызывали htmlentities() и htmlspecialchars() с неуказанными или жёстко прописанными кодировками. При использовании нетипичных кодировок (например, UTF-7) кодировка может определиться некорректно и открыть возможность злоумышленнику передать XSS-эксплойт. Рекомендуется в каждом из этих компонентов задавать кодировку явно, не надеясь на автоопределение.

Рекомендуется обновить свои приложения для устранения вышеперечисленных проблем.

О не связанных с безопасностью изменениях вы можете узнать по ссылкам:
http://framework.zend.com/changelog/1.9.7
http://framework.zend.com/changelog/1.8.5
http://framework.zend.com/changelog/1.7.9

Это последний запланированный релиз ветки 1.9. До конца этого месяца планируется выпустить версию 1.10.0

Подробнее о релизе:
В Zend DevZone от Matthew Weier O’Phinney
На blog.astrumfutura.com от Padraic Brady

Matthew Weier O’Phinney опубликовал краткое руководство по созданию SOAP, XML-RPC, JSON-RPC или AMF API на базе Zend Framework.
Я знал, что через ZF это сделать просто, но, оказалось, даже проще, чем я думал. Например, вот так выглядит создание XML-RPC-сервера:

1
2
3
$server = new Zend_XmlRpc_Server();
$server->setClass('My_Awesome_Api');
echo $server->handle();

Также не следует использовать для этих целей полноценный MVC — просто незачем проходить полный цикл диспатчеризации, если можно заменить его куда более производительным сервис-сервером:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class XmlRpc_Bootstrap extends Bootstrap
{
    public function run()
    {
        $server = new Zend_XmlRpc_Server();
        $server->setClass('My_Awesome_Api');
        echo $server->handle();
    }
}

$app = new Zend_Application(
    APPLICATION_ENV,
    array(
        'bootstrap' => array(
            'class' => 'XmlRpc_Bootstrap',
            'path'  => 'path/to/Bootstrap.php',
        ),
        'config' => APPLICATION_PATH . '/configs/application.ini',
    ),
);
$app->bootstrap()
    ->run();

Подробности читайте в оригинале статьи.

Ни для кого не секрет, что Zend_OpenID не всегда работает так, как хотелось бы.
Сегодня я столкнулся с тем, что этот компонент не принимал ответ от openID-сервера google, выдавая ошибку “Discovery failed”. После изучения исходных кодов я выяснил, что необходимый для корректной валидации код просто отсутствует в компоненте. Пришлось воспользоваться грязным хаком (источник):

  1. В метод Zend_OpenId_Consumer::_discovery(), в серию условий if preg_match (начало около строки 740), надо добавить следующий блок:

    1
    2
    3
    } else if (preg_match('/<URI>([^<]+)<\/URI>/i', $response, $r)) {
      $version = 2.0;
      $server = $r[1];
  2. Класс тот же, метод _checkId(). В блок if ($version <= 2.0), в if ($this->_session !== null) надо добавить:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $this->_session->identity = 'http://specs.openid.net/auth/2.0/identifier_select';
      $this->_session->claimed_id = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  3. Там же, следующая ветка – else if (defined(‘SID’)):

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $_SESSION['zend_openid']['identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $_SESSION['zend_openid']['claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }
  4. Там же, вне if/else if/else ветки, но внутри $version <= 2.0:

    1
    2
    3
    4
    if ($server == 'https://www.google.com/accounts/o8/ud') {
      $params['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
      $params['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
    }

Конечно, это некрасивое решение, но оно приемлемо до тех пор, пока этот баг не будет закрыт.

Недавно на сайте http://fbdevzone.com/ был рассмотрен удобный способ передачи URL-параметров в действия.
Обычно для этой цели используются методы $this->_getParam() и $this->getRequest()->getParam() в классах контроллера. Это довольно удобный способ, однако он не идеален — прописывать это из метода в метод не очень удобно.
Предложенный способ заключается в том, что параметры передаются в действия в виде аргументов метода:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * index/info/
 * index/info/tags/one/tags/two
 * index/info/msg/msg-only
 * index/info/date/2009-10-03
 * index/info/msg/RandomOrder/date/2009-10-03
 *
 * @param array $tags
 * @param Zend_Date $date
 * @param string $msg
 */

public function infoAction(array $tags = null, Zend_Date $date = null, $msg = 'hello')
{
    Zend_Debug::dump($tags);
    if (!is_null($date)) echo $date->get(Zend_Date::DATETIME_FULL);
    else echo "no date passed\n";
    Zend_Debug::dump($msg);
    die;
}

При помощи Zend_Reflection производится парсинг phpdoc-комментариев, присваивая переменным соответствующие типы.
Подробнее читайте в блоге автора. Там же вы найдёте исходный код класса.