<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Лобач.info &#187; Zend Framework</title>
	<atom:link href="http://lobach.info/category/develop/zf/feed/" rel="self" type="application/rss+xml" />
	<link>http://lobach.info</link>
	<description>Заметки LAMP-программиста о вебдеве и не только...</description>
	<lastBuildDate>Tue, 13 Jul 2010 14:56:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Как протестировать рассылку почты</title>
		<link>http://lobach.info/develop/zf/mail-send-testing/</link>
		<comments>http://lobach.info/develop/zf/mail-send-testing/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 06:00:54 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zend_mail]]></category>
		<category><![CDATA[zend_mail_transport]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=169</guid>
		<description><![CDATA[Практически ни одно веб-приложение не обходится без отправки электронной почты. А это значит, что нужно как-то протестировать данную функцию приложения. В этой заметке я хочу показать как это можно сделать.

Некоторое время назад мне потребовалось протестировать генерацию писем нашим приложением. Проведя небольшое исследование, решил что можно пойти двумя путями:

установить почтовый прокси и настроить приложение (или php) [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://lobach.info/wp-content/uploads/2010/06/mail-send-testing.png" alt="" title="Тестирование рассылки электронной почты" width="257" height="84" class="alignleft size-full wp-image-173" />Практически ни одно веб-приложение не обходится без отправки электронной почты. А это значит, что нужно как-то протестировать данную функцию приложения. В этой заметке я хочу показать как это можно сделать.</p>
<p><span id="more-169"></span></p>
<p>Некоторое время назад мне потребовалось протестировать генерацию писем нашим приложением. Проведя небольшое исследование, решил что можно пойти двумя путями:</p>
<ol>
<li>установить почтовый прокси и настроить приложение (или php) на отправку почты через него</li>
<li>использовать специальный почтовый транспорт.</li>
</ol>
<p>Фактически, первый вариант может удовлетворить в большинстве случаев. Но чтобы им воспользоваться, нужно вмешиваться в операционную систему&nbsp;&mdash; устанавливать скрипты или приложения, вносить изменения в php.ini. Часто это не представляет проблемы, но не всегда.</p>
<p>Я же решил воспользоваться вторым вариантом, т.к. сделать это оказалось достаточно просто.</p>
<p>В Zend Framework есть специальный компонент, отвечающий за рассылку почты&nbsp;&mdash; <a href="http://framework.zend.com/manual/en/zend.mail.html" title="Документация по Zend_Mail">Zend_Mail</a>. Этот компонент предоставляет единый интерфейс для различных почтовых транспортов (таких как php-функция mail или прямое соединение с smtp-сервером). Написать собственный транспорт не составляет большого труда, что, собственно, я и сделал.</p>
<h2>Пример использования почтового транспорта</h2>
<p>Для того, чтобы проверить содержимое генерируемых нашим приложением писем, я написал небольшой почтовый транспорт. Код транспорта можете посмотреть и скачать с <a href="http://github.com/bladeofsteel/bpLib/blob/master/library/bpLib/Mail/Transport/File.php">github-а</a>, а далее я покажу как им можно воспользоваться. Но перед этим я хочу остановиться на возможностях этого транспорта:</p>
<ul>
<li>работа в двух режимах:
<ul>
<li>имя файла дампа постоянно при отправке нескольких писем</li>
<li>имя файла генерируется для каждого письма индивидуально</li>
</ul>
</li>
<li>возможность сохранения данных как с перезаписью, так и с дописыванием в конец существующего файла</li>
<li>письма сохраняются в файлы формата *.eml, что позволяет посмотреть их в почтовом клиенте</li>
<li>возможность использовать собственную функцию для генерации имени файла письма</li>
</ul>
<p>А теперь вернемся к использованию транспорта.</p>
<p>Чтобы указать Zend_Mail каким образом следует отправлять почту, следует передать экземпляр нужного транспорта в метод отправки почты (<a href="http://framework.zend.com/manual/en/zend.mail.different-transports.html">см. документацию</a>).</p>
<p>Во-первых, указываем автолоадеру пространство имен:</p>
<pre><code class="apache"># application/config/application.in
autoloaderNamespaces[] = "bpLib_"</code></pre>
<p>Во-вторых, перед вызовом метода <strong>send</strong> Zend_Mail-а создадим экземпляр файлового транспорта:</p>
<pre><code>$transport = new bpLib_Mail_Transport_File(
        '/tmp',
        bpLib_Mail_Transport_File::MODE_REGULAR
);</code></pre>
<p>Конструктор файлового транспорта принимает 3 параметра:</p>
<ul>
<li>путь к каталогу, в который будут сохраняться письма</li>
<li>режим работы (имена постоянные/меняющиеся; дозапись/перезапись)</li>
<li>имя callback-функции</li>
</ul>
<p>По первому параметру, я думаю, все ясно, поясню остальные. Режим работы задается маской&nbsp;&mdash; в нулевом бите режим формирования имен файлов, в первом режим записи в файл. Таким образом существует три варианта:</p>
<ul>
<li>bpLib_Mail_Transport_File::MODE_REGULAR&nbsp;&mdash; для постоянного имени файла с перезаписью содержимого файла</li>
<li>bpLib_Mail_Transport_File::MODE_REGULAR | bpLib_Mail_Transport_File::MODE_APPEND&nbsp;&mdash; для постоянного имени файла с дополнением файла</li>
<li>bpLib_Mail_Transport_File::MODE_RANDOM&nbsp;&mdash; для индивидуальных  имен файлов у каждого письма</li>
</ul>
<p>Четвертый вариант (индивидуальные имена с дополнением файла) хоть и возможен, но бессмыслен.</p>
<p>Третий параметр представляет собой название callback-функции, вызываемой для генерации имени файла. Формат параметра аналогичен функции <a href="http://php.net/call_user_func_array">call_user_func_array</a>. Внутрь функции передается экземпляр транспорта. Таким образом, функция имеет доступ ко всем данным письма: заголовки, тело, вложения, что позволяет генерировать имена файлов в зависимости от содержимого письма. В качестве примера приведу метод, используемый по умолчанию:</p>
<pre><code>protected function randomFilename()
{
    return date('Y-m-d-H-i-s').'-'.rand(10000,99999).'.eml';;
}</code></pre>
<p>Ну и наконец передаем созданный нами экземпляр транспорта в метод <strong>send</strong>:</p>
<pre><code>$mail = new Zend_Mail('UTF-8');
$mail-&gt;setSubject("SUBJECT")
    -&gt;addTo('recipient@mail.com')
    -&gt;setFrom('from@mail.com', 'From User')
    -&gt;setBodyText("some text...")
    -&gt;send($transport)
    ;</code></pre>
<p>Собственно это все, что нужно для использования.</p>
<p>К сожалению, нельзя подключить этот транспорт в качестве основного в файле настроек приложения, т.к. ресурс, отвечающий за почтовый компонент, ориентирован исключительно на транспорты Zend Framework-а. Но выход из положения есть! Можно в файле начальной загрузки написать метод, устанавливающий файловый транспорт в качестве транспорта по-умолчанию:</p>
<pre><code>$transport = new bpLib_Mail_Transport_File(
        '/tmp',
        bpLib_Mail_Transport_File::MODE_REGULAR
);
Zend_Mail::setDefaultTransport($transport);</code></pre>
<p>На этом я пожалуй закончу описание транспорта. Возможно в одной из следующих заметок я опишу как можно установить и настроить почтовый прокси.</p>
<p>До новых встреч!</p>

	Tags: <a href="http://lobach.info/tag/config/" title="config" rel="tag">config</a>, <a href="http://lobach.info/tag/debug/" title="debug" rel="tag">debug</a>, <a href="http://lobach.info/tag/mail/" title="mail" rel="tag">mail</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_mail/" title="zend_mail" rel="tag">zend_mail</a>, <a href="http://lobach.info/tag/zend_mail_transport/" title="zend_mail_transport" rel="tag">zend_mail_transport</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zend-framework-debug-bar/" title="Zend Framework Debug Bar (30.03.2009)">Zend Framework Debug Bar</a> (3)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/mail-send-testing/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Комьюнити требуется помощь</title>
		<link>http://lobach.info/develop/zf/community-need-help/</link>
		<comments>http://lobach.info/develop/zf/community-need-help/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 00:48:41 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=171</guid>
		<description><![CDATA[На форуме Русскоязычного Zend Framework сообщества переводят на русский язык сообщения валидаторов. Начиная с версии 1.10 в Zend Framework появился механизм локализованных сообщений валидаторов об ошибках. Лидер команды интернализации Thomas Weidner предложил всем желающим помочь с переводом сообщений на родной язык. На это предложение откликнулись члены сообщества и уже проделали большой объем работы по переводу. [...]]]></description>
			<content:encoded><![CDATA[<p>На форуме <a href="http://zendframework.ru/forum/">Русскоязычного Zend Framework сообщества</a> переводят на русский язык сообщения валидаторов. Начиная с версии 1.10 в <a href="http://framework.zend.com">Zend Framework</a> появился механизм локализованных сообщений валидаторов об ошибках. Лидер команды интернализации <a href="http://www.thomasweidner.com/">Thomas Weidner</a> предложил всем желающим помочь с переводом сообщений на родной язык. На это предложение откликнулись члены сообщества и уже проделали большой объем работы по переводу. Томас уже в курсе проделанной сообществом работы по локализации и, возможно, перевод попадет уже в следующий релиз (версии 1.10.2).</p>
<p>Если вы хорошо знаете русский язык и видите грамматические и прочие ошибки в тексте, Ваша помощь нужна сообществу. Это Ваш шанс поучаствовать в развитии фреймворка!</p>
<p>Вот ссылка на обсуждение перевода: <a href="http://zendframework.ru/forum/index.php?topic=2340.0">Переводы на русский сообщений валидаторов</a>. В этом топике есть вся необходимая информация.</p>

	Tags: <a href="http://lobach.info/tag/news/" title="news" rel="tag">news</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/release-zf-1_7_1/" title="Вышел ZendFramework 1.7.1 (03.12.2008)">Вышел ZendFramework 1.7.1</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/community-need-help/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Создание повторно используемых плагинов ресурсов Zend_Application</title>
		<link>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/</link>
		<comments>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 06:00:57 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Application_Resource]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=170</guid>
		<description><![CDATA[Перевод продолжения статьи <a href="http://weierophinney.net/matthew/">Matthew Weier O'Phinney</a> о <code>Zend_Application</code>. В этот раз Мэтью рассказывает о разработке собственных плагинов ресурсов.]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://weierophinney.net/matthew/archives/231-Creating-Re-Usable-Zend_Application-Resource-Plugins.html">Creating Re-Usable Zend_Application Resource Plugins</a><br />
<strong>Автор:</strong> <a href="http://weierophinney.net/matthew/">Matthew Weier O&#39;Phinney</a><br />
<strong>Перевод:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>﻿﻿В моей <a href="http://weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">последней статье</a> (<a href="/develop/zf/quick-start-to-zend_application_bootstrap/">Быстрый старт с Zend_Application_Bootstrap</a>) я писал о том, как начать работу с <code>Zend_Application</code>, в том числе информацию о том, как писать методы ресурсов, а также список доступных плагинов ресурсов. Что произойдет, когда вам потребуется повторно используемый ресурс, для которого не поставляется готовый плагин? Ответ прост: напишите ваш собственный, конечно!</p>
<p>Все плагины в <code>Zend Framework</code> следуют <a href="http://framework.zend.com/manual/en/learning.plugins.intro.html">общему шаблону</a>. В общем случае, вы группируете плагины в общем каталоге, с общим префиксом класса, а затем уведомляете подключающий класс о их местонахождении.</p>
<p>В этой статье давайте предположим, что вы хотите, чтобы ресурс плагина выполнял следующие действия:</p>
<ul>
<li>Установил DOCTYPE представления (<code>View</code>)</li>
<li>Задал заголовок страницы и разделитель по умолчанию</li>
</ul>
<h3 id="part1">Начало работы</h3>
<p>Прежде всего, давайте определим префикс класса, который мы будем использовать. Если мы будем следовать <a href="http://framework.zend.com/manual/en/coding-standard.overview.html">Стандартам кодирования Zend Framework</a>, мы сможем эффективно использовать автозагрузку, при одновременном обеспечении общего префикса класса для наших ресурсов.</p>
<p>Для целей данного упражнения, мы будем использовать префикс класса <code>Phly_Resource</code>, расположенного в <code>Phly/Resource/</code> нашего <code>include_path</code>.</p>
<p>Назовем наш особый ресурс <code>Layouthelpers</code>, с полным названием класса <code>Phly_Resource_Layouthelpers</code>, и поместим его в <code>Phly/Resource/Layouthelpers.php</code>. Он должен реализовывать <code>Zend_Application_Resource_Resource</code>, но зачастую бывает проще расширить <code>Zend_Application_Resource_ResourceAbstract</code>. В обоих случаях необходимо определить метод <code>init()</code>. Давайте реализуем скелет нашего класса:</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
    }
}</code></pre>
<h3 id="part2">Об отслеживании зависимостей</h3>
<p>В моей предыдущей статье я показал пример отслеживания зависимостей в <code>Zend_Application</code>. Нам необходимо будет этим воспользоваться, так как обе наши задачи взаимодействуют с объектом представления, который мы будем извлекать с помощью ресурса <code>View</code>.</p>
<p>При создании методов ресурсов непосредственно в вашем загрузке, вы можете просто вызвать <code>$this-&gt;getResource($name)</code>. Однако, в классе плагина ресурсов, необходимо сначала получить доступ к самому объекту начальной загрузки&nbsp;&mdash; с помощью метода <code>getBootstrap()</code>.</p>
<p>Давайте убедимся в том, что ресурс представления инициализирован, и извлечем его.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        // ...
    }
}</code></pre>
<h3 id="part3">Настройка ресурса</h3>
<p>Теперь, когда мы получили наш объект представления, мы можем сделать определенную работу. Так как мы хотим, чтобы ресурс можно было повторно использовать, мы должны разрешить некоторые параметры конфигурации. <code>Zend_Application_Resource_ResourceAbstract</code> предоставляет некоторую шаблонную функциональность для этого.</p>
<p>Во-первых, мы предоставим некоторые параметры по умолчанию через свойство <code>$_options</code>.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        // ...
    }
}</code></pre>
<p>Затем мы можем получить параметры воспользовавшись методом <code>getOptions()</code>.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        $options = $this-&gt;getOptions();
        // ...
    }
}</code></pre>
<p>Теперь, в файлах конфигурации разработчики могут изменять стандартные значения:</p>
<pre><code>[production]
; ...
resources.layouthelpers.doctype = "HTML5"
resources.layouthelpers.title = "My Snazzy New Website"
resources.layouthelpers.title_separator = " &amp;emdash; "</code></pre>
<h3 id="part4">Выполняем некоторую работу</h3>
<p>Теперь, когда у нас есть все нужные части, давайте сделаем основную работу:</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');

        $options = $this-&gt;getOptions();
        $view-&gt;doctype($options['doctype']);
        $view-&gt;headTitle()-&gt;setSeparator($options['title_separator'])
                          -&gt;append($options['title']);
    }
}</code></pre>
<p>Это все!</p>
<h3 id="part5">Расскажем загрузчику о нас</h3>
<p>Ну, это все что нужно сделать для реализации плагина ресурса. Но как мы расскажем нашему классу загрузчика о нем? Через наш конфигурационный файл, используя ключ <code>pluginPaths</code>. Это массив, ключами которого являются префиксы классов плагинов, а значениями&nbsp;&mdash; путь, соответствующий префиксу.</p>
<pre><code>[production]
; ...
pluginPaths.Phly_Resource = "Phly/Resource"
resources.layouthelpers.doctype = "HTML5"
resources.layouthelpers.title = "My Snazzy New Website"
resources.layouthelpers.title_separator = " &amp;emdash; "</code></pre>
<p>Вы можете зарегистрироваться так много путей к плагинам, сколько захотите. Так как этот ключ обрабатывается до исполнения любого из ресурсов, он может быть определен в любом месте вашего конфигурационного файла.</p>
<h3 id="part6">Дальнейшие соображения</h3>
<p>Пример из этого поста тривиален. Но один аспект не был обсужден&nbsp;&mdash; создание ресурса, который будет использоваться повсюду в вашем приложении. Например, вы можете захотеть создать ресурс, который вы будете использовать в разное время в вашем приложении. Если вы возвращаете значение из вашего метода <code>init()</code>, объект начальной загрузки сохранит его для последующего извлечения. Хороший пример этого мы видели раньше: ресурс <code>View</code> зарегистрировал объект <code>Zend_View</code> в классе начальной загрузки просто возвратив экземпляр из плагина ресурса.</p>
<h3 id="part7">Выводы</h3>
<p>Надеюсь, эта и предыдущая статьи помогли пролить некоторый свет на <code>Zend_Application</code> и, в частности, как писать и загружать ресурсы.</p>
<p>Если у Вас есть дополнительные вопросы, вы можете найти меня в <a href="http://framework.zend.com/archives">списке рассылки ZF</a>, на IRC через серверы Freenode, или в <a href="http://twitter.com/weierophinney">Twitter</a>. Удачи!</p>

	Tags: <a href="http://lobach.info/tag/bootstrap/" title="bootstrap" rel="tag">bootstrap</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zend_application_resource/" title="Zend_Application_Resource" rel="tag">Zend_Application_Resource</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/" title="Включение условных запросов в приложениях на Zend Framework (07.04.2009)">Включение условных запросов в приложениях на Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</title>
		<link>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/</link>
		<comments>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:30:47 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=167</guid>
		<description><![CDATA[Анонс первой в России конференции по Zend Framework. Заявлены очень интересные докладчики, в том числе один из разработчиков ядра фреймворка.]]></description>
			<content:encoded><![CDATA[<p>В конце марта 2010 г. в Санкт-Петербурге пройдет первая в России конференция по Zend Framework. Сам я к сожалению поехать не смогу, но по просьбе организаторов конференции публикую анонс предстоящей конференции.</p>
<hr />
<p><a href="http://www.zfconf.ru/" target="_blank"><img src="http://lh5.ggpht.com/_LTrMB58vSzk/S2XRVWUWqMI/AAAAAAAAABw/ItmlHrVIMVs/s800/205x175.png" width="205" height="175" align="left"></a>На днях закончился прием тезисов по планируемым докладам. Примечательно, что в состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей фрэймворка!</p>
<p>Участие в конференции планируется сделать бесплатным или за небольшую стоимость. На данный момент уже открыта <a href="http://www.zfconf.ru/pre-registration.php">предварительная регистрация</a> на конференцию! Для решения ряда вопросов организаторам <strong>очень важно</strong> сейчас понять приблизительное количество человек, которые смогут посетить конференцию или каким-то иным образом принять участие в ней.</p>
<p>Каждый предстоящий доклад возможно обсудить на форуме ZF-сообщества. Ваше мнение очень важно для авторов!</p>
<h4>Планируемые доклады:</h4>
<p><a href="http://zendframework.ru/forum/index.php?topic=2269.0">Жизненный цикл предложений (proposals) в проекте Zend Framework</a>&nbsp;&mdash; <em>Александр Веремьев (<a href="http://www.zend.com">Zend Technologies</a>, Zend Framework Core команда)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2270.0" target="_blank">Zend_Search_Lucene в деталях</a>&nbsp;&mdash; <em>Александр Веремьев (<a target="_blank" href="http://www.zend.com">Zend Technologies</a>, Zend Framework Core команда)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2271.0" target="_blank">Zend Framework и производительность</a>&nbsp;&mdash; <em>Александр Махомет (создатель сообщества <a target="_blank" href="http://zendframework.ru">ZendFramework.ru</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2272.0" target="_blank">Zend Framework и MVC, &laquo;толстая&raquo; модель</a>&nbsp;&mdash; <em>Александр Стешенко (<a target="_blank" href="http://norada.com">Norada Corporation</a>, PHP-разработчик)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2273.0" target="_blank">ФотоСтрана.ru: Прототипирование с использованием ZF (история боевого применения Zend Framework в highload-проекте)</a>&nbsp;&mdash; <em>Леонид Жаворонков (<a target="_blank" href="http://fotostrana.ru">ФотоСтрана.ru</a>, тимлид)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2274.0" target="_blank">Использование очередей сообщений в повседневных проектах</a>&nbsp;&mdash; <em>Денис Баклыков (<a href="http://obnovlenie.ru" target="_blank">Обновление</a>, веб-разработчик)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2275.0" target="_blank">Zend Framework и Doctrine</a>&nbsp;&mdash; <em>Степан Танасийчук (руководитель веб-студии <a target="_blank" href="http://stfalcon.com">stfalcon.com</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2276.0" target="_blank">Zend Framework и мультиязычность</a>&nbsp;&mdash; <em>Степан Танасийчук (руководитель веб-студии <a target="_blank" href="http://stfalcon.com">stfalcon.com</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2277.0" target="_blank">История проекта e-Штаб</a>&nbsp;&mdash; <em>Анатолий Ларин (<a target="_blank" href="http://www.e-legion.com">e-Легион</a>, веб-программист)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2278.0" target="_blank">Что нового несет нам Zend Framework 2.0?</a>&nbsp;&mdash; <em>Надежда Блинова (<a target="_blank" href="http://www.wizartech.ru">Wizartech</a>, веб-программист), Георгий Туревич (<a href="http://www.wizartech.ru" target="_blank">Wizartech</a>, ведущий веб-программист)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2279.0" target="_blank">Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit</a>&nbsp;&mdash; <em>Георгий Туревич (<a href="http://www.wizartech.ru" target="_blank">Wizartech</a>, ведущий веб-программист)</em></p>
<p>Смело обсуждайте доклады и <strong><a href="http://www.zfconf.ru/pre-registration.php" target="_blank">регистрируйтесь</a></strong>!</p>
<p>За последними новостями можно следить здесь:</p>
<ul>
<li><strong>RSS-канал:</strong> <a href="http://feeds.feedburner.com/zfconf" target="_blank">feeds.feedburner.com/zfconf</a></li>
<li><strong>Twitter:</strong> <a href="http://twitter.com/zfconf" target="_blank">@zfconf</a></li>
<li><strong>Группа Вконтакте:</strong> vkontakte.ru/club14951507</li>
</ul>
<p><strong>К участию также приглашаются информационные и финансовые спонсоры.</strong></p>

	Tags: <a href="http://lobach.info/tag/news/" title="news" rel="tag">news</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/konferenciya/" title="конференция" rel="tag">конференция</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/community-need-help/" title="Комьюнити требуется помощь (13.02.2010)">Комьюнити требуется помощь</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Быстрый старт с Zend_Application_Bootstrap</title>
		<link>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/</link>
		<comments>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 12:30:47 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=161</guid>
		<description><![CDATA[<a href="http://weierophinney.net/matthew/">Matthew Weier O'Phinney</a> в своем блоге опубликовал статью из которой можно почерпнуть начальные сведения об использовании такого гибкого и функционального инструмента как Zend_Application. Этот компонент обеспечивает унифицированный и гибко конфигурируемый процесс начальной загрузки вашего приложения. Далее - мой перевод данной статьи.]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">Quick Start to Zend_Application_Bootstrap</a><br />
<strong>Автор:</strong> <a href="http://weierophinney.net/matthew/">Matthew Weier O&#39;Phinney</a><br />
<strong>Перевод:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>﻿Мы добавили <a href="http://framework.zend.com/manual/en/zend.application.html">Zend_Application</a> в <em>Zend Framework</em> начиная с версии 1.8.0. Намерением, лежащим в основе компонента, была формализация процесса загрузки приложений, а также обеспечение упрощенного, основанного на файле конфигураций, механизма для него.</p>
<p><em>Zend_Application</em> работает в связке с <em>Zend_Application_Bootstrap</em>, который, как можно догадаться из названия, является тем, что на самом деле выполняет большую часть работы по загрузке вашего приложения. Это позволяет вам использовать подключаемые ресурсы загрузчика, либо определить локальные ресурсы загрузчика как методы класса. Разработчик получает возможность повторного использования, а в последующем специфическую для приложения инициализацию и конфигурацию.</p>
<p>Кроме того, <em>Zend_Application_Bootstrap</em> обеспечивает отслеживание зависимостей (например, если один из ресурсов зависит от другого, вы можете гарантировать выполнение другого ресурса первым), а также выступает в качестве хранилища для инициализированных ресурсов. Это означает, что если ресурс прошел начальную загрузку, вы можете извлечь его позднее из самого загрузчика.</p>
<h3 id="part1">Как это работает</h3>
<p>Теперь, когда вы знаете, что он делает, давайте окунемся в основы.</p>
<p>Если вы используете утилиту командной строки <em>zf</em>, предоставляемую <em>Zend Framework</em> для создания своих проектов (<code>"zf create project"</code>), вы получите загрузчик и настройки по умолчанию прямо &laquo;из коробки&raquo;. Это включает в себя следующие файлы в файловой структуре:</p>
<p><img src="http://lobach.info/wp-content/uploads/2010/01/screenshot_001.png" alt="" title="Файловая структура приложения по-умолчанию" width="179" height="179" class="aligncenter size-full wp-image-165" /></p>
<p>Файл <em>Bootstrap.php</em> будет содержать класс <em>Bootstrap</em>, который расширяет <em>Zend_Application_Bootstrap_Bootstrap</em>; этот класс изначально будет пустой. Файл <em>application.ini</em> будет содержать следующее:</p>
<pre><code class="ini">[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1</code></pre>
<p><em>Zend_Application</em> проходит в три этапа. Во-первых, оно инициализирует среду PHP, используя INI параметры вашей конфигурации, если они заданы, а также настройку <em>include_path</em> и автозагрузку. Во-вторых, оно инициализирует и выполняет класс начальной загрузки. Наконец, &laquo;выполняется&raquo; приложение (вызовом метода <em>run ()</em> загрузчика).</p>
<h3 id="part2">Параметры конфигурации</h3>
<p>Мы видим, что приведенный выше листинг представляет собой набор:</p>
<ul>
<li>Параметры инициализации PHP (в данном случае они свидетельствуют о том, следует ли отображать ошибки)</li>
<li>Настройки <em>include_path</em></li>
<li>Настройки, которые указывают название и место нахождения класса начальной загрузки</li>
<li>Настройки ресурсов приложения</li>
</ul>
<p>Ключ <em>phpSettings</em> принимает любые ключи из <em>php.ini</em> как подразделы, и эти пары ключ/значение будут переданы <em>ini_set</em>. Это может быть полезно, когда вам нужно быть уверенным в том, что установлены особые INI параметры, особенно если вы хотите, чтобы они зависели от окружения. (В приведенном выше примере, <em>display_errors</em> включен в тестовом окружении и в окружении для разработки, но отключен в остальных)</p>
<p>Когда дело доходит до <em>include_path</em> и автозагрузки, вероятно, наиболее часто задаваемый вопрос: &laquo;Как я могу добавить в автозагрузчик префиксы пространств имен для кода, отличного от ZF?&raquo;. Это можно легко сделать в конфигурационном файле, воспользовавшись ключом <em>autoloaderNamespaces</em> и префиксом пространства имен в качестве его значения:</p>
<pre><code class="ini">autoloaderNamespaces[] = "Phly_"</code></pre>
<p>Что касается класса загрузчика и местоположения файла, как правило, вариант по умолчанию будет наилучшим. Однако, если вы хотите задать пользовательское наименование&nbsp;&mdash; например, чтобы указать префикс класса&nbsp;&mdash; или, возможно, если ваш модуль по умолчанию находится в подкаталоге, вы можете уведомить <em>Zend_Application</em> об этом через настройки <em>bootstrap.class</em> и <em>boostrap.path</em>:</p>
<pre><code class="ini">bootstrap.class = "Application_Bootstrap"
bootstrap.path = APPLICATION_PATH "/modules/application/Bootstrap.php"</code></pre>
<h3 id="part3">Начало работы с ресурсами загрузчика</h3>
<p>Теперь мы, наконец, займемся самым интересным: непосредственно ресурсами загрузчика.</p>
<p><em>Да, я знаю, что я умалчиваю о ключе &laquo;appnamespace&raquo;; я расскажу об этом в другое время.</em></p>
<p>Ресурсы загрузчика могут быть одной из двух вещей:</p>
<ul>
<li>Защищенный метод в классе начальной загрузки с префиксом <em>&laquo;_init&raquo;</em> (например, <code>protected function _initFoo()</code>)</li>
<li>Класс, реализующий <em>Zend_Application_Resource_Resource_Resource</em></li>
</ul>
<p>В первом случае, <code>_init*()</code> методы, каждый из них будет выполняться в каждом запросе. В последнем, будут выполнены только те, которые вы укажете в вашем конфигурационном файле, что позволяет вам выбирать, какие из различных поставляемых плагинов ресурсов (или написанных вами самим!) будут использованы.</p>
<p>В случае с конфигурацией по умолчанию, только плагин ресурса <em>&laquo;frontController&raquo;</em> будет использоваться, соответствуя <em>Zend_Application_Resource_Frontcontroller</em>. По состоянию на предстоящий релиз 1.10, вы можете выбрать один из следующих дополнительных плагинов ресурсов, таких как:</p>
<ul>
<li>Cachemanager</li>
<li>Db</li>
<li>Dojo</li>
<li>Layout</li>
<li>Locale</li>
<li>Log</li>
<li>Mail</li>
<li>Modules</li>
<li>Multidb</li>
<li>Navigation</li>
<li>Router</li>
<li>Session</li>
<li>Translate</li>
<li>View</li>
</ul>
<p>Каждый из них имеет собственные параметры конфигурации, <a href="http://framework.zend.com/manual/en/zend.application.available-resources.html">описанные в руководстве</a>.</p>
<h3 id="part4">Написание методов ресурсов</h3>
<p>Написание ваших собственных методов ресурсов тривиально: вы просто создаете метод, и выполняете какую-то работу. Затем вы имеете возможность вернуть значение. Если вы это сделаете, оно будет храниться в загрузчике и вы сможете получить его позже. К примеру:</p>
<pre><code>class Bootstrap
          extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initRegistry()
    {
        $registry = new Zend_Registry();
        return $registry;
    }
}</code></pre>
<p>Если бы мы хотели получить реестр позже, мы могли бы сделать это, используя метод загрузчика <em>getResource ()</em>:</p>
<pre><code class="php">$registry = $bootstrap-&gt;getResource('Registry');</code></pre>
<p>Обратите внимание, что мы передаем имя метода без префикса <em>&laquo;_init&raquo;</em>, это &laquo;краткое имя&raquo; показывает как ресурс упоминается в загрузчике, и как вы будете ссылаться на него позже.</p>
<p>Теперь, допустим, у вас есть ресурс, который зависит от вашего ресурса &laquo;Реестр&raquo;. Например, вы хотите создать объект <em>Zend_Currency</em> и передать его в реестр. <em>Zend_Application_Bootstrap</em> был спроектирован для обработки этой ситуации, и включает в себя отслеживание зависимостей (это, на самом деле, истинная причина создания методов инициализации защищенными, что предотвращает их прямой вызов). Просто вызовите метод <code>bootstrap()</code> с названием ресурса для его инициализации. Кроме того, метод <em>getResource ()</em> может быть использован для получения значений, зарегистрированных этим ресурсом. К примеру:</p>
<pre><code>class Bootstrap
          extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initCurrency()
    {
        $this-&gt;bootstrap('Registry');
        $registry = $this-&gt;getResource('Registry');

        $currency = new Zend_Currency('$');
        $registry['Zend_Currency'] = $currency;
        return $currency;
    }
    protected function _initRegistry()
    {
        $registry = new Zend_Registry();
        return $registry;
    }
}</code></pre>
<p>Вот что произойдет:</p>
<ul>
<li><em>Zend_Application</em> вызовет <code>bootstrap()</code> без аргументов, который сначала перебирает внутренние методы ресурсов, а затем любые настраиваемые плагины ресурсов.</li>
<li>этот загрузчик выполнит метод <em>_initCurrency ()</em></li>
<li>он встречает метод <code>bootstrap()</code> и выполняет его</li>
<li>вызов <code>bootstrap()</code> выполняет метод <em>_initRegistry ()</em>, сохраняя по завершению экземпляр <em>Zend_Registry</em> (который был возвращен из метода)</li>
<li>выполнение <em>_initCurrency ()</em> продолжается вызовом <em>getResource ()</em>; он возвращает экземпляр <em>Zend_Registry</em>, хранящемуся в загрузчике по этому ключу.</li>
<li>выполнение <em>_initCurrency ()</em> завершается, и загрузчик сохраняет возвращенный экземпляр <em>Zend_Currency</em>.</li>
<li>метод <code>bootstrap()</code> затем пытается вызвать метод <em>_initRegistry ()</em>, но при этом отмечает, что он уже был выполнен, и поэтому переходит к выполнению плагинов ресурсов.</li>
</ul>
<p>Как вы можете теперь видеть, загрузчик функционально достаточно гибкий и мощный, и предоставляет целый ряд преимуществ сразу &laquo;из коробки&raquo;.</p>
<h3 id="part5">До следующей встречи ...</h3>
<p>На данный момент, вы должны знать достаточно для того, чтобы начать писать собственные инициализационные ресурсы начальной загрузки. В ближайшие недели я собираюсь написать о том, как написать повторно используемые плагины ресурсов, а также обсудить, каким образом процесс начальной загрузки вписывается в модульные приложения.</p>

	Tags: <a href="http://lobach.info/tag/bootstrap/" title="bootstrap" rel="tag">bootstrap</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Пользовательские ресурсы для Zend_Application</title>
		<link>http://lobach.info/develop/zf/custom-zend_application-resources/</link>
		<comments>http://lobach.info/develop/zf/custom-zend_application-resources/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 09:51:56 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Rob Allen]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Application_Resource]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=163</guid>
		<description><![CDATA[Перевод небольшой заметки Роба Алена о создании собственных плагинов ресурсов для Zend_Application]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://akrabat.com/zend-framework/custom-zend_application-resources/">Custom Zend_Application Resources</a><br />
<strong>Автор:</strong> <a href="http://akrabat.com/">Rob Allen</a><br />
<strong>Переводчик:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>Рано или поздно, вы захотите использовать Zend_Application эффективней при помощи создания собственных плагинов ресурсов. Это значительно упрощает и ускоряет начальную стадию разработки нового приложения за счет повторного использования однажды уже проделанной работы по инициализации окружения. К тому же это сделает ваш Boostrap-класс очень компактным!</p>
<p>В моем случае, я хотел создать ресурс для <a href="http://couchdb.apache.org/">CouchDb</a>, который проверял бы что база данных была создана, в противном случае создавал бы её.</p>
<p>Создание собственных плагинов достаточно просто. Очевидным местом для размещения будет <em>library/App/Application/Resource</em> и типичный ресурс будет выглядеть следующим образом:</p>
<pre><code>class App_Application_Resource_Couchdb
            extends Zend_Application_Resource_ResourceAbstract
{
    /**
     * Defined by Zend_Application_Resource_Resource
     *
     * @return Phly_Couch|null
     */
    public function init()
    {
         // тут выполняются действия для инициализации CouchDb
        $options = $this-&gt;getOptions();
        // в $options находится все содержимое 'resources.couchdb' из application.ini
    }
}</code></pre>
<p>Вы должны уведомить Zend_Application о ваших новых плагинах. Это делается посредством одной строчки в application.ini:</p>
<pre><code>pluginPaths.App_Application_Resource_ = "App/Application/Resource"</code></pre>
<p>Теперь вы можете иметь столько плагинов ресурсов, сколько вам захочется, располагая их в пространстве App_Application_Resource_.</p>
<p>Кроме того, Matthew Weier O&#39;Phinney написал статью о <a href="http://www.weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">Zend_Application</a>, которую вам обязательно стоит прочесть.</p>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/rob-allen/" title="Rob Allen" rel="tag">Rob Allen</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zend_application_resource/" title="Zend_Application_Resource" rel="tag">Zend_Application_Resource</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a>, <a href="http://lobach.info/tag/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0/" title="разработка" rel="tag">разработка</a>, <a href="http://lobach.info/tag/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b/" title="советы" rel="tag">советы</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/custom-zend_application-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Виновник &#171;падения&#187; веб-сервера найден</title>
		<link>http://lobach.info/develop/zf/find-culprit-down-web-server/</link>
		<comments>http://lobach.info/develop/zf/find-culprit-down-web-server/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 20:28:22 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=157</guid>
		<description><![CDATA[Этот пост я хочу посвятить решению одной проблемы, которая доставила мне массу проблем. Хотя, если говорить о неприятностях, то они скорее были не у меня, а у пользователей проекта, в котором я участвую]]></description>
			<content:encoded><![CDATA[<p>Этот пост я хочу посвятить решению одной проблемы, которая доставила мне массу проблем. Хотя, если говорить о неприятностях, то они скорее были не у меня, а у пользователей проекта, в котором я участвую<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>.</p>
<p>Проблема заключалась в том, что пользователи не могли сохранить на сервере данные, если они превышали определённый объём. При чем, не могли сохранить на столько, что отправляли апач в &laquo;кору&raquo;. Честно говоря, это сильно раздражало, потому что происходило буквально на ровном месте.</p>
<p>В конце концов такая ситуация надоела и я по локоть залез своими шаловливыми ручонками вглубь Zend_Db. Предположения о вероятной причине у нас были и это несколько облегчило задачу. Падения могли происходить из-за того, что регулярка уходила в глубокую рекурсию и там умирала. Эту гипотезу я и стал проверять. Почему я полез именно в Zend_Db? Очень просто&nbsp;&mdash; поиск причины показал, что скрипт умирает именно там.</p>
<p>И оказалось таки да&nbsp;&mdash; Zend_Db при создании экземпляра стэйтмента регуляркой вырезал все экранирующие символы. Если при этом тест запроса был достаточно объемным, то весь процесс завершался падением.</p>
<p>Вот так наш код выглядел ранее (естественно, код крайне упрощен):</p>
<pre><code>$sql = "INSERT INTO tab (id,name)
             VALUES (null,'очень ... длинный ... текст')";
$db-&gt;query($sql); // $db - экземпляр Zend_Db_Adapter_Mysqli</code></pre>
<p>Пытливый ум некоторый читателей моего блога может зародить разумную мысль: &laquo;А зачем, собственно, писать текст запроса целиком, если есть методы и для вставки, и для выборки?&raquo;. И, таки да, будет в чем-то прав. Но! К сожалению, Zend_Db реализует не все возможности SQL и иногда приходится идти на крайние меры и писать запросы явно.</p>
<p>Вернемся к проблеме. Покрутив и так, и эдак, я решил пойти по пути наименьшего сопротивления. А именно, воспользоваться плейсхолдерами. Теперь код стал выглядеть так:</p>
<pre><code>$sql = "INSERT INTO tab (id,name)
             VALUES (null, ?)";
$name = 'очень ... длинный ... текст'; // значение поступает от пользователя
$db-&gt;query($sql, array($name)); // $db - экземпляр Zend_Db_Adapter_Mysqli</code></pre>
<p>Это изменение полностью решило данную проблему. Ура!</p>
<p>Пытливый читатель может опять спросить: &laquo;А чего же не вы не воспользовались плейсхолдерами сразу?!&raquo;. И будет снова прав! Надо было поступать именно так. Но богомерзкое желание сохранить пару тактов процессора сделало свое грязное дело и мы нашли <del datetime="2009-06-30T19:11:12+00:00">приключения на свой зад</del> проблемы на свою голову.</p>
<p>Мораль сей басни такова: пользуйтесь плейсхолдерами и ваши волосы будут мягкими и шелковистыми!</p>
<p>P.S.: Я надеюсь, что после прочтения этого поста у вас не сложилось впечатление, что мы запросы к базе пишем исключительно текстом. Спешу развеять это впечатление: поиск по нашему (очень не маленькому) проекту выявил всего 4 или 5 таких мест. Код исправлен, виновные понесли заслуженное поощрение.</p>
<hr />
<p><strong>Постовой:</strong></p>
<p>Если Вам нужен эвакуатор, то заказать его можете тут: <a href="http://www.evakuator-gruzovik.ru" title="эвакуатор в Москве">эвакуатор в Москве</a>. А если хочется экзотики, то можете съездить на <a href="http://modern-japan.ru">отдых в Японии</a></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p><em>Для справки: проект представляет из себя некий веб-сервис развлекательного характера.</em>&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>

	Tags: <a href="http://lobach.info/tag/database/" title="database" rel="tag">database</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/find-culprit-down-web-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_Tool и ZF 1.8</title>
		<link>http://lobach.info/develop/zf/zend-tool-and-zf-18/</link>
		<comments>http://lobach.info/develop/zf/zend-tool-and-zf-18/#comments</comments>
		<pubDate>Tue, 12 May 2009 07:25:48 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Tool]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=150</guid>
		<description><![CDATA[Перевод статьи о новом для ZF инструменте, появившемся в последнем релизе, - Zend_Tool. В статье рассмотрены предпосылки создания, архитектурные решения, возможности расширения и примеры использования.]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://devzone.zend.com/article/4559-Zend_Tool-and-ZF-1.8">Zend_Tool and ZF 1.8</a><br />
<strong>Автор:</strong> Ralph Schindler<br />
<strong>Переводчик:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>Вы уже наверняка слышали новость о выпуске Zend Framework 1.8. Вместе с ZF 1.8 в наше распоряжение поступило несколько новых инструментов, таких как Zend_Tool (это мой любимчик), Zend_Application, Zend_Navigation и Zend_Tag_Cloud. Zend_Tool не является компонентом в обычном понимании. Большинство компонентов имеют класс на верхнем уровне пространства имен, а Zend_Tool нет. Большинство компонентов обычно используется внутри кода вашего приложения для упрощения выполнения задач, а Zend_Tool нет. Zend_Tool более близок к фреймворку, нежели к компоненту&nbsp;&mdash; этакий фреймворк в фреймворке.</p>
<h2 id="section1">Так что же такое Zend_Tool?</h2>
<p>Первый шаг&nbsp;&mdash; приступить к изучению того, что нужно предпринять для разработки следующего поколения фреймворка для RAD<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>. RAD, как вы можете себе представить, это термин, имеющий довольно широкое определение. В общем смысле, этот термин обозначает скорость, с которой вы можете создать ресурсы, требуемые вашему приложению. В идеальной ситуации, начальная разработка (или подготовительная фаза проекта<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>) должна быть сведена к минимуму с тем, чтобы разработчики могли приступить к более интересной разработке. В конце концов, &laquo;интересная разработка&raquo; является наиболее вероятной причиной рождения приложения.</p>
<p>Итак, если есть &laquo;интересная разработка&raquo;, что же такое &laquo;неинтересная разработка&raquo;? Для Zend Framework (и большинства MVC-фреймворков, если уж на то пошло) это процесс создания начальных ресурсов проекта, общих для всех проектов: первичная структура проекта, первичные файлы конфигурации, первичный загрузочный код и код автозагрузки, и т.п. Это так же включает задачи обработки ошибок, создания контроллеров и представлений и многое другое. Для кого-то, кто только начинает увлекаться ZF, некоторые из этих задач потребуют часы чтения учебников, руководств и материалов типа &laquo;быстрый старт&raquo;. Не слишком &laquo;быстро&raquo;, не так ли?</p>
<h2 id="section2">Zend_Tool как фреймворк</h2>
<p>Вместо тесного связывания системы, которая была бы специально нацелена на создание ZF-приложений непосредственно из командной строки, и точной генерации кода, без модификации существующего кода, мы заложили в архитектуру системы расширяемость в местах, которые должны касаться разработчика. Zend_Tool был разработан для облегчения абстракции во всех необходимых местах, которые мы посчитали удобными разработчикам для расширения системы. Например, у нас пока основной клиент&nbsp;&mdash; CLI<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>, но фреймворк разработан как универсальная RPC-система, с тем, чтобы разрабатывать другие, не-CLI, клиенты. Хотя у нас уже есть запас провайдеров (базовые возможности системы), интерфейсы для построения провайдеров в будущем остается простым и удобным для расширения и понимания.</p>
<h2 id="section3">Zend_CodeGenerator и Zend_Reflection</h2>
<p>В ходе разработки, мы обнаружили несколько проблемных областей, которые не имели единодушного решения. Генерация кода&nbsp;&mdash; одна из таких областей. Вообще говоря, когда Вы говорите о генерации кода, это обычно подход, основанный на шаблонах&nbsp;&mdash; генерируемый код поступает из файлов шаблонов, которые обычно написаны без учета правильно ли они сформированы<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup> (в соответствии со стандартами языка). Имея подход, основанный на шаблонах, включает риск того, что разработчики выйдут за рамки стандартов кодирования и будут генерировать вообще плохой код (плохой код в этом смысле&nbsp;&mdash; это и неработающий код, и плохо сформированный код). Итак, мы сразу поняли, что существует возможность создать компонент, который будет обеспечивать объектно-ориентированный интерфейс, аналогичный <a href="http://ru.php.net/manual/ru/language.oop5.reflection.php">Reflection API</a> в PHP, с единственной целью&nbsp;&mdash; создание хорошо сформированного и хорошо отформатированного объектно-ориентированного кода. Следует отметить, что компонент Zend_CodeGenerator может быть использован без остальной части Zend_Tool. Это означает, что если вы когда-нибудь окажетесь в положении, когда нужно постоянно генерировать код, в первую очередь вы должны посмотреть в сторону Zend_CodeGenerator.</p>
<p>Zend_CodeGenerator не просто пишет код с нуля; у него есть возможность чтения существующего кода, изменения его, и создания нового кода. Это главным образом связано с другим компонентом&nbsp;&mdash; Zend_Reflection, рожденным вне Zend_Tool. Zend_Reflection&nbsp;&mdash; это не, и я это особо подчеркну, переизобретение колеса. Фактически, он расширяет Reflection API, добавляя поддержку пользовательских расширений, отражений Dockbloc (и в том числе тэгов dockbloc), и основанных на файлах отражений. Семантика компонента такая же, как у прародителя, и он может использоваться в качестве замены базовых классов в случае необходимости в дополнительных возможностях.</p>
<p>Zend_CodeGenerator и Zend_Reflection имеют схожие API: Zend_Reflection нацелен на чтение структур кода, а Zend_CodeGenerator нацелен на написание структур кода. Вместе эти два компонента облегчают исследование и написание кода во время процесса развития приложения.</p>
<h2 id="section4">Клиент командной строки Zend_Tool</h2>
<p>Само собой разумеется, что RAD, основанный на интерфейсе командной строки, очень востребован у ZF-разработчиков. Как упомянуто ранее, задача настраивания начальных ресурсов проекта может быть утомительной. Многие разработчики предпочитают взаимодействовать со средой разработки через терминал, или командную строку, так что, естественно, мы решили, что наиболее целесообразно встроить клиента в Zend_Tool. Это не означает, что может быть только один клиент&nbsp;&mdash; как упомянуто ранее, клиентские функциональные возможности Zend_Tool были абстрагированы таким образом, что дополнительные клиенты могут быть построены так, чтобы взаимодействовать с Zend_Tool. У интегрированных сред разработки и редакторов текста есть возможность встроиться в клиентский фреймворк и подавать команды посредством их родного интерфейса. Два вероятных расширения включают два моих любимых инструмента: Zend Studio и Textmate&nbsp;&mdash; но возможности почти безграничны. Любой клиент, который способен выполнять PHP-код, может эффективно надстроиться  поверх Zend_Tool для нужд инструментов.</p>
<h2 id="section5">Zend_Tool_Project</h2>
<p>В связи с тем, что разработка проекта это итерационный процесс, со стороны инструментария так же необходимо отслеживать историю, если можно так выразиться. То, что мы подразумеваем под историей, отслеживает действия, которые вы выполнили: что вы создали, где это расположено в структуре проекта, и каков контекст этого в проекте? Например, после создания проекта, вы можете захотеть создать контроллер. Для всех намерений и целей, контроллер это просто файл, с одним классом в нем, как может инструментальная среда узнать разницу между обычным файлом и файлом контроллера?</p>
<p>Zend_Tool_Project намеревается решать эту проблему. Zend_Tool_Project это набор функциональности выстроенной для работы с Zend_Tool_Framework, чтобы предоставить решение проблемы управления проектами. Zend_Tool_Project отслеживает ресурсы внутри вашего приложения, где они находятся по отношению друг к другу, и названия, которыми вы обращаетесь к ним, что является ключевым моментом, который дает возможность &laquo;итерационную разработку&raquo;. Например, если вы имеете созданный проект с контроллером, названным &laquo;Foo&raquo;, вы можете позже захотеть добавить действие в этот контроллер. Чтобы сделать разработку настолько гладкой, на сколько возможно, изменение должно быть таким же простым, как создание новых ресурсов. Чтобы сделать это, Zend_Tool_Project отслеживает все, что вы уже сделали в вашем проекте.</p>
<p>Помимо отслеживания ресурсов приложения, Zend_Tool_Project является ключевой частью Zend_Tool, которая обеспечивает решение &laquo;построение проекта, основанного на Zend Framework&raquo;. Zend_Tool_Project точно знает, что такое проект, контроллер, представление, загрузочный класс, файл index.php, и т.д., как должны выглядеть, и помогает вам в их создании. Если вы извлечете Zend_Tool_Project из среды выполнения Zend_Tool, у вас останется только фреймворк (или платформа) для построения инструментальной системы. Это говорит о том, что любой проект может использовать Zend_Tool_Framework для создания инструментов, обеспечивающих их нужды.</p>
<h2 id="section6">На что оно способно сейчас</h2>
<p>Итак, имеем в виду все вышесказанное. Что оно может сделать прямо сейчас? Вместо того чтобы говорить об этом, давайте посмотрим несколько скриншотов.</p>
<h3>Помощь</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool1.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool1-300x270.png" alt="Zend_Tool. Помощь" title="Zend_Tool. Помощь" width="300" height="270" class="aligncenter size-medium wp-image-151" /></a></p>
<h3>Ошибка</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool2.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool2-300x275.png" alt="Zend_Tool. Ошибка" title="Zend_Tool. Ошибка" width="300" height="275" class="aligncenter size-medium wp-image-152" /></a></p>
<h3>Создание проекта</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool3.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool3-300x235.png" alt="Zend_Tool. Создание проекта" title="Zend_Tool. Создание проекта" width="300" height="235" class="aligncenter size-medium wp-image-153" /></a></p>
<h3>Создание контроллера</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool4.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool4-300x235.png" alt="Zend_Tool. Создание контроллера" title="Zend_Tool. Создание контроллера" width="300" height="235" class="aligncenter size-medium wp-image-154" /></a></p>
<h3>Создание действия</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool5.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool5-300x235.png" alt="Zend_Tool. Создание действия" title="Zend_Tool. Создание действия" width="300" height="235" class="aligncenter size-medium wp-image-155" /></a></p>
<h2>Что дальше</h2>
<p>В дополнение к тому, что уже сделано в релизе 1.8, ряд дополнительных возможностей уже в процессе разработки. Некоторые из этих возможностей уже в статусе бета-версии (и это причина, почему они не в дистрибутиве релиза), или все еще в фазе проектирования. К примеру, Zend_Application&nbsp;&mdash; мы приняли решение о том, как &laquo;модель&raquo; должна выглядеть, пусть даже всего лишь мы говорим о названии. Так же, с релизом 1.8 мы опубликовали структуру проекта по-умолчанию. Для проекта, основой которого является &laquo;библиотека компонентов&raquo;, это огромный шаг.</p>
<p>В дополнение к поддержке моделей, мы планируем добавить поддержку &laquo;моделей&raquo; (для построения компонентных приложений), соединений с базой данных и генерацию файлов Zend_Db_Table. Ищите эти возможности в ближайших релизах. Кроме того, поскольку Zend_Tool так расширяем, новые возможности могут быть вынесены за пределы проектов, внедряемых непосредственно в модуль Zend_Tool.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Rapid Application Development&nbsp;&mdash; <a href="http://ru.wikipedia.org/wiki/RAD">быстрая разработка приложений</a>&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:2">
<p>loading phase of a project&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:3">
<p>Command Line Interface&nbsp;&mdash; интерфейс командной строки&#160;<a href="#fnref:3" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:4">
<p>well-formed&nbsp;&mdash; синтаксически корректны&#160;<a href="#fnref:4" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_tool/" title="Zend_Tool" rel="tag">Zend_Tool</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a>, <a href="http://lobach.info/tag/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0/" title="разработка" rel="tag">разработка</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-tool-and-zf-18/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Хитрости ZF1.8</title>
		<link>http://lobach.info/develop/zf/tips-zf18/</link>
		<comments>http://lobach.info/develop/zf/tips-zf18/#comments</comments>
		<pubDate>Sun, 03 May 2009 22:26:40 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Rob Allen]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=147</guid>
		<description><![CDATA[Небольшая заметка, которая может сберечь вам кучу времени при переводе проектов на эту версию фреймворка. Возможно даже будет цикл таких заметок. В первой идет разговор о конфигурационных параметрах.]]></description>
			<content:encoded><![CDATA[<p>В комментариях к учебнику <a href="http://akrabat.com/" title="Блог Роба Алена">в блоге Роба Алена</a> (кстати, он его уже обновил до последней текущей версии ZF&nbsp;&mdash; 1.8) <a href="http://akrabat.com/zend-framework-tutorial/#comment-25889" title="Комментарий к учебнику с вопросом о доступе к конфигурационным параметрам">задают вопрос</a>:</p>
<blockquote>
<p>Как в новой версии фреймворка применять конфигурационный файл?<br />
Раньше вопрошающий устанавливал переменную в своем конфигурационном файле:<br />
<code>cms.max.feeds = 10</code></p>
<p>А в загрузочном файле писал следующее:</p>
<pre><code>$configuration = new Zend_Config_Ini(
    APPLICATION_PATH . '/config/app.ini',
    APPLICATION_ENVIRONMENT
);
$registry = Zend_Registry::getInstance();
$registry-&gt;configuration = $configuration;</code></pre>
<p>Соответственно в контроллере получал значение следующим образом:</p>
<pre><code class="php">$this-&gt;_nMaxFeeds = INTVAL(Zend_Registry::getInstance()
             -&gt;configuration
             -&gt;cms
             -&gt;max
             -&gt;feeds);</code></pre>
</blockquote>
<p>Комментатор жалуется, что теперь он не знает как получить подобную функциональность в ZF1.8<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>
<p>Роб ответил:</p>
<blockquote>
В контроллере можно сделать так:
<pre><code class="php">$bootstrap = $this-&gt;getInvokeArg('bootstrap');
$configArray = $bootstrap-&gt;getOptions();</code></pre>
<p>А если нужен экземпляр объекта _Zend_Config_, то надо добавить строчку:</p>
<pre><code class="php">$config = new Zend_Config($configArray);</code></pre>
</blockquote>
<p>Такая вот маленькая хитрость, которая наверняка может сохранить массу времени при переходе на новый релиз.</p>
<p><strong>Кстати1:</strong> из этой заметки наверняка понятно, что вышел новый релиз ZF, но если кто еще не знает рекомендую ознакомиться с переводом анонса релиза ZF1.8&nbsp;&mdash; <a href="http://zend-framework.ru/2009/05/zend-framework-1-8-0-reseas/" title="Перевод анонса выпуска релиза ZF1.8">Вышел Zend Framework 1.8.0</a></p>
<p><strong>Кстати2:</strong> Рекомендую ознакомиться с <a href="http://akrabat.com/zend-framework-tutorial/" title="Учебник / быстрый старт по ZF">учебником Роба</a>, чтобы иметь представление о применении консоли ZF, если кто еще не пробовал её в работе.</p>
<p><strong>Upd:</strong> Там же в комментариях Роб предложил универсальное решение в &laquo;старом&raquo; стиле:</p>
<pre><code>class Bootstrap extends Zend_Application_Bootstrap_Base
{
   public function run()
   {
       Zend_Registry::set('config',
           new Zend_Config($this-&gt;getOptions()));
       parent::run();
   }
}</code></pre>
<p>В этом случае объект конфига будет доступен в любом месте приложения.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Видимо имеется в виду каноническое использование ZF, т.е. через Zend_Application и стандартный bootstraping.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>

	Tags: <a href="http://lobach.info/tag/config/" title="config" rel="tag">config</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/rob-allen/" title="Rob Allen" rel="tag">Rob Allen</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b/" title="советы" rel="tag">советы</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/mail-send-testing/" title="Как протестировать рассылку почты (07.06.2010)">Как протестировать рассылку почты</a> (13)</li>
	<li><a href="http://lobach.info/develop/zf/using-zend-application/" title="Использование Zend_Application (26.03.2009)">Использование Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/tips-zf18/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Включение условных запросов в приложениях на Zend Framework</title>
		<link>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/</link>
		<comments>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 08:52:26 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Controller_Plugin]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=130</guid>
		<description><![CDATA[Источник: Enable your Zend Framework App with Conditional GET!
Автор: Danila Vershinin
Перевод: Лобач Олег
В этой статье я покажу вам простой подход, позволяющий вашим приложениям на Zend Framework снизить нагрузку на каналы связи, став таким образом более дружелюбными к пользователю.
Эта техника предполагает использование условного GET-запроса (HTTP conditional GET). Это базовая возможность HTTP-протокола. Посылая правильные HTTP-заголовки, ваше приложение [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Источник</strong>: <a href="http://smartycode.com/performance/zend-framework-browser-caching/">Enable your Zend Framework App with Conditional GET!</a><br />
<strong>Автор</strong>: Danila Vershinin<br />
<strong>Перевод</strong>: Лобач Олег</em></p>
<p>В этой статье я покажу вам простой подход, позволяющий вашим приложениям на Zend Framework снизить нагрузку на каналы связи, став таким образом более дружелюбными к пользователю.</p>
<p>Эта техника предполагает использование условного GET-запроса (HTTP conditional GET). Это базовая возможность HTTP-протокола. Посылая правильные HTTP-заголовки, ваше приложение позволяет браузерам посетителей кэшировать страницы вашего сайта.</p>
<p><span id="more-130"></span></p>
<p>Вы беспокоитесь о посетителях, имеющих старые версии страниц в кэше? Не стоит! Предлагаемый метод позволяет получить все выгоды от кэширования на стороне клиента без внесения каких-либо изменений, и требует всего 5 минут вашего времени для ее интеграции :).</p>
<p>Zend Framework великолепен в том, что вы можете легко расширить его. Мы собираемся создать плагин фронт-контроллера, который будет заботиться о обработке условных GET-запросов.</p>
<p>Давайте создадим наш плагин фронт-контроллера:</p>
<pre><code>&lt;?php
/**
 * Plugin to support conditional GET for php pages (using ETag)
 * Should be loaded the very last in the plugins stack
 *
 * @author $Author: danila $
 * @version $Id: Conditional.php 15741 2009-02-08 11:58:44Z danila $
 *
 */
class Smartycode_Http_Conditional extends Zend_Controller_Plugin_Abstract
{

    public function dispatchLoopShutdown()
    {
        $send_body = true;

        $etag = '"' . md5($this-&gt;getResponse()-&gt;getBody()) . '"';

        $inm = split(',', getenv("HTTP_IF_NONE_MATCH"));

        $inm = str_replace('-gzip', '', $inm);

        // TODO If the request would, without the If-None-Match header field,
        // result in anything other than a 2xx or 304 status,
        // then the If-None-Match header MUST be ignored

        foreach ($inm as $i) {
            if (trim($i) == $etag) {
                $this-&gt;getResponse()
                     -&gt;clearAllHeaders()
                     -&gt;setHttpResponseCode(304)
                     -&gt;clearBody();
                $send_body = false;
                break;
            }
        }

        $this-&gt;getResponse()
             -&gt;setHeader('Cache-Control', 'max-age=7200, must-revalidate', true)
             -&gt;setHeader('Expires', gmdate('D, d M Y H:i:s', time() + 2 * 3600) . ' GMT', true)
             -&gt;clearRawHeaders();

        if ($send_body) {
            $this-&gt;getResponse()
                 -&gt;setHeader('Content-Length', strlen($this-&gt;getResponse()-&gt;getBody()));
        } 

        $this-&gt;getResponse()-&gt;setHeader('ETag', $etag, true);
        $this-&gt;getResponse()-&gt;setHeader('Pragma', '');
    }
}</code></pre>
<p>Подключить этот плагин к фронт-контроллеру очень легко. Так же легко, как добавление строки в загрузочный файл:</p>
<pre><code class="php">$frontController-&gt;registerPlugin(
            new Smartycode_Http_Conditional(),
            101
        );</code></pre>
<p>Обратите внимание на &laquo;101&raquo;. Вы должны зарегистрировать плагин последним в стеке плагинов.</p>
<p>Эти простые шаги сделают ваше приложение на Zend Framework более дружелюбным к окружению:</p>
<ul>
<li>Работа AJAX-запросов происходит через зендовский MVC (все виды запросов)</li>
<li>Если страницы не изменялись со времени последнего запроса, то они не будут передаваться</li>
<li>Можно также полагать, что вы получите пользу для SEO&nbsp;&mdash; поисковые системы, поддерживающие Etag, смогут эффективно пропускать загрузку / повторный анализ страниц сайта, что ускорит индексацию страниц вашего сайта</li>
<li>Отправка заголовка Content-Length включает постоянные соединения (Keep-Alive connections)</li>
<li>Есть еще достоинства, но мне лень о них думать</li>
</ul>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_controller_plugin/" title="Zend_Controller_Plugin" rel="tag">Zend_Controller_Plugin</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/using-action-helpers/" title="Использование помощников действий (02.11.2008)">Использование помощников действий</a> (7)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework Debug Bar</title>
		<link>http://lobach.info/develop/zf/zend-framework-debug-bar/</link>
		<comments>http://lobach.info/develop/zf/zend-framework-debug-bar/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:44:09 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=127</guid>
		<description><![CDATA[Сегодня с подачи Федерико обнаружил один интересный плагин  — «Scienta ZF Debug Bar».
Этот плагин обеспечивает удобный вывод полезной отладочной информации в небольшую панель внизу каждой страницы.

Внешне эта панель очень похожа на аналогичную панель в Symfony. Бросив на панель беглый взгляд, сразу можно узнать затраченное на генерацию страницы время,  расход памяти и количества запросов. [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня с подачи <a title="Блог Federico Cargnelutti" href="http://blog.fedecarg.com/">Федерико</a> обнаружил один интересный плагин  — «<a title="Домашняя страница плагина Scienta ZF Debug Bar" href="http://jokke.dk/software/scientadebugbar">Scienta ZF Debug Bar</a>».</p>
<p>Этот плагин обеспечивает удобный вывод полезной отладочной информации в небольшую панель внизу каждой страницы.</p>
<p><img class="aligncenter size-full wp-image-128" title="Внешний вид отладочной панели" src="http://lobach.info/wp-content/uploads/2009/03/2009-scienta_debugbar.png" alt="Внешний вид отладочной панели" width="569" height="21" /></p>
<p>Внешне эта панель очень похожа на аналогичную панель в <a href="http://www.symfony-project.org/">Symfony</a>. Бросив на панель беглый взгляд, сразу можно узнать затраченное на генерацию страницы время,  расход памяти и количества запросов. Дополнительно в отдельных панелях показываются подключенные файлы, список переменных, доступных в представлении, перечень SQL-запросов (возможно настроить до двух адаптеров), ошибки и исключения.</p>
<p>В ближайшее время попробую этот плагин в работе. О впечатлениях напишу.</p>

	Tags: <a href="http://lobach.info/tag/debug/" title="debug" rel="tag">debug</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/mail-send-testing/" title="Как протестировать рассылку почты (07.06.2010)">Как протестировать рассылку почты</a> (13)</li>
	<li><a href="http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/" title="Включение условных запросов в приложениях на Zend Framework (07.04.2009)">Включение условных запросов в приложениях на Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-framework-debug-bar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Использование Zend_Application</title>
		<link>http://lobach.info/develop/zf/using-zend-application/</link>
		<comments>http://lobach.info/develop/zf/using-zend-application/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 17:01:55 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[incubator]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[Rob Allen]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=122</guid>
		<description><![CDATA[Роб Аллен опубликовал статью с описанием применения нового &#171;пакета&#187; Zend_Application. Этот &#171;пакет&#187; представляет собой набор классов для упрощения и облегчения  создания загрузчика приложения (bootstrap file). Zend_Application сейчас находится в инкубаторе и его активно дорабатывают. Выпуск намечен в релизе 1.8.
Роб описывает два варианта использования Zend_Application: воспользоваться системой плагинов, каждый из которых отвечает за инициализацую своей части [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Блог Роба Аллена" href="http://akrabat.com/">Роб Аллен</a> опубликовал статью с описанием применения нового &laquo;пакета&raquo; Zend_Application. Этот &laquo;пакет&raquo; представляет собой набор классов для упрощения и облегчения  создания загрузчика приложения (bootstrap file). Zend_Application сейчас находится в инкубаторе и его активно дорабатывают. Выпуск намечен в релизе 1.8.</p>
<p>Роб описывает два варианта использования Zend_Application: воспользоваться системой плагинов, каждый из которых отвечает за инициализацую своей части приложения (БД, представление, фронт-контроллер, и т.д.), или реализовать инициализацию в методах специального класса.</p>
<p>На мой взгляд это будет достаточно полезный класс и если у кого-то возникло желание познакомится с ним поближе&nbsp;&mdash; предлагаю начать с чтения статьи &laquo;<a href="http://akrabat.com/2009/03/25/initial-notes-on-zend_application/">Initial notes on Zend_Application</a>&raquo;</p>

	Tags: <a href="http://lobach.info/tag/incubator/" title="incubator" rel="tag">incubator</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/review/" title="review" rel="tag">review</a>, <a href="http://lobach.info/tag/rob-allen/" title="Rob Allen" rel="tag">Rob Allen</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/using-zend-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPUnit: Тестирование контроллеров Zend Framework</title>
		<link>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/</link>
		<comments>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 10:47:11 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[action controller]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[unit test]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=120</guid>
		<description><![CDATA[Сегодня я хочу предложить вам перевод статьи Federico Cargnelutti PHPUnit: Testing Zend Framework Controllers, посвященной первым шагам в модульном тестировании контроллеров действий Zend Framework.
Тестирование Веб-приложений&#160;&#8212; это комплексная задача, потому что веб-приложение создается из нескольких логических слоев. Модульное тестирование контроллера Zend Framework может быть весьма трудной задачей, особенно для тех, кто слабо знаком с Zend Framework.

Вы [...]]]></description>
			<content:encoded><![CDATA[<p><em>Сегодня я хочу предложить вам перевод статьи <a href="http://phpimpact.wordpress.com/">Federico Cargnelutti</a> <a href="http://phpimpact.wordpress.com/2008/12/27/phpunit-testing-zend-framework-controllers/">PHPUnit: Testing Zend Framework Controllers</a>, посвященной первым шагам в модульном тестировании контроллеров действий Zend Framework.</em></p>
<p>Тестирование Веб-приложений&nbsp;&mdash; это комплексная задача, потому что веб-приложение создается из нескольких логических слоев. Модульное тестирование контроллера Zend Framework может быть весьма трудной задачей, особенно для тех, кто слабо знаком с Zend Framework.</p>
<p><span id="more-120"></span></p>
<p>Вы можете тестировать свои контроллеры действий использую <a href="http://framework.zend.com/manual/en/zend.test.html">Zend_Test</a> и/или <a href="http://www.phpunit.de/">PHPUnit</a>. Zend_Test позволяет вам имитировать запросы, передавать тестовые данные, контролировать вывод вашего приложения и в целом убедиться в том, что ваш код делает именно то, что должен делать. Вам решать, какой из них использовать. Если вы не можете выбрать один из них, то можете использовать оба. Если вы только знакомитесь с тестированием с помощью Zend_Test, то <a href="http://weierophinney.net/matthew/archives/190-Setting-up-your-Zend_Test-test-suites.html">эта статья</a> будет лучшим местом старта.</p>
<p>Фреймворк PHPUnit может показаться очень знакомым тем разработчикам, которые пришли из Java. Разработчики PHPUnit черпали вдохновение из JUnit&nbsp;&mdash; тестовом фреймворке для платформы Java, поэтому вы будете чувствовать себя как дома при использовании PHPUnit если вам уже приходилось сталкиваться с JUnit или одним из его клонов.</p>
<p>Конечно, никто не запрещает вам использовать системы бок о бок (даже в одном и том же приложении). В конце концов, большинство проектов так и будет использовать.</p>
<h3>Использование PHPUnit</h3>
<p>Во-первых, вам необходимо создать структуру каталогов:</p>
<pre>app/
    config/
    controllers/
        ExampleController.php
    models/
    views/
lib/
    Zend/
public/
tests/
    controllers/
        AllTests.php
        ExampleControllerTest.php
    lib/
    AllTests.php
    bootstrap.php</pre>
<p>Тестовый набор нуждается в некоторой информации об окружении, и обычно эта информация находится в файле bootstrap.php. Самым большим отличием этого файла от одного из из используемых в вашем приложении является то, что Фронт-контроллер не выполняет диспетчеризацию объекта запроса:</p>
<p><strong>tests/bootstrap.php</strong> [ <a href="http://phpimpact.codepad.org/3XY6HY1b" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
/* Start output buffering */
ob_start();

/* Report all errors directly to the screen for simple diagnostics in the dev environment */
error_reporting( E_ALL | E_STRICT );
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/London');

/* Determine the root and library directories of the application */
$appRoot = dirname(__FILE__) . '/..';
$libDir = "$appRoot/lib";
$path = array($libDir, get_include_path());
set_include_path(implode(PATH_SEPARATOR, $path));

define('APPLICATION_PATH', $appRoot . '/app');
define('APPLICATION_ENVIRONMENT', 'dev');

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

$front = Zend_Controller_Front::getInstance();
$front-&gt;throwExceptions(true);
$front-&gt;setParam('noViewRenderer', true);
$front-&gt;setParam('env', APPLICATION_ENVIRONMENT);
$front-&gt;setRequest(new Zend_Controller_Request_Http());
$front-&gt;returnResponse(true);

$router = $front-&gt;getRouter();
include APPLICATION_PATH . '/config/routes.php';
$router-&gt;addRoutes($routes);
$router-&gt;setParams($front-&gt;getParams());

$dispatcher = $front-&gt;getDispatcher();
$dispatcher-&gt;setParams($front-&gt;getParams());
$dispatcher-&gt;setResponse($front-&gt;getResponse());
$router-&gt;route($front-&gt;getRequest());</code></pre>
<p>Обратите внимание! Отключение помощника ViewRenderer является не обязательным. Однако, вам должно быть известно, что использование класса Zend_Controller_Action_Helper_ViewRenderer может привести к снижению производительности. Подробнее об этом можно прочесть <a href="http://phpimpact.wordpress.com/2008/09/16/zend-framework-controller-22-drop-in-responsiveness/">здесь</a>.</p>
<p>Класс PHPUnit_Framework_TestSuite фреймворка PHPUnit позволяет вам организовать тесты в иерархические наборы тестов:</p>
<p><strong>tests/AllTests.php</strong> [ <a href="http://phpimpact.codepad.org/8EQspGqq" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once dirname(__FILE__) . '/bootstrap.php';
require_once dirname(__FILE__) . '/controllers/AllTests.php';

class AllTests
{
    public static function main()
    {
        $parameters = array();
        PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
    }

    public static function suite()
    {
        $suite = new PHPUnit_Framework_TestSuite('My Application');
        $suite-&gt;addTest(ControllersAllTests::suite());
        return $suite;
    }
}
AllTests::main();</code></pre>
<p><strong>tests/controllers/AllTests.php</strong> [ <a href="http://phpimpact.codepad.org/iDFGH0nf" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once dirname(__FILE__) . '/ExampleControllerTest.php';

class ControllersAllTests
{
    public static function main()
    {
        PHPUnit_TextUI_TestRunner::run(self::suite());
    }
    public static function suite()
    {
        $suite = new PHPUnit_Framework_TestSuite('My Application - Controllers');
        $suite-&gt;addTestSuite('ExampleControllerTestCase');
        return $suite;
    }
}</code></pre>
<h3>Написание модульных тестов</h3>
<p>Из-за довольно <a href="http://sebastian-bergmann.de/archives/779-PHP-Has-No-Culture-of-Testing.html">странных причин</a> эта часть не описана в документации. Вот что вам нужно сделать до написания теста:</p>
<ol>
<li>Подключить контроллер, который вы собираетесь тестировать.</li>
<li>Расширить контроллер действий (унаследовавшись от него).</li>
<li>Сбросить состояние экземпляра фронт-контроллера.</li>
<li>Указать путь к тестируемому контроллеру действий.</li>
<li>Установить объекты Запроса и Ответа.</li>
<li>Создать экземпляр тестируемого объекта.</li>
</ol>
<p>Пример:</p>
<p><strong>tests/controllers/ExampleControllerTest.php</strong> [ <a href="http://phpimpact.codepad.org/LgS7T5ly" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once APPLICATION_PATH . '/controllers/ExampleController.php';

class ExampleControllerTest extends ExampleController
{
    public function __construct($url = null)
    {
        $front = Zend_Controller_Front::getInstance();
        $front-&gt;resetInstance();
        $front-&gt;setControllerDirectory(APPLICATION_PATH . '/controllers');
        $front-&gt;setRequest(new Zend_Controller_Request_Http($url));
        $front-&gt;setResponse(new Zend_Controller_Response_Http());
        parent::__construct($front-&gt;getRequest(), $front-&gt;getResponse());
    }
}</code></pre>
<p>Вся магия происходит внутри класса ExampleControllerTest. Он делает так, что контроллер действий думает, что был вызван фронт-контроллером в цикле диспетчеризации. Единственный путь сделать это&nbsp;&mdash; создание экземпляра контроллера действий без диспетчеризации запроса. Получение экземпляра контроллера действий дает вам больше контроля и гибкости, особенно при тестировании веб-сервисов.</p>
<p>А теперь пришло время создать наш первый тестовый набор. Тестовый набор это класс, наследуемый от PHPUnit_Framework_TestCase, содержащий тестовые методы, определяемые по префиксу “test” в названии метода.</p>
<p>[ <a href="http://phpimpact.codepad.org/4Ldq4ORj" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">require_once APPLICATION_PATH . '/controllers/ExampleController.php';

class ExampleControllerTest extends ExampleController
{
    ...
}

class ExampleControllerTestCase extends PHPUnit_Framework_TestCase
{
    public function testDefaultAction()
    {
        $controller = new ExampleControllerTest();
        $isDispatched = $controller-&gt;indexAction();

        $this-&gt;assertTrue($isDispatched);
    }

    public function testFirstAction()
    {
        $url = 'http://localhost/example/first';
        $controller = new ExampleControllerTest($url);
        $controller-&gt;firstAction();
        $errorMsg = $controller-&gt;getRequest()-&gt;getParam('error_message', null);

        $this-&gt;assertEquals(null, $errorMsg);
    }

    public function testGetParameterName()
    {
        $url = 'http://localhost/example/first/fed';
        $controller = new ExampleControllerTest($url);
        $name = $controller-&gt;getRequest()-&gt;getParam('name', null);

        $this-&gt;assertEquals('fed', $name);
    }

    public function testGetNameMethod()
    {
        $url = 'http://localhost/example/first/fed';
        $controller = new ExampleControllerTest($url);
        $name = $controller-&gt;getName();
        $this-&gt;assertEquals('fed', $name);
    }
}</code></pre>
<h3>Запуск тестов</h3>
<pre>federico@tests$ phpunit AllTests
PHPUnit 3.3.8 by Sebastian Bergmann.
.....
Time: 0 seconds
OK (4 tests, 4 assertions)</pre>
<p>Если тестирование завершится неудачно, то вы увидите подробную информацию о проваленном тесте. По желанию, вы можете <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Phing+Plugin" target="_blank">подключить Phing в Hudson</a> и автоматизировать выполнение этой задачи. Если есть вопросы&nbsp;&mdash; обращайтесь.</p>

	Tags: <a href="http://lobach.info/tag/action-controller/" title="action controller" rel="tag">action controller</a>, <a href="http://lobach.info/tag/phpunit/" title="phpunit" rel="tag">phpunit</a>, <a href="http://lobach.info/tag/unit-test/" title="unit test" rel="tag">unit test</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Использование компонентов ZendFramework для поддержки нескольких языков</title>
		<link>http://lobach.info/develop/zf/using-zend-framework-language-component/</link>
		<comments>http://lobach.info/develop/zf/using-zend-framework-language-component/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 06:10:31 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=112</guid>
		<description><![CDATA[Недавно на DevZone появился анонс статьи о создании многоязычных сайтов средствами ZendFramework&#160;&#8212; &#171;using Zend Framework Language component. Вопреки сложившейся в последнее время традиции, я не стал переводить заинтересовавшую меня статью. Вместо этого я решил развить реализацию, предложенную автором.

Вначале очень краткий ликбез. Механизм поддержки различных языков в ZendFramework реализована в виде компонента Zend_Translate. Он поддерживает массу [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно на <a href="http://devzone.zend.com/">DevZone</a> появился анонс статьи о создании многоязычных сайтов средствами <a href="http://framework.zend.com/">ZendFramework</a>&nbsp;&mdash; &laquo;<a href="http://www.gsdesign.ro/blog/using-zend-framework-language-component/">using Zend Framework Language component</a>. Вопреки сложившейся в последнее время традиции, я не стал переводить заинтересовавшую меня статью. Вместо этого я решил развить реализацию, предложенную автором.</p>
<p><span id="more-112"></span></p>
<p>Вначале очень краткий ликбез. Механизм поддержки различных языков в <a href="http://framework.zend.com/">ZendFramework</a> реализована в виде компонента <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a>. Он поддерживает массу различных форматов хранения переводов: array, csv, gettext, ini, tbx, tmx, qt, xliff, xmltm. За описаниями особенностей форматов я отправлю в руководство разработчике&nbsp;&mdash; <a href="http://framework.zend.com/manual/en/zend.translate.adapter.html">Adapters for Zend_Translate</a>. Настройка <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a> на тот или иной формат выполняется с помощью подключения соответствующего адаптера. На этом, думаю, с вводной частью я закончу и покажу, как использовать <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a>.</p>
<p>Простейший способ использования компонента заключается в создании экземпляра этого класса в загрузочном файле:</p>
<pre><code name="php">&lt;?php

$translate = new Zend_Translate('gettext',
                                '/path/to/translate.mo',
                                'en');
Zend_Registry::set('Zend_Translate', $translate);</code></pre>
<p>Такое действие даст вам возможность в любом месте приложения получить из реестра экземпляр переводчика и с его помощью получить текст на нужном языке</p>
<p>Теперь давайте посмотрим, что предлагает автор статьи, указанной в начале этой заметки. А он предлагает вместо настройки Zend_Translate в загрузочном файле сделать это с помощью <a href="http://framework.zend.com/manual/en/zend.controller.plugins.html">плагина контроллера</a>. Его вариант я приводить не буду (интересующиеся могут пройти по ссылке и посмотреть самостоятельно), укажу лишь на то, что настройка компонента зашивается намертво в код плагина. Если вы всегда и везде используете одни и те же параметры, то такой вариант вполне вам может подойти. Если же настройки меняются от приложения к приложению, либо если хочется воспользоваться более универсальным решением, то предлагаю посмотреть на мой вариант.</p>
<p>Код плагина приводить не буду&nbsp;&mdash; он доступен по ссылке в конце статьи. Опишу лишь отличия и покажу пример использования.</p>
<p>В отличии от предыдущего варианта, мой вариант достаточно гибко настраивается: плагин может регистрировать в приложении как уже существующий экземпляр Zend_Translate, так и создавать новый экземпляр по переданным в плагин параметрам. Так же можно не регистрировать экземпляр переводчика в реестре, и при этом доступ к нему сохранится через методы плагина. Текущий язык приложения определяется через параметр запроса. По-умолчанию параметр называется <em>lang</em>, но его можно поменять при инициализации плагина</p>
<p>Спецификация конструктора следующая:</p>
<pre><code name="php">public function __construct(array $options = array(), Zend_Translate $translate = null, Zend_Locale $locale = null, $skipRegistry = false)</code></pre>
<p>&lt;</p>
<p>p>Входные параметры:</p>
<ul>
<li>$options&nbsp;&mdash; массив параметров для инициализации экземпляра Zend_Translate. Элементы массива идентичны параметрам конструктора Zend_Translate:
<ul>
<li>adapter&nbsp;&mdash; используемый адаптер</li>
<li>data&nbsp;&mdash; данные для адаптера</li>
<li>locale&nbsp;&mdash; используемая локаль</li>
<li>options&nbsp;&mdash; параметры конфигурации Zend_Translate</li>
<li>langKey&nbsp;&mdash; этот параметр относится уже непосредственно к плагину и определяет название параметра запроса, содержащего указание на запрашиваемый язык</li>
</ul>
</li>
<li>$translate&nbsp;&mdash; экземпляр класса Zend_Translate</li>
<li>$locale&nbsp;&mdash; экземпляр класса Zend_Locale (может потребоваться если нужно указать язык, отличный от указанного в запросе)</li>
</ul>
<p>Вот один из вариантов использования. Допустим, что параметры настройки переводчика хранятся в файле конфигурации приложения:</p>
<pre><code name="php">&lt;?php

$config = new Zend_Config_Ini('/path/to/config.ini');
Zend_Controller_Front::getInstance()-&gt;registerPlugin(new Zeus_Controller_Plugin_Language($config-&gt;translate));</code></pre>
<p>Вот и все! Локаль настроена, переводчик инициализирован и готов к употреблению</p>
<p>Остановлюсь на еще одном моменте. Плагин в результате работы регистрирует экземпляр локали и переводчика в реестре использую стандартные ключи: Zend_Locale и Zend_Translate соответственно. Такое решение, помимо доступности объектов в любом месте приложения, позволяет воспользоваться стандартными помощниками вида и помощниками действий:</p>
<pre><code name="php">$this-&gt;view-&gt;title = $this-&gt;view-&gt;translate('default-register-index-title');</code></pre>
<pre><code name="php">&lt;?php echo $this-&gt;translate('default-register-index-title'); ?&gt;</code></pre>
<p>Код плагина можно взять тут:</p>
<ul>
<li><a href="http://lobach.info/wp-content/uploads/2008/12/zeus.zip">Zeus_Controller_Plugin_Language</a></li>
<li><a href="http://websvn.lobach.info/filedetails.php?repname=PublicCode&#038;path=%2Fblog%2Ftrunk%2FZeus%2FController%2FPlugin%2FLanguage.php">SVN</a></li>
</ul>
<p>Постараюсь ответить на все вопросы и оказать посильную помощь. Поэтому не стесняйтесь и оставляйте свои комментарии. Предложения по усовершенствованию также приветствуются...</p>
<p>P.S.: Вчера вышел ZendFramework 1.7.2. Посмотреть исправления можно по адресу <a href="http://framework.zend.com/issues/secure/views/IssueNavigator.jspa?requestId=10923">http://framework.zend.com/issues/secure/views/IssueNavigator.jspa?requestId=10923</a>. Последний релиз, как всегда, берем <a href="http://framework.zend.com/download/latest/">http://framework.zend.com/download/latest/</a>.</p>
<p>P.P.S.: Хочу порекомендовать блог Романа Настенко &laquo;<a href="http://www.perfectomania.com/">Перфектомания</a>&raquo;. Роман пишет на темы, связанные с разработкой сайтов: юзабилити, проектирование, SMO. Читаю его давно и с интересом.</p>
Этот пост без меток.
	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/using-zend-framework-language-component/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Вышел ZendFramework 1.7.1</title>
		<link>http://lobach.info/develop/zf/release-zf-1_7_1/</link>
		<comments>http://lobach.info/develop/zf/release-zf-1_7_1/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 21:08:50 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=107</guid>
		<description><![CDATA[Не могу не написать о выпуске новой версии ZF. Этот релиз исключительно багфиксовый, посему рекомендуется обновиться.
P.S.: ну и пользуясь случаем, хочу выполнить обещание и порекомендовать обратить внимание на каталог ссылок по теме Zend Framework&#160;&#8212; стоит пробежаться по собранным там ресурсам, можно найти кое-что интересное.

	Tags: news, zend framework

	Похожие записи
	
	Открыта регистрация на первую Российскую конференцию посвященную Zend [...]]]></description>
			<content:encoded><![CDATA[<p>Не могу не написать о выпуске новой версии ZF. Этот релиз исключительно багфиксовый, посему рекомендуется обновиться.</p>
<p>P.S.: ну и пользуясь случаем, хочу выполнить обещание и порекомендовать обратить внимание на <a href="http://zendframework.ru/links">каталог ссылок по теме Zend Framework</a>&nbsp;&mdash; стоит пробежаться по собранным там ресурсам, можно найти кое-что интересное.</p>

	Tags: <a href="http://lobach.info/tag/news/" title="news" rel="tag">news</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/community-need-help/" title="Комьюнити требуется помощь (13.02.2010)">Комьюнити требуется помощь</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/release-zf-1_7_1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
