<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Лобач.info</title>
	
	<link>http://lobach.info</link>
	<description>Заметки LAMP-программиста о вебдеве и не только...</description>
	<lastBuildDate>Sat, 13 Feb 2010 00:48:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/lobach" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="lobach" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">lobach</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/lobach" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><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://feedads.g.doubleclick.net/~a/5TmQ-YgW99jeQjYojxERkh7qjcU/0/da"><img src="http://feedads.g.doubleclick.net/~a/5TmQ-YgW99jeQjYojxERkh7qjcU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/5TmQ-YgW99jeQjYojxERkh7qjcU/1/da"><img src="http://feedads.g.doubleclick.net/~a/5TmQ-YgW99jeQjYojxERkh7qjcU/1/di" border="0" ismap="true"></img></a></p><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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=3rslIxNaHVg:F_iDbJQI52o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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><a href="http://feedads.g.doubleclick.net/~a/XZ4dUBZpsR-gmRQC9B75C2T9kN0/0/da"><img src="http://feedads.g.doubleclick.net/~a/XZ4dUBZpsR-gmRQC9B75C2T9kN0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/XZ4dUBZpsR-gmRQC9B75C2T9kN0/1/da"><img src="http://feedads.g.doubleclick.net/~a/XZ4dUBZpsR-gmRQC9B75C2T9kN0/1/di" border="0" ismap="true"></img></a></p><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> (0)</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> (3)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=3PN0DVcK43Q:Kc5Xpzzn0wg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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><a href="http://feedads.g.doubleclick.net/~a/tx391_z3fbh1OUwvMC3opbM90_4/0/da"><img src="http://feedads.g.doubleclick.net/~a/tx391_z3fbh1OUwvMC3opbM90_4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/tx391_z3fbh1OUwvMC3opbM90_4/1/da"><img src="http://feedads.g.doubleclick.net/~a/tx391_z3fbh1OUwvMC3opbM90_4/1/di" border="0" ismap="true"></img></a></p><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> <a href="http://vkontakte.ru/club14951507" target="_blank">vkontakte.ru/club14951507</a></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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=TKXDlVOL9vM:Z_X_QWfgmOA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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><a href="http://feedads.g.doubleclick.net/~a/xiehRJk8ytusTKbMl65mvJH09wQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/xiehRJk8ytusTKbMl65mvJH09wQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/xiehRJk8ytusTKbMl65mvJH09wQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/xiehRJk8ytusTKbMl65mvJH09wQ/1/di" border="0" ismap="true"></img></a></p><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> (3)</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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=vrrWIZBTjSg:RCxLnZlFL3M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/feed/</wfw:commentRss>
		<slash:comments>0</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><a href="http://feedads.g.doubleclick.net/~a/NkIxUeKSQf_vAgXD2fk4695ldTA/0/da"><img src="http://feedads.g.doubleclick.net/~a/NkIxUeKSQf_vAgXD2fk4695ldTA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/NkIxUeKSQf_vAgXD2fk4695ldTA/1/da"><img src="http://feedads.g.doubleclick.net/~a/NkIxUeKSQf_vAgXD2fk4695ldTA/1/di" border="0" ismap="true"></img></a></p><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> (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> (3)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=5FLP4WA8s7k:6E2rpE38-q4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/custom-zend_application-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Организационное] Возвращение...</title>
		<link>http://lobach.info/some/come-back/</link>
		<comments>http://lobach.info/some/come-back/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 23:10:41 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[разное]]></category>
		<category><![CDATA[организационное]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=164</guid>
		<description><![CDATA[После полугодового перерыва я решил вернуться к публикациям постов в этом блоге. Основной причиной такого затишья было отсутствие свободного времени из-за разработки достаточно трудозатратного проекта параллельно основной работе. И хотя сейчас времени все ещё немного, я собираюсь часть его снова посвятить ведению блога. Накопилось некоторое количество материала, которым я хотел бы поделиться с моими читателями.
В [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/O6Ava8_cb9AwVESi9rmApbz2_f4/0/da"><img src="http://feedads.g.doubleclick.net/~a/O6Ava8_cb9AwVESi9rmApbz2_f4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/O6Ava8_cb9AwVESi9rmApbz2_f4/1/da"><img src="http://feedads.g.doubleclick.net/~a/O6Ava8_cb9AwVESi9rmApbz2_f4/1/di" border="0" ismap="true"></img></a></p><p>После полугодового перерыва я решил вернуться к публикациям постов в этом блоге. Основной причиной такого затишья было отсутствие свободного времени из-за разработки достаточно трудозатратного проекта параллельно основной работе. И хотя сейчас времени все ещё немного, я собираюсь часть его снова посвятить ведению блога. Накопилось некоторое количество материала, которым я хотел бы поделиться с моими читателями.</p>
<p>В ближайших планах:</p>
<ul>
<li>перевод заметки о <a href="/develop/zf/custom-zend_application-resources/">плагинах ресурсов для Zend_Application</a></li>
<li>перевод статьи, рассказывающей об <a href="/develop/zf/quick-start-to-zend_application_bootstrap/">использовании Zend_Application</a></li>
<li>публикация фильтра для Zend_Filter_File</li>
<li>и, надеюсь, я дозрею до смены дефолтного шаблона на что-то иное ;)</li>
</ul>
<p>Возможно у вас есть на примете интересные статьи для перевода или вы хотите предложить темы для исследования и обсуждения, тогда не стесняйтесь и пишите об этом в комментариях к этой заметке.</p>
<p>P.S.: Поздравляю всех с наступившим Новым Годом и Рождеством.</p>

	Tags: <a href="http://lobach.info/tag/%d0%be%d1%80%d0%b3%d0%b0%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%be%d0%b5/" title="организационное" rel="tag">организационное</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей</li>
	</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=vkFPLae3mLs:BTtCYpc2lTw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/come-back/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Виновник «падения» веб-сервера найден</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><a href="http://feedads.g.doubleclick.net/~a/fFfgG5m5-gue-rh10-yX_UKtv74/0/da"><img src="http://feedads.g.doubleclick.net/~a/fFfgG5m5-gue-rh10-yX_UKtv74/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fFfgG5m5-gue-rh10-yX_UKtv74/1/da"><img src="http://feedads.g.doubleclick.net/~a/fFfgG5m5-gue-rh10-yX_UKtv74/1/di" border="0" ismap="true"></img></a></p><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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=ryW3buBsqdI:etKQzUJILe4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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><a href="http://feedads.g.doubleclick.net/~a/SUt_g8tfOGFAiZVnRo1GaoAkbn8/0/da"><img src="http://feedads.g.doubleclick.net/~a/SUt_g8tfOGFAiZVnRo1GaoAkbn8/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/SUt_g8tfOGFAiZVnRo1GaoAkbn8/1/da"><img src="http://feedads.g.doubleclick.net/~a/SUt_g8tfOGFAiZVnRo1GaoAkbn8/1/di" border="0" ismap="true"></img></a></p><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> (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/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=2w70MvoFtQw:7ASOfrDyr-c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-tool-and-zf-18/feed/</wfw:commentRss>
		<slash:comments>3</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://feedads.g.doubleclick.net/~a/2nyZx1CDHIShig2-OmeG7-KaaPY/0/da"><img src="http://feedads.g.doubleclick.net/~a/2nyZx1CDHIShig2-OmeG7-KaaPY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/2nyZx1CDHIShig2-OmeG7-KaaPY/1/da"><img src="http://feedads.g.doubleclick.net/~a/2nyZx1CDHIShig2-OmeG7-KaaPY/1/di" border="0" ismap="true"></img></a></p><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/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> (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> (3)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=qjP4p7viv_A:tRn6apsKdBI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/tips-zf18/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Снова про скроллер и jQuery</title>
		<link>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/</link>
		<comments>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 08:43:09 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[примеры]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=146</guid>
		<description><![CDATA[Больше года назад я уже писал о примере реализации скроллера на jQuery. Смысл скроллера состоял в том, что нужно было сделать &#171;бесконечную&#187; ленту неких объектов и отображать в их в небольшом окошке, в котором эта лента как-бы прокручивается. Реализация получилась вполне работоспособная, хоть и не без недостатков.

А совсем недавно мне снова потребовался скроллер, но горизонтальный [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/vtsMNyr7RRMR18dWb59CMLGYKXg/0/da"><img src="http://feedads.g.doubleclick.net/~a/vtsMNyr7RRMR18dWb59CMLGYKXg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/vtsMNyr7RRMR18dWb59CMLGYKXg/1/da"><img src="http://feedads.g.doubleclick.net/~a/vtsMNyr7RRMR18dWb59CMLGYKXg/1/di" border="0" ismap="true"></img></a></p><p>Больше года назад я уже писал о <a href="/develop/javascript/slideup-scroller/" title="статья 'Пример создания SlideUp скроллера с помощью jQuery'">примере реализации скроллера на jQuery</a>. Смысл скроллера состоял в том, что нужно было сделать &laquo;бесконечную&raquo; ленту неких объектов и отображать в их в небольшом окошке, в котором эта лента как-бы прокручивается. Реализация получилась вполне работоспособная, хоть и не без недостатков.</p>
<p><span id="more-146"></span></p>
<p>А совсем недавно мне снова потребовался скроллер, но горизонтальный и управляемый пользователем (в отличии от предыдущего вертикального и автоскролируемого). Изобретать велосипед снова мне было лениво и я решил проверить, есть ли плагины для jQuery с нужным мне функционалом. Перепробовал я массу разных плагинов (упоминать о них смысла нет) пока не набрел на настоящую жемчужину! Идеальный для моей задачи плагин&nbsp;&mdash; <strong>Scrollable</strong> (<a href="http://plugins.jquery.com/project/scrollable" title="Страница плагина в каталоге jQuery">страница в каталоге</a> и <a href="http://www.flowplayer.org/tools/scrollable.html" title="Домашняя страница плагина Scrollable">домашняя страница</a>).</p>
<p>Плагин совершенно замечательный&nbsp;&mdash; масса возможностей, прост в использовании, понятные примеры, приятный код.</p>
<p><strong>Фичи:</strong></p>
<ul>
<li>горизонтальный и вертикальный скролинг</li>
<li>скролинг при помощи навигационных кнопок, вызовов API, курсорных клавиш на клавиатуре и колесом прокрутки на мыше</li>
<li>настраиваемое количество элементов скролируемых за раз</li>
<li>настраивание навигационных кнопок без единой строчки JavaScript</li>
<li>постраничное скролирование</li>
<li>действия, вызываемые программно: next, prev, nextPage, prevPage, seekTo, begin, end ...</li>
<li>динамическое добавление и удаление элементов</li>
<li>автоматически скролинг</li>
<li>возможность настроить поведение скролинга с помощью листенеров onBeforeSeek и onSeek</li>
<li>размер минимизированного файла около 6.0K</li>
</ul>
<p>Применил я этот плагин для организации вывода постраничной навигации. На мой взгляд получилось достаточно удобно&nbsp;&mdash; легко можно добраться до любой страницы. Правда у этого способа тоже есть недостаток&nbsp;&mdash; если страниц уж очень много, то это становится неудобно для пользователя и тяжеловато для браузера. Мы решили ограничиться 100 страницами, а остальные просо отбрасываем.</p>
<p>Была у мне с этим плагином одна непонятка: не срабатывали вызовы API. Моя логика (основываясь на курении доки) подсказывала такой способ вызова:</p>
<pre><code class="javascript">var api = $("div.scrollable").scrollable();
api.click(10); // для перехода к десятому элементу</code></pre>
<p>Но этот код работать не захотел. Пришлось извратиться так:</p>
<pre><code class="javascript">$("div.scrollable").scrollable();
$("div.scrollable").scrollable().click(10);</code></pre>
<p>Если кто-нибудь подскажет более красивое решение или объяснит где я неправ в своих хотелках&nbsp;&mdash; буду очень признателен.</p>
<p>Еще статьи об этом плагине:</p>
<ul>
<li><a href="http://vremenno.net/js/jquery-scrolling-plugin/" title="Скроллер содержимого на jQuery">Скроллер содержимого на jQuery</a></li>
<li><a href="http://blog.webmasterschool.ru/javascript/200/" title="Навигация с использованием jQuery">Навигация с использованием jQuery</a></li>
</ul>

	Tags: <a href="http://lobach.info/tag/javascript/" title="javascript" rel="tag">javascript</a>, <a href="http://lobach.info/tag/jquery/" title="jQuery" rel="tag">jQuery</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b/" title="примеры" rel="tag">примеры</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/javascript/slideup-scroller/" title="Пример создания SlideUp скроллера с помощью jQuery (27.01.2008)">Пример создания SlideUp скроллера с помощью jQuery</a> (8)</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/javascript/croossdomain-ajax-request/" title="Как сделать ajax-запрос на другой домен? (11.07.2008)">Как сделать ajax-запрос на другой домен?</a> (3)</li>
	<li><a href="http://lobach.info/develop/svn/svn-externals/" title="Внешние зависимости (11.02.2008)">Внешние зависимости</a> (1)</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>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=EflzD2rNty4:GErzFs3SrwM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Советы по фиксациям в SVN</title>
		<link>http://lobach.info/develop/svn/svn-commit-tutorial/</link>
		<comments>http://lobach.info/develop/svn/svn-commit-tutorial/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 21:43:12 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
				<category><![CDATA[SVN]]></category>
		<category><![CDATA[контроль версий]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=136</guid>
		<description><![CDATA[Предлагаю перевод хорошей статьи с советами по выполнению фиксаций в хранилище. Оригинал написан для проекта T2, но практически все советы универсальны и легко применимы для любого другого проекта. А самое главное&#160;&#8212; они действительно полезны.
В названии статьи хоть и фигурирует SVN, но советы, изложенные в ней, подходят ко всем известным мне системам кондроля версий. Стоит так [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/I8slJDxz4NBI9Dqhg9T-YxT2lxw/0/da"><img src="http://feedads.g.doubleclick.net/~a/I8slJDxz4NBI9Dqhg9T-YxT2lxw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/I8slJDxz4NBI9Dqhg9T-YxT2lxw/1/da"><img src="http://feedads.g.doubleclick.net/~a/I8slJDxz4NBI9Dqhg9T-YxT2lxw/1/di" border="0" ismap="true"></img></a></p><p><em>Предлагаю перевод хорошей статьи с советами по выполнению фиксаций в хранилище. Оригинал написан для проекта <a href="http://www.t2-project.org/">T2</a>, но практически все советы универсальны и легко применимы для любого другого проекта. А самое главное&nbsp;&mdash; они действительно полезны.</em></p>
<p><em>В названии статьи хоть и фигурирует SVN, но советы, изложенные в ней, подходят ко всем известным мне системам кондроля версий. Стоит так же заметить, что советы направлены в основном на командную разработку.</em></p>
<p><span id="more-136"></span></p>
<p><em><strong>Источник</strong>: <a href="http://www.t2-project.org/developer/svn-commit-tutorial.html">T2 SVN commit tutorial</a><br />
<strong>Автор</strong>: The T2 SDE Project<br />
<strong>Перевод</strong>: Лобач Олег</em></p>
<p><strong>Дважды подумайте перед фиксацией изменений</strong></p>
<p>Т.к. фиксация изменений в SVN может иметь серьёзные последствия, найдите время для того, чтобы разобраться, не сломает ли ваш код что либо у других разработчиков. Ведь хранилище кода одно на всех, и если вы что-то сломаете, то это сломается у всех. SVN, конечно, позволяет вернуться к предыдущим версиям и это может помочь решить проблему, но лучше все же предупредить проблему, чем её в последствии героически устранять.</p>
<p><strong>Никогда не фиксируйте код, который не компилируется</strong></p>
<p><em>Прим. пер.: в этом пункте речь идет о компиляции, что для веб-разработки не актуально, но если под компиляцией понимать отсутствие ошибок, то пункт вполне обретает смысл и для веб-приложений</em></p>
<p>Скомпилируйте код и устраните все ошибки прежде чем фиксировать изменения в хранилище. Убедитесь, что новые файлы были зафиксированы. Если их не будет, то у вас локально код будет компилироваться, а все остальные не смогут этого сделать.</p>
<p>Вам, безусловно, следует убедиться, что код компилируется с вашими локальными настройками и на вашей платформе. Вы также должны принять во внимание последствия вашей фиксации для компиляции на другой архитектуре.</p>
<p><strong>Тестируйте ваши изменения перед фиксацией</strong></p>
<p>Запустите приложение и проверьте работу тех участков, которые могли быть затронуты вашими изменениями,чтобы убедиться в том, что изменения ведут себя так, как вы задумывали.</p>
<p><strong>Дважды проверьте то, что фиксируете</strong></p>
<p>Сделайте <em>&laquo;svn up&raquo;</em> и <em>&laquo;svn diff&raquo;</em> перед фиксацией. Получите сообщения от SVN о конфликтах, неизвестных файлах и прочее. &laquo;svn diff&raquo; покажет, что же именно вы фиксируете. Проверьте, действительно ли это то, что вы собирались фиксировать.</p>
<p><strong>Всегда добавляйте содержательные комментарии<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> к фиксации</strong></p>
<p>Комментарии должны быть понятны любому, кто видит только лог. Они не должны зависеть от информации вне контекста фиксации.<br />
Попробуйте описать только те файлы, которые реально затрагиваются в описываемых в комментариях изменениями.</p>
<p>На практике, заносите в комментарии всю важную информацию, которую невозможно увидеть из вывода команды <em>diff</em>.</p>
<p><strong>Система контроля версий не является заменой общению между разработчиками</strong></p>
<p>Когда вы планируете сделать изменения, затрагивающие множество различного кода в SVN, сообщите об этом в подписном листе заранее.</p>
<p>Изменения, затрагивающие множество кода в SVN, такие как переход на использование новых функций в библиотеках, способны сломать прочий код, даже если они кажутся тривиальными. Такие изменения могут быть опасны потому, что приложение должно по ряду причин компилироваться со старыми библиотеками. Сообщив об изменениях заранее, разработчики могут подготовиться и высказать обеспокоенность, прежде, чем что-то сломается.</p>
<p><strong>Возьмите на себя ответственность за собственные фиксации</strong></p>
<p>Если ваша фиксация сломала что-то или имеет побочное действие на другие участки кода, будьте ответственными и исправьте это или помогите другим исправить проблему.</p>
<p><strong>Не фиксируйте код, который вы не понимаете</strong></p>
<p>Избегайте ситуаций, подобных этой: &laquo;Я не знаю, почему он <em>падает</em>, но когда я делаю это, он больше не <em>падает&raquo;</em> или &laquo;Я не вполне уверен, что это правильно, но во всяком случае у меня это работает&raquo;.</p>
<p>Если вы не нашли решение проблемы, обсудите её с другими разработчиками.</p>
<p><strong>Не злоупотребляйте своим SVN-аккаунтом, чтобы пропихнуть изменения, отвергнутые другими разработчиками</strong></p>
<p>Если есть разногласия по поводу изменения кода, они должны быть урегулированы путем обсуждения их в списке рассылки или в частном порядке, а не насильной заменой кода других, просто зафиксировав свои изменения в хранилище.</p>
<p><strong>Если вы фиксируете багфикс, учитывайте перенос исправлений в другие ветки</strong></p>
<p>Используйте одинаковый комментарий для обеих фиксаций &ndash; основного исправления и переносимого (только дополните комментарий номером ревизии основной фиксации). Таким образом, можно легко увидеть, какие исправления были уже перенесены.</p>
<p><strong>Если вы исправляете ошибки, зафиксированные в системе учета ошибок<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>, добавьте в комментарий номер ошибки</strong></p>
<p>Для того, чтобы сохранять вашу систему учета ошибок и SVN синхронизированными, вы должны указывать номер ошибки в комментариях к вашим фиксациям, а затем закрывать ошибку в системе учета.</p>
<p><strong>Создавайте атомарные фиксации</strong></p>
<p>SVN имеет возможность фиксировать более одного файла за один раз. Поэтому, пожалуйста, фиксируйте все связанные изменения в нескольких файлах (даже если они охватывают несколько каталогов одновременно) за один раз. Таким образом, вы будете уверенны, что хранилище останется в компилируемом состоянии (<em>т.е. код в хранилище компилируется без ошибок,&nbsp;&mdash; прим. пер.</em>) до и после фиксации, а так же наборы изменений легки для слияний или откатов.</p>
<p><strong>Не смешивайте изменения форматирования и изменения кода</strong></p>
<p>Изменение форматирования кода, такое как <em>отступ</em> или <em>разрежение</em>, просто взрывает <em>diff</em>, что сильно затрудняет поиск изменений в коде если они перемешаны с форматированием. Фиксирование изменений форматирования отдельно разрешает эту проблему.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>в оригинале: log messages&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:2">
<p>bug tracking system&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>

	Tags: <a href="http://lobach.info/tag/svn/" title="SVN" rel="tag">SVN</a>, <a href="http://lobach.info/tag/%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8c-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b9/" title="контроль версий" rel="tag">контроль версий</a>, <a href="http://lobach.info/tag/perevod/" 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/svn/svn-links/" title="Снова про использование Subversion (29.02.2008)">Снова про использование Subversion</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/some/branch-merging-part2/" title="Как слить изменения между ветками. Часть 2 (27.01.2008)">Как слить изменения между ветками. Часть 2</a> (1)</li>
	<li><a href="http://lobach.info/develop/svn/branch-merging-part1/" title="Как слить изменения между ветками. Часть 1 (22.01.2008)">Как слить изменения между ветками. Часть 1</a> (1)</li>
	<li><a href="http://lobach.info/develop/svn/making-branches/" title="Как и Зачем делать ветки? (18.12.2007)">Как и Зачем делать ветки?</a> (3)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=OtOH3oDXlXo:o45-iabxTyU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/svn/svn-commit-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</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><a href="http://feedads.g.doubleclick.net/~a/OMmCTdY6Z6Y7owuWFvDmNBe9M-I/0/da"><img src="http://feedads.g.doubleclick.net/~a/OMmCTdY6Z6Y7owuWFvDmNBe9M-I/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/OMmCTdY6Z6Y7owuWFvDmNBe9M-I/1/da"><img src="http://feedads.g.doubleclick.net/~a/OMmCTdY6Z6Y7owuWFvDmNBe9M-I/1/di" border="0" ismap="true"></img></a></p><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> (0)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=uDgJYBJAMFs:lpQt3moWLtc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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 href="http://feedads.g.doubleclick.net/~a/CSDNhteERbTxc6Sep_GNgTYXJ3k/0/da"><img src="http://feedads.g.doubleclick.net/~a/CSDNhteERbTxc6Sep_GNgTYXJ3k/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/CSDNhteERbTxc6Sep_GNgTYXJ3k/1/da"><img src="http://feedads.g.doubleclick.net/~a/CSDNhteERbTxc6Sep_GNgTYXJ3k/1/di" border="0" ismap="true"></img></a></p><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/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>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=k_zXl2_AoI0:PtQojC4-Fls:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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 href="http://feedads.g.doubleclick.net/~a/_2mlHk8kov7vG5U2iZy5GHcG_ys/0/da"><img src="http://feedads.g.doubleclick.net/~a/_2mlHk8kov7vG5U2iZy5GHcG_ys/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_2mlHk8kov7vG5U2iZy5GHcG_ys/1/da"><img src="http://feedads.g.doubleclick.net/~a/_2mlHk8kov7vG5U2iZy5GHcG_ys/1/di" border="0" ismap="true"></img></a></p><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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=cxTIrMTR8hU:y51kfWdMjPY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></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><a href="http://feedads.g.doubleclick.net/~a/86SyODSlhWowTVCw-iVCz77LCOY/0/da"><img src="http://feedads.g.doubleclick.net/~a/86SyODSlhWowTVCw-iVCz77LCOY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/86SyODSlhWowTVCw-iVCz77LCOY/1/da"><img src="http://feedads.g.doubleclick.net/~a/86SyODSlhWowTVCw-iVCz77LCOY/1/di" border="0" ismap="true"></img></a></p><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>

<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=U0ZhkNap"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 3.299 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-09 14:20:13 -->
