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

<channel>
	<title>Изучаем Web</title>
	<atom:link href="http://brotkin.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://brotkin.ru</link>
	<description>ковыряемся в Internet</description>
	<lastBuildDate>Wed, 02 May 2012 12:49:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>[Ko3.3] Изменения в модуле ORM</title>
		<link>http://brotkin.ru/2012/05/02/ko33-orm-change/</link>
		<comments>http://brotkin.ru/2012/05/02/ko33-orm-change/#comments</comments>
		<pubDate>Wed, 02 May 2012 12:47:34 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[релизы]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=716</guid>
		<description><![CDATA[
Добавлены методы has_any($alias, $far_keys = NULL) и count_relationships($alias, $far_keys = NULL). Первый метод определяет, имеет ли модель хотя бы одну запись в указанной связи $alias. А метод count_relationships() возвращает общее количество записей по данной связи. Например, если в системе имеются роли &#8216;login&#8216; (ID=1) и &#8216;admin&#8216; (ID=2), и пользователь $user имеет только роль &#8216;login&#8216;, то:


$user-&#62;has&#40;'roles', array&#40;1, [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Добавлены методы <code>has_any($alias, $far_keys = NULL)</code> и <code>count_relationships($alias, $far_keys = NULL)</code>. Первый метод определяет, имеет ли модель хотя бы одну запись в указанной связи <code>$alias</code>. А метод <code>count_relationships()</code> возвращает общее количество записей по данной связи. Например, если в системе имеются роли &#8216;<em>login</em>&#8216; (ID=1) и &#8216;<em>admin</em>&#8216; (ID=2), и пользователь <code>$user</code> имеет только роль &#8216;<em>login</em>&#8216;, то:
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">has</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'roles'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// FALSE</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">has_any</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'roles'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// TRUE</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">count_relationships</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'roles'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 1</span></pre></div></div>

<p></code></p>
<p>(<a href="http://dev.kohanaframework.org/issues/4349">#4349</a>)
</li>
<li>Добавлен защищенный метод <code>_build_select()</code>. Он позволяет указать имена полей, которые будут загружены в модель. По умолчанию загружаются все поля, перечисленные в свойстве <code>$_table_columns</code> (если оно не заполнено вручную, то берутся все поля таблицы). <a href="http://dev.kohanaframework.org/issues/3587">#3587</a></li>
<li>Добавлен метод <code>using()</code> для использования SQL-условия <strong>USING</strong>. В <strong>Query Builder</strong> он есть, а вот в <strong>ORM</strong> его добавить забыли. <a href="http://dev.kohanaframework.org/issues/4049">#4049</a></li>
<li>Теперь валидация при сохранении/обновлении модели может происходить даже если модель не была изменена. Для этого достаточно отсутствия факта валидности модели на данный момент (например, модель загрузили, но не проверяли вручную через <code>check()</code>), либо был передан объект <code>Validation</code> (т.н. &#8220;<em>extra validation</em>&#8221; или &#8220;<em>внешняя валидация</em>&#8220;). <a href="http://dev.kohanaframework.org/issues/4423">#4423</a>, <a href="http://dev.kohanaframework.org/issues/4424">#4424</a></li>
<li>Исправлено неправильное имя файла для ошибок внешней валидации. <a href="http://dev.kohanaframework.org/issues/4185">#4185</a></li>
<li>Исправлена десериализация данных, являющихся массивом. Т.е. в 3.2, если в каком-либо поле модели хранится массив, то после десериализации модели в нем будет уже не массив, а объект <code>stdClass</code>. <a href="http://dev.kohanaframework.org/issues/4188">#4188</a></li>
</ul>
<h2>Auth ORM</h2>
<ul>
<li>При нестандартном имени ключа в модели <code>User</code> попытка создания пользовательского токена (т.е. логин с <code>$remember==TRUE</code>) приводила к ошибке. <a href="http://dev.kohanaframework.org/issues/4222">#4222</a></li>
</ul>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/05/02/ko33-orm-change/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/05/02/ko33-orm-change/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/05/02/ko33-orm-change/&t=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/05/02/ko33-orm-change/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/05/02/ko33-orm-change/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/05/02/ko33-orm-change/&u_data[name]=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/05/02/ko33-orm-change/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/05/02/ko33-orm-change/&bm_description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+ORM+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/05/02/ko33-orm-change/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Ko3.3] Изменения в модуле Database</title>
		<link>http://brotkin.ru/2012/05/02/ko33-database-changes/</link>
		<comments>http://brotkin.ru/2012/05/02/ko33-database-changes/#comments</comments>
		<pubDate>Wed, 02 May 2012 10:45:44 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[релизы]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=711</guid>
		<description><![CDATA[Доработок в этом модуле не слишком много, но я решил выделить их в отдельную статью. Все-таки это один из основных модулей Kohana.
Базовые изменения

Исправлено зацикливание с последующей ошибкой out of memory. Если в системе добавлен Database Config Reader, то он теперь не пытается считывать настройки подключения к БД (отсекается группа настроек &#8216;database&#8216;). #4316
Для определения необходимости ведения [...]]]></description>
			<content:encoded><![CDATA[<p>Доработок в этом модуле не слишком много, но я решил выделить их в отдельную статью. Все-таки это один из основных модулей <strong>Kohana</strong>.</p>
<h2>Базовые изменения</h2>
<ul>
<li>Исправлено зацикливание с последующей ошибкой <code>out of memory</code>. Если в системе добавлен <code>Database Config Reader</code>, то он теперь не пытается считывать настройки подключения к БД (отсекается группа настроек &#8216;<em>database</em>&#8216;). <a href="http://dev.kohanaframework.org/issues/4316">#4316</a></li>
<li>Для определения необходимости ведения статистических замеров (<em>profiling</em>) модуль теперь использует централизованную настройку <code>Kohana::$profiling</code> (устанавливается в <code>Kohana::init()</code>). В 3.2 модуль <code>Database</code> имел собственный параметр &#8216;<em>profiling</em>&#8216; в конфиге. <a href="http://dev.kohanaframework.org/issues/4203">#4203</a></li>
<li>В методах <code>compile($db)</code> семейства классов <code>Database_Query</code> параметр <code>$db</code> сделан опциональным. Кроме того, он может являться не объектом <code>Database</code>, а строкой (т.е. именем соответствующего профиля в конфиге). Такая логика уже присутствовала в методе <code>execute($db)</code>. <a href="http://dev.kohanaframework.org/issues/3872">#3872</a><br />
<blockquote><p>Напомню, метод <code>compile()</code> преобразовывает условия запроса <code>Query_Builder</code>&#8216;а в SQL-строку, но не выполняет запрос, а возвращает сгенерированный текст.</p></blockquote>
</li>
<li>В <code>Query_Builder</code> появился еще один метод для работы с группами условий. В 3.2 имеются методы <code>where_open()</code>, <code>and_where_open()</code>, <code>or_where_open()</code> и <code>where_close()</code>. Они позволяют объединять условия в группы, например <code>WHERE (`a` > 0 OR `b` < 0) AND `c` == 1</code>. Иногда возникает потребность формировать такие группы условий динамически (например, обработка данных с формы поиска). И может возникнуть ситуация, когда группа создана (вызваны методы <code>where_open()</code> и <code>where_close()</code>), а внутри условий нет. Во избежание подобных ситуаций был добавлен метод <code>where_close_empty()</code>. Если внутри группы есть хоть одно условие, то он действует аналогично <code>where_close()</code>. <a href="http://dev.kohanaframework.org/issues/4052">#4052</a></li>
<li>Database-драйверы для <code>Config</code> и <code>Session</code>, а также модели (<code>Model_Database</code>) по умолчанию теперь используют профиль <code>Database::$default</code>. Ранее было жестко прописано значение '<em>default</em>'. <a href="http://dev.kohanaframework.org/issues/4289">#4289</a></li>
<li>Повышено качество phpDoc-комментариев.</li>
</ul>
<h2>PDO</h2>
<ul>
<li>В драйвер <strong>PDO</strong> можно передать дополнительные параметры (см <a href="http://www.php.net/manual/en/pdo.construct.php">driver_options</a>). Используйте ключ <code>['connection']['options']</code>. <a href="http://dev.kohanaframework.org/issues/4372">#4372</a></li>
<li>Для PDO параметр '<em>charset</em>' в конфиге неактулен. Устанавливайте его через DSN, либо в доп. параметрах (<code>['connection']['options']['charset']</code>). <a href="http://dev.kohanaframework.org/issues/4078">#4078</a></li>
</ul>
<p><strong>PS</strong>. Пока негусто. Если в последующих RC или в финальной версии будут еще изменения, они будут добавлены в данную статью.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/05/02/ko33-database-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/05/02/ko33-database-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/05/02/ko33-database-changes/&t=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/05/02/ko33-database-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/05/02/ko33-database-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/05/02/ko33-database-changes/&u_data[name]=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/05/02/ko33-database-changes/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/05/02/ko33-database-changes/&bm_description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5+Database+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/05/02/ko33-database-changes/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>[Ko3.3] Прочие изменения ядра</title>
		<link>http://brotkin.ru/2012/04/26/ko33-core-changes/</link>
		<comments>http://brotkin.ru/2012/04/26/ko33-core-changes/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 08:08:49 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[версии]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=687</guid>
		<description><![CDATA[В предыдущей статье я описал основные изменения ядра фреймворка, затронувшие механизм обработки запроса-ответа. Пришло время описать прочие новшества, достойные нашего внимания.
Правила именования файлов

Поддержка стандарта PSR-0 привела к тому, что все имена файлов классов в Kohana 3.3 должны начинаться с большой буквы. В регистрочувствительных системах (т.е. все кроме Windows) это важно. 
Для корректной работы старых модулей, [...]]]></description>
			<content:encoded><![CDATA[<p>В <a href="http://brotkin.ru/2012/04/01/ko33-requests/">предыдущей статье</a> я описал основные изменения ядра фреймворка, затронувшие механизм обработки запроса-ответа. Пришло время описать прочие новшества, достойные нашего внимания.</p>
<h2>Правила именования файлов</h2>
<ul>
<li>Поддержка стандарта PSR-0 привела к тому, что все имена файлов классов в Kohana 3.3 должны начинаться с большой буквы. В регистрочувствительных системах (т.е. все кроме Windows) это важно. </li>
<li>Для корректной работы старых модулей, не приведенных к новому стандарту имен файлов, добавили метод <code>Kohana::auto_load_lowercase()</code>. Просто добавляете его к стандартному автозагрузчику в bootstrap.php и можно продолжать работать:
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">spl_autoload_register</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Kohana'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'auto_load_lowercase'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code>
</li>
<li>Добавилась поддержка <em>namespace</em>&#8216;ов в именах классов. Правила все те же &#8211; <em>namespace </em>(если он есть) будет преобразован в путь к классу, в качестве разделителей используется стандартный разделитель в PHP &#8211; &#8216;\\&#8217;.</li>
</ul>
<h2>CLI</h2>
<ul>
<li>Убрали класс <strong>CLI</strong> (был только метод <code>CLI::options()</code>, перенесен в <code>Minion_CLI::options()</code>). <a href="http://dev.kohanaframework.org/issues/3989">#3989</a></li>
<li>Из класса <code>Kohana</code> убрали статическое свойство <code>$is_cli</code>. Оно теперь не требуется, т.к. вся обработка <strong>CLI</strong> идет через модуль <a href="http://brotkin.ru/2012/03/28/minion-module/">Minion</a>.</li>
</ul>
<h2>класс Kohana (Kohana_Core)</h2>
<ul>
<li>Убрали свойство <code>Kohana::$log_errors</code>. Оно все равно не использовалось, при обработке исключений стандартным методом <code>Kohana_Exception::_handler()</code> лог теперь пишется. Осталось не забыть про логирование в своих обработчиках классов <code>HTTP_Exception</code>.</li>
<li>При инициализации ядра (метод <code>Kohana::init()</code>) добавили проверку на наличие подключенных логов и конфигов в свойствах <code>Kohana::$log</code> и <code>Kohana::$config</code>. Теперь можно спокойно добавлять свои обработчики логов/конфигов ДО вызова <code>Kohana::init()</code> и не бояться, что они пропадут.</li>
<li>Добавлен метод <code>Kohana::version()</code>, который просто возвращает строку с номером версии фреймворка и ее кодовым именем. Можно использовать для вывода информации где-нибудь в &#8220;подвале&#8221; сайта мааааленькими буквами.</li>
</ul>
<h2>Request</h2>
<ul>
<li><code>Request::factory()</code> поменял перечень принимаемых параметров. Теперь он выглядит следующим образом:
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 *
 * @param   string  $uri              URI of the request
 * @param   array   $client_params    An array of params to pass to the request client
 * @param   bool    $allow_external   Allow external requests? (deprecated in 3.3)
 * @param   array   $injected_routes  An array of routes to use, for testing
 * @return  void|Request
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> factory<span style="color: #009900;">&#40;</span><span style="color: #000088;">$uri</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> <span style="color: #000088;">$client_params</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$allow_external</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> <span style="color: #000088;">$injected_routes</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code></p>
<p>Исключен аргумент <code>$cache</code>, в котором можно было передать объект <code>HTTP_Cache</code> для кеширования запроса, вместо него добавили параметры <code>$client_params</code> и <code>$allow_external</code> (который только появился и уже объявлен <em>deprecated</em>). </p>
<ul>
<li>По названию <code>$client_params</code> можно догадаться, что это параметры, которые будут переданы в <code>Request_Client</code>. На данный момент есть ограничение &#8211; будут использованы только те параметры, для которых есть одноименный сеттер в объекте <code>Request_Client</code>. Это &#8216;<em>cache</em>&#8216; (передаем объект <code>HTTP_Cache</code>), &#8216;<em>follow</em>&#8216; (булевский флаг, который разрешает или запрещает редирект), &#8216;<em>follow_headers</em>&#8216; (массив HTTP-заголовков, которые надо передать дальше после редиректа) и &#8216;<em>strict_redirect</em>&#8216; (если <strong>TRUE</strong>, то при 302 редиректе будет сохранен исходный метод HTTP-запроса, как того требует HTTP/1.1 &#8211; это поведение по умолчанию).
<p>Перечень параметров будет дорабатываться и расширяться. Например, сейчас в ветку <code>3.3/develop</code> добавлены <code>header_callbacks</code> (<a href="http://dev.kohanaframework.org/issues/4353">#4353</a>).
</li>
<li>Параметр <code>$allow_external</code> позволяет запретить использование <code>Request_Client_External</code>, т.е. все поступающие запросы будут обработаны через <code>Request_Client_Internal</code>, как внутренние.</li>
</ul>
</li>
<li>Убран метод <code>response()</code>, который позволял получить текущий объект <code>Response</code>.</li>
<li>Удален метод <code>generate_etag()</code>. В версии 3.2 это был дефолтный способ сгенерировать etag из содержимого <code>Response</code> объекта <code>Request</code>. В 3.3 класс <code>Request</code> уже не содержит свойство <code>$_response</code>, поэтому данный метод доступен только из класса <code>Request</code>.</li>
<li>Методы <code>query()</code> и <code>post()</code> поддерживают многомерные массивы (применяется <code>Arr::path()</code> вместо <code>Arr::get()</code>). Т.е. теперь можно использовать <code>$request->query('foo.bar')</code>, чтобы получить <code>$_GET['foo']['bar']</code>.</li>
</ul>
<h2>Роутинг</h2>
<ul>
<li><strong>Фильтры</strong>. Одно из самых заметных нововведений. В 3.3 к каждому маршруту можно добавлять условия, влияющие на итоговые параметры маршрута (контроллер, экшен и т.д.). Более того, с помощью фильтров можно даже указать, что данный маршрут не подходит под предложенный URI. Приведу ниже несколько примеров, бессмысленных и беспощадных:
<p><em>Используем анонимную функцию, чтобы запретить использование маршрута:</em></p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Route<span style="color: #339933;">::</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))'</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">defaults</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Welcome'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'action'</span>     <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>Route <span style="color: #000088;">$route</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>Kohana<span style="color: #339933;">::</span><span style="color: #000088;">$environment</span> <span style="color: #339933;">===</span> Kohana<span style="color: #339933;">::</span><span style="color: #004000;">PRODUCTION</span><span style="color: #009900;">&#41;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<blockquote><p>Если мы хотим указать, что данный маршрут не подходит, то надо вернуть <strong>FALSE</strong> из фильтра.</p></blockquote>
<p><em>Вносим изменения в вычисленные параметры маршрута (меняем экшен в зависимости от используемого HTTP-метода):</em></p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Route<span style="color: #339933;">::</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'default'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'(&lt;controller&gt;(/&lt;action&gt;(/&lt;id&gt;)))'</span><span style="color: #009900;">&#41;</span>
	<span style="color: #339933;">-&gt;</span><span style="color: #004000;">defaults</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Welcome'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'action'</span>     <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'index'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>Route <span style="color: #000088;">$route</span><span style="color: #339933;">,</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> Request<span style="color: #339933;">::</span><span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> ? Request<span style="color: #339933;">::</span><span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">method</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> Arr<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'REQUEST_METHOD'</span><span style="color: #339933;">,</span> <span style="color: #990000;">HTTP_Request</span><span style="color: #339933;">::</span><span style="color: #004000;">GET</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">case</span> <span style="color: #990000;">HTTP_Request</span><span style="color: #339933;">::</span><span style="color: #004000;">POST</span><span style="color: #339933;">:</span>
				<span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'create'</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> <span style="color: #990000;">HTTP_Request</span><span style="color: #339933;">::</span><span style="color: #004000;">PUT</span><span style="color: #339933;">:</span>
				<span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'change'</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">case</span> <span style="color: #990000;">HTTP_Request</span><span style="color: #339933;">::</span><span style="color: #004000;">DELETE</span><span style="color: #339933;">:</span>
				<span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'delete'</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span>
				<span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'action'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'show'</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$params</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<blockquote><p>
Обратите внимание, что необходимо вернуть массив параметров, если в него были внесены изменения. Если просто вернуть <strong>TRUE</strong> (или ничего не возвращать), то фильтр будет воспринят как прошедший проверку, но не поменявший параметры маршрута.</p></blockquote>
</li>
<li>Иногда бывает необходимо объединить кешированные маршруты с уже зарегистрированными в системе. Для этого в метод <code>Route::cache()</code> добавили второй параметр <code>$append</code>. Если он выставлен в <strong>TRUE</strong>, то загруженные из кеша маршруты будет добавлены к существующим. В 3.2 они их полностью заменяли (впрочем, сейчас это осталось поведением по умолчанию).</li>
</ul>
<h2>Хэлперы</h2>
<ul>
<li>Исправлена работа метода <code>Arr::get()</code>, теперь он нормально обрабатывает <strong>NULL</strong>-значения в массиве. <a href="http://dev.kohanaframework.org/issues/4012">#4012</a></li>
<li>Добавлен метод <code>Arr::set_path()</code> для установки значения в многомерных массивах. Кроме того, <code>Arr::extract()</code> теперь работает с многомерными массивами (используются пути <code>Arr::path()</code> вместо ключей <code>Arr::get()</code>).</li>
<li><code>Arr::merge()</code> теперь объединяет многомерные массивы без замены старого значения на новое. Это в первую очередь полезно при работе с конфигами. Пример можно посмотреть в <a href="http://dev.kohanaframework.org/issues/3141">#3141</a>.<br />
<code>Date::format_time()</code> теперь принимает в качестве третьего (опционального) параметра идентификатор времЕнной зоны (<em>timezone</em>). </li>
<li>В хэлпер <code>HTML</code> добавили статическое свойство <code>$strict</code>. Если оно установлено в <strong>TRUE</strong> (по умолчанию), то сгенерированные элементы HTML будут содержать атрибуты в формате, принятом XHTML. Т.е. не <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;checkbox&quot;</span> checked<span style="color: #339933;">&gt;</span></pre></div></div>

<p></code> а <code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;checkbox&quot;</span> checked<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;checked&quot;</span><span style="color: #339933;">&gt;</span></pre></div></div>

<p></code></li>
<li>При записи лог-сообщения автоматически будет добавлена отладочная информация (<em>tracelog</em>, имя файла, номер строки и т.д.). А в методе <code>Kohana::log()</code> появился четвертый параметр <code>$additional</code>, в котором может содержаться различная полезная информация для записи в лог. В частности, если в <code>$additional['exception']</code> сохранить объект <code>Exception</code>, то трейслог будет взят из него.</li>
<li>Логирование сделано более настраиваемым. В классах-потомках <code>Log_Writer</code> можно переопределить метод <code>format_message()</code>, чтобы установить свой формат текстовых сообщений в логах. Кроме того, добавились статические свойства <code>Log_Writer::$timestamp</code> и <code>Log_Writer::$timezone</code>, позволяющие указать формат даты и временнУю зону для логов.</li>
<li>Можно указать свой метод для сериализации или кодирования (обфускации) содержимого сессии. Если раньше использовался <code>serialize()</code> и <code>base64_encode()</code>, то теперь они вынесены в методы <code>_serialize()/_unserialize()/_encode()/_decode()</code>. То есть их можно переопределить, если вдруг понадобится.</li>
<li>Добавился метод <code>Text::user_agent($agent, $value)</code>. Точнее, не добавился, а был вынесен из метода <code>Request::user_agent($value)</code>. Он вычленял отдельный параметр из пользовательского <em>User_Agent</em>&#8216;а (имя параметра передавалось в <code>$value</code>), а значение <em>User_Agent</em> бралось из <code>Request</code>. Сейчас метод стал более универсальным, в него надо передавать <em>User_Agent</em> явно (например, брать <code>Request::$user_agent</code>). Возможные значения <code>$value</code>:
<ul>
<li>&#8216;platform&#8217; &#8211; имя операционной системы (&#8216;Windows 7&#8242;, &#8216;Windows XP&#8217;, &#8216;FreeBSD&#8217; и т.д.)</li>
<li>&#8216;browser&#8217; &#8211; имя семейства браузеров (&#8216;Internet Explorer&#8217;, &#8216;Opera&#8217;, &#8216;Firefox&#8217; и т.д.)</li>
<li>&#8216;mobile&#8217; &#8211; имя мобильного клиента (&#8216;iPhone&#8217;, &#8216;Android&#8217;, &#8216;Opera mini&#8217; и т.д.)</li>
<li>&#8216;robot&#8217; &#8211; имя бота (&#8216;Googlebot&#8217;, &#8216;Yahoo&#8217;, &#8216;Facebook&#8217; и т.д.)</li>
</ul>
<blockquote><p>Эти настройки берутся из конфиг-файла <code>user_agents.php</code>, и легко могут быть изменены под собственные нужды.</p></blockquote>
<p>Примеры использования:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$agent</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.18) Gecko/20110621 Fedora/3.6.18-1.fc14 Firefox/3.6.18'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> Text<span style="color: #339933;">::</span><span style="color: #004000;">user_agent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$agent</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'browser'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 'Firefox'</span>
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> Text<span style="color: #339933;">::</span><span style="color: #004000;">user_agent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$agent</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'version'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'mobile'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// array('3.6.18', false)</span></pre></div></div>

<p></code></li>
<li>В правило <code>Valid::range()</code> добавился 4-й параметр <code>$step</code> (1 по умолчанию). Т.е. теперь можно проверять значение на нахождение в диапазоне значений с произвольным шагом (к примеру, [1,3,5,7,9,11]).</li>
</ul>
<h2>Исключения</h2>
<ul>
<li>Добавлены классы для HTTP-кодов 300, 301, 302, 303, 304, 305, 307.</li>
<li>Исключения семейства классов <code>HTTP_Exception</code> теперь могут сообщить, какой <code>Request</code> из &#8220;выбросил&#8221;. Используйте метод <code>request()</code> для получения этого объекта.</li>
<li>Исключения <code>HTTP_Exception</code> имеют встроенный валидатор, проверяющий достаточность переданных данных для успешной обработки исключения. Для этого реализован метод <code>check()</code>, в котором мы можем для любого исключения добавить собственную проверку. Вот так, к примеру, проверяются исключения класса <code>HTTP_Exception_Redirect</code> (коды 301-305, 307, 405):
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> check<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">headers</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'location'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
		throw <span style="color: #000000; font-weight: bold;">new</span> Kohana_Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'A \'location\' must be specified for a redirect'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></li>
</ul>
<h2>Прочие изменения</h2>
<ul>
<li>Поправили PHPDOC, особенно в части указания правильных типов возвращаемых объектов. </li>
<li>Добавлены еще исключения в конфиг <code>inflector.php</code>.</li>
</ul>
<p>UPD. Пока писал данную статью, <a href="http://forum.kohanaframework.org/discussion/10681/kohana-3-3-0-rc2-released">вышел</a> второй RC. </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/04/26/ko33-core-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/04/26/ko33-core-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/04/26/ko33-core-changes/&t=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/04/26/ko33-core-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/04/26/ko33-core-changes/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/04/26/ko33-core-changes/&u_data[name]=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/04/26/ko33-core-changes/&title=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/04/26/ko33-core-changes/&bm_description=%5BKo3.3%5D+%D0%9F%D1%80%D0%BE%D1%87%D0%B8%D0%B5+%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D1%8F%D0%B4%D1%80%D0%B0+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/04/26/ko33-core-changes/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>[Ko3.3] Изменения в обработке запросов</title>
		<link>http://brotkin.ru/2012/04/01/ko33-requests/</link>
		<comments>http://brotkin.ru/2012/04/01/ko33-requests/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 05:44:25 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[hmvc]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[релизы]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=686</guid>
		<description><![CDATA[В ветке 3.3 продолжилось дальнейшее развитие классов, участвующих в выполнении запросов (Request, Response, Controller, HTTP и т.д.). Так как поменялись некоторые важные нюансы, решил выделить изменения в отдельную статью.
Выполнение экшена контроллера
#4377. В версии 3.2 запуском экшенов управлял объект Request (а точнее, метод execute_request() класса Request_Client_Internal). Он запускал before(), затем проверял существование нужного экшена и выполнял [...]]]></description>
			<content:encoded><![CDATA[<p>В ветке 3.3 продолжилось дальнейшее развитие классов, участвующих в выполнении запросов (<code>Request</code>, <code>Response</code>, <code>Controller</code>, <code>HTTP</code> и т.д.). Так как поменялись некоторые важные нюансы, решил выделить изменения в отдельную статью.</p>
<h2>Выполнение экшена контроллера</h2>
<p><a href="http://dev.kohanaframework.org/issues/4377">#4377</a>. В версии <strong>3.2</strong> запуском экшенов управлял объект <code>Request</code> (а точнее, метод <code>execute_request()</code> класса <code>Request_Client_Internal</code>). Он запускал <code>before()</code>, затем проверял существование нужного экшена и выполнял его, и под конец запускал метод <code>after()</code>. Концепция удобная, но расположение внутри класса <code>Request_Client_Internal</code> затрудняло внесение изменений в данный процесс. Даже если подкорректировать алгоритм через класс-пустышку, то это затронет абсолютно все внутренние запросы проекта. </p>
<p>В версии <strong>3.3</strong> предложен более удобный способ. Базовый класс <code>Controller</code> имеет метод <code>execute()</code>, внутри которого и расположился описанный выше алгоритм. В результате мы можем легко поменять его под свои нужды, в том числе для отдельной группы контроллеров. Очень удобно. Также можно ловить исключения для целой группы экшенов в одном месте.</p>
<blockquote><p>Метод <code>execute()</code> должен возвращать объект <code>Response</code>!</p></blockquote>
<h2>HMVC</h2>
<p>Переработана идеология работы подзапросов. Теперь они изолированы от родительского запроса. В частности, брошенное исключение или редирект не повлияют на родительский запрос. В любом случае вернется объект класса <code>Response</code>. </p>
<p>В версии <strong>3.2</strong> после брошенного исключения возвращался текст ответа (т.е. строка), а редирект в дочернем подзапросе приводил к остановке выполнения запросов и перенаправлению на новый адрес. Теперь же можно спокойно анализировать результат работы запроса, в частности его статус (с помощью метода <code>status()</code>):</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// пример обработки HMVC в 3.3</span>
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> Request<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo/bar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">status</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">404</span><span style="color: #339933;">:</span> 
         <span style="color: #666666; font-style: italic;">// обрабатываем 404</span>
         <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">...</span>
    <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">:</span>
        <span style="color: #666666; font-style: italic;">// все ок, можно показывать результат</span>
        <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<h2>Коды HTTP-ответов</h2>
<p>Обработка HTTP-статусов теперь облегчена по сравнению с <strong>3.2</strong>, не надо устанавливать и потом анализировать <code>$this->response->status()</code>, достаточно просто выбросить <code>HTTP_Exception</code>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// отправляем погуглить ;)</span>
throw HTTP_Exception<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">302</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://google.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>Обработчик исключений сгенерирует <code>Response</code> с соответствующим статусом, заполнит его тело (body) и заголовки (headers) если надо.</p>
<h2>HTTP_Exception</h2>
<p>Изменения в обработке исключений связаны с изменениями в <strong>HMVC</strong>. Теперь каждое исключение должно отдавать объект <code>Response</code> в качестве результата работы. Причем механизм различен для семейства исключений <strong>HTTP</strong> и всех остальных.</p>
<h3>Исключения класса HTTP_Exception</h3>
<p>В Kohana существует целый ряд исключений для различных <a href="http://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP">HTTP-кодов</a>. Но если в Kohana <strong>3.2</strong> они принципиально ничем не отличались от остальных исключений (разве что для них были заранее заготовлены тексты сообщений в свойстве <code>Response::$messages</code>), то в <strong>3.3</strong> для них можно легко реализовать красивые страницы сообщений. Все, что нужно сделать &#8211; написать свой метод <code>get_response()</code> в соответствующем классе. </p>
<p>Например, вот так осуществляется вывод по умолчанию (метод в классе <code>HTTP_Exception</code>):</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_response<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> Kohana_Exception<span style="color: #339933;">::</span><span style="color: #004000;">response</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Это вызов стандартного обработчика, который всегда используется со всеми остальными исключениями (см. ниже). Никто не мешает нам вывести специальную страницу для кода 404 (страница не найдена):</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// в классе HTTP_Exception_404</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get_response<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	Kohana_Exception<span style="color: #339933;">::</span><span style="color: #990000;">log</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> Response<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">status</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">404</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #009900;">&#40;</span>View<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http/404'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Обработчик очень простой &#8211; сообщение об ошибке логируется (стандартный для исключений метод <code>Kohana_Exception::log()</code>), создается объект <code>Response</code>, в который передается статус 404 и специальная вьюшка для отображения страницы <em>Not Found</em>.</p>
<h3>Обработчик по умолчанию</h3>
<p>Для всех исключений, кроме <code>HTTP_Exception</code> с собственным методом <code>get_response()</code>, будет применен метод <code>Kohana_Exception::response($exception)</code>. В нем проводится сбор данных об исключении (код, текст ошибки, трассировка и т.д.) и передается в шаблон для генерации стандартной страницы ошибки (она ничем не отличается от предыдущих версий). Имя используемого шаблона конфигурируется, для этого надо изменить свойство <code>Kohana_Exception::$error_view</code> (по умолчанию &#8216;<em>kohana/error</em>&#8216;).</p>
<h2>Редирект</h2>
<p>Выше я уже отметил, что редирект в версии <strong>3.3</strong> не ведет к немедленному прекращению выполнения запроса. Он теперь всего лишь выбрасывает <code>HTTP_Exception</code> с переданным кодом и <strong>URI</strong> назначения. А тот, в свою очередь, должен вернуть объект <code>Response</code> со статусом и заголовком <code>Location</code>. Если запрос является основным, то объект <code>Response</code> отошлет заголовки, и редирект все же произойдет. А вот <strong>HMVC</strong>-запросы ломать работу основного не будут, и вместо неожиданных редиректов скромно вернут ответ со статусом <em>30x</em>.</p>
<p>Помимо общих принципов, изменилось и собственно API для осуществления редиректов. Метод <code>redirect($url = '', $code = 302)</code> переместился из класса <code>Request</code> в классы <code>Controller</code> и <code>HTTP</code>, причем статический (!) метод в контроллере (<code>Controller::redirect()</code>) является оберткой вокруг метода <code>HTTP::redirect()</code>. </p>
<h2>HTTP-кеширование</h2>
<p>В версии <strong>3.2</strong> обработка заголовков HTTP-кеширования велась с помощью метода <code>check_cache($etag = NULL, Request $request = NULL)</code> класса <code>Response</code>. В ветке <strong>3.3</strong> данный метод переместился в класс <code>Controller</code>, и нужды в передаче параметра <code>$request</code> уже нет (передается <code>$this->request</code>).</p>
<p>Для тех, кто не знает, зачем это нужно, предлагаю посмотреть кусок кода из <strong>Userguide</strong>, метод отвечает за отображение медиафайлов (css, js и т.д.):</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> Kohana<span style="color: #339933;">::</span><span style="color: #004000;">find_file</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'media/guide'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ext</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Check if the browser sent an &quot;if-none-match: &lt;etag&gt;&quot; header, and tell if the file hasn't changed</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">check_cache</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">sha1</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">uri</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Send the file content as the response</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">// Set the proper headers to allow caching</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">headers</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'content-type'</span><span style="color: #339933;">,</span>  <span style="color: #990000;">File</span><span style="color: #339933;">::</span><span style="color: #004000;">mime_by_ext</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ext</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">headers</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'last-modified'</span><span style="color: #339933;">,</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'r'</span><span style="color: #339933;">,</span> <span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p><em>Etag</em> вычисляется на основе переданного URI и даты последнего изменения запрашиваемого файла. Если браузер передал заголовок <em>if-none-match</em> с совпавшим идентификатором <em>etag</em>, то до <code>file_get_contents()</code> выполнение не дойдет. От сервера вернется ответ с кодом <em>304 Not Modified</em>.</p>
<h2>Заключение</h2>
<p>В данной статье я описал изменения, влияющие на основную задачу ядра &#8211; обработку запросов (request flow). Отдельные изменения, затронувшие менее важные задачи (в основном это изменения хэлперов и библиотек) будут описаны в следующей статье.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/04/01/ko33-requests/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/04/01/ko33-requests/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/04/01/ko33-requests/&t=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/04/01/ko33-requests/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/04/01/ko33-requests/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/04/01/ko33-requests/&u_data[name]=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/04/01/ko33-requests/&title=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/04/01/ko33-requests/&bm_description=%5BKo3.3%5D+%D0%98%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%B2+%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/04/01/ko33-requests/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>[Ko3.3] Модуль Minion</title>
		<link>http://brotkin.ru/2012/03/28/minion-module/</link>
		<comments>http://brotkin.ru/2012/03/28/minion-module/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 13:22:56 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[minion]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=678</guid>
		<description><![CDATA[В списке официальных модулей Kohana наконец-то прибавление. RC1 для Kohana 3.3 содержит новый модуль Minion. Он предназначен для выполнения задач через CLI (обычно это задачи для Cron&#8216;а). 
Подготовка
Для начала необходимо настроить модуль для работы. 

К сожалению, релиз RC1 содержит ссылку не на последнюю версию модуля Minion, поэтому необходимо вручную обновить модуль до последнего коммита (т.е. [...]]]></description>
			<content:encoded><![CDATA[<p>В списке официальных модулей <strong>Kohana</strong> наконец-то прибавление. <strong>RC1</strong> для <strong>Kohana 3.3</strong> содержит новый модуль <a href="https://github.com/kohana/minion">Minion</a>. Он предназначен для выполнения задач через <a href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8">CLI</a> (обычно это задачи для <a href="http://ru.wikipedia.org/wiki/Cron">Cron</a>&#8216;а). </p>
<h3>Подготовка</h3>
<p>Для начала необходимо настроить модуль для работы. </p>
<ul>
<li>К сожалению, релиз <strong>RC1</strong> содержит ссылку не на последнюю версию модуля <strong>Minion</strong>, поэтому необходимо вручную обновить модуль до последнего коммита (т.е. до <strong>HEAD</strong>). Это делается командой <code>cd modules/Minion &#038;&#038; git pull origin 3.3/develop</code>.</li>
<li>Разрешаем загрузку модуля <strong>Minion</strong> в файле <code>bootstrap.php</code> (он там уже по умолчанию есть, но закомментирован).</li>
<li>Копируем файл <code>minion</code> из <code>MODPATH/minion/</code> в нужное место (т.е. туда, откуда он будет запускаться планировщиком задач). Можно и не копировать. Затем вносим в него правки, чтобы переменные <code>$application</code>, <code>$modules</code> и <code>$system</code> указывали в правильные места (можно скопировать их из <code>index.php</code>, если вы решили его положить в <code>DOCROOT</code>).</li>
</ul>
<p>Чтобы проверить, правильно ли все настроено, запустите из терминала команду:</p>
<p><code>./minion --help</code></p>
<p>Она должна вывести краткую информацию о модуле <strong>Minion</strong>, а также список доступных для выполнения задач. </p>
<h3>Задачи в Minion</h3>
<p>Самый простой способ понять этот механизм &#8211; создать простейшую задачу. По традиции реализуем вывод фразы &#8220;<em>hello world!</em>&#8220;:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">// файл APPPATH/classes/Task/Welcome.php
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Its a test task class
 *
 * @author biakaveron
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Task_Welcome <span style="color: #000000; font-weight: bold;">extends</span> Minion_Task <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Test action
	 *
	 * @param array $params
	 * @return void
	 */</span>
	protected <span style="color: #000000; font-weight: bold;">function</span> _execute<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'hello world!'</span> <span style="color: #339933;">.</span> PHP_EOL<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Вот и все. Если запустить команду <code>./minion --task=welcome</code>, то в ответ увидим строку &#8220;hello world!&#8221;.</p>
<p>Каждая задача выполняется в виде отдельного класса-потомка <code>Minion_Task</code>. За выполнение задачи отвечает метод <code>_execute($params)</code>.</p>
<h3>Передача параметров</h3>
<p>В методе <code>_execute()</code> присутствует аргумент <code>$params</code>, который будет содержать все параметры, переданные в задачу через консоль. Все, кроме имени задачи (ключ <code>--task</code>) и специального ключ <code>--help</code> (о нем расскажу позже). Например, <code>./minion --task=welcome --foo=bar</code> означает передачу параметра &#8216;<em>foo</em>&#8216; со значением &#8216;<em>bar</em>&#8216;.</p>
<blockquote><p>Имена параметров (в том числе и <code>task</code>) регистрозависимы, поэтому <code>./minion --Task=welcome</code> и <code>./minion --tasK=welcome</code> приведут к ошибке. Кроме того, имена задач тоже должны быть в нужном регистре (допускается полностью нижний регистр в имени). Например, <code>./minion --task=welcome</code> и <code>./minion --task=Welcome</code> сработают, а <code>./minion --task=welcomE</code> нет.</p></blockquote>
<p>Если вы попробовали запустить задачу <code>Welcome </code>с дополнительными параметрами, то должны были получить сообщение об ошибке <strong>Kohana</strong>. Дело в том, что необходимо для каждой задачи явно описывать допустимые параметры, а также их значения по умолчанию. Таким образом, новая версия задачи <code>Welcome</code> будет выглядеть примерно так:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SYSPATH'</span><span style="color: #009900;">&#41;</span> or <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'No direct script access.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Its a test task class
 *
 * @author biakaveron
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Task_Welcome <span style="color: #000000; font-weight: bold;">extends</span> Minion_Task <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$_options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #666666; font-style: italic;">// param name =&gt; default value</span>
		<span style="color: #0000ff;">'foo'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'beautiful'</span><span style="color: #339933;">,</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Test action
	 *
	 * @param array $params
	 * @return void
	 */</span>
	protected <span style="color: #000000; font-weight: bold;">function</span> _execute<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #000088;">$params</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'hello '</span><span style="color: #339933;">.</span><span style="color: #000088;">$params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">' world!'</span> <span style="color: #339933;">.</span> PHP_EOL<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Теперь <code>./minion --task=Welcome</code> выведет &#8220;<em>hello beautiful world</em>&#8221; (использовано значение по умолчанию), а <code>./minion --task=Welcome --foo=great</code> напишет &#8220;<em>hello great world</em>&#8220;.</p>
<h3>Валидация</h3>
<p>По умолчанию все переданные параметры проверяются только на их наличие в списке разрешенных. Такое поведение можно легко изменить с помощью метода <code>build_validation(Validation $validation)</code>. Он подготавливает объект <code>Validation</code> для дальнейшей проверки параметров. Вот так он выглядит в классе <code>Minion_Task</code>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> build_validation<span style="color: #009900;">&#40;</span>Validation <span style="color: #000088;">$validation</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Add a rule to each key making sure it's in the task</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$validation</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">as_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$validation</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">rule</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'valid_option'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':validation'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">':field'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$validation</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Каждый переданный параметр проверяется с помощью метода <code>valid_option()</code>, который просто ищет имя параметра в списке разрешенных. Если мы захотим ограничить поле <code>foo</code> длиной в 10 символов, то необходимо будет создать в задаче <code>Welcome</code> метод <code>build_validation()</code>:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> build_validation<span style="color: #009900;">&#40;</span>Validation <span style="color: #000088;">$validation</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">build_validation</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validation</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">rule</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'max_length'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<blockquote><p>Не забывайте вернуть объект <strong>Validation</strong>!</p></blockquote>
<p>А вот пример для задачи без ограничений по параметрам:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> build_validation<span style="color: #009900;">&#40;</span>Validation <span style="color: #000088;">$validation</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$validation</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>Я просто не стал добавлять никаких правил (в том числе и определенных в классе-родителе). Теперь явно указывать параметры задачи в свойстве <code>$_options</code> необязательно.</p>
<h3>Справка по задачам</h3>
<p>Модуль имеет зарезервированный ключ <code>--help</code>, по которому он отображает справку по задаче (если указана в параметре <code>--task</code>) или по модулю в целом (мы это видели после команды <code>./minion</code>). Так, вызов <code>./minion --task=Welcome --help</code> для нашей задачи <code>Welcome</code> вернет такой текст:</p>
<blockquote><pre>Usage
=======
php minion.php --task=welcome [--option1=value1] [--option2=value2]

Details
=======
Author: biakaveron

Description
===========
Its a test task class</pre>
</blockquote>
<p>Легко понять откуда взялась такая информация &#8211; из <strong>PHPDOC</strong> к классу <code>Task_Welcome</code>. Таким вот образом разработчики <strong>Kohana</strong> облегчают работу, позволяя разом убивать двух зайцев &#8211; документировать исходники и писать <em>man</em> для задач. </p>
<h3>Альтернативный запуск задач</h3>
<p>Запускать задачи можно и без использования скрипта <code>minion</code>. Любые CLI-команды будут перенаправлены к модулю <strong>Minion</strong>, поэтому вместо <code>./minion --task=Welcome</code> можно использовать <code>php index.php --task=Welcome</code>.</p>
<h3>Заключение</h3>
<p>Очень полезный модуль. Однако он, как и вся ветка <strong>3.3</strong>, еще находится в стадии доработки, пока что имеются недочеты. Используйте его с осторожностью.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/03/28/minion-module/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/03/28/minion-module/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/03/28/minion-module/&t=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/03/28/minion-module/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/03/28/minion-module/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/03/28/minion-module/&u_data[name]=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/03/28/minion-module/&title=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/03/28/minion-module/&bm_description=%5BKo3.3%5D+%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C+Minion+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/03/28/minion-module/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Встречайте &#8211; Kohana 3.3.0RC1</title>
		<link>http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/</link>
		<comments>http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 06:52:32 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[kohana 3.3]]></category>
		<category><![CDATA[релизы]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=675</guid>
		<description><![CDATA[Наконец-то появились изменения в списке релизов Kohana. На растерзание изголодавшимся разработчикам выдали первый Release Candidate ветки 3.3. Изменений слишком много, чтобы их все привести разом, поэтому буду потихоньку публиковать статьи по отдельным модулям.
Отмечу, что переход с 3.2 легким не будет. Активно обсуждаемое внедрение стандарта PSR-0 привело к необходимости использовать заглавные буквы в названиях файлов и [...]]]></description>
			<content:encoded><![CDATA[<p>Наконец-то появились изменения в списке релизов <strong>Kohana</strong>. На растерзание изголодавшимся разработчикам выдали первый <em>Release Candidate</em> ветки <strong>3.3</strong>. Изменений слишком много, чтобы их все привести разом, поэтому буду потихоньку публиковать статьи по отдельным модулям.</p>
<p>Отмечу, что переход с <strong>3.2</strong> легким не будет. <a href="http://forum.kohanaframework.org/discussion/10517/how-is-psr-0-support-for-kohana-3-3-going">Активно обсуждаемое</a> внедрение стандарта <strong>PSR-0</strong> привело к необходимости использовать заглавные буквы в названиях файлов и директорий, а также в именах файлов (сам PHP в общем-то не различает имена классов <code>Foo</code> и <code>foo</code>).</p>
<p>Полезные ссылки:</p>
<ul>
<li><a href="http://forum.kohanaframework.org/discussion/10579/kohana-3-3-0-rc1-released">Новость на форуме</a></li>
<li><a href="https://github.com/kohana/kohana/tree/v3.3.0-RC1">Страница RC1 на github</a></li>
<li><a href="http://dev.kohanaframework.org/projects/kohana3/issues?c[]=project&#038;c[]=tracker&#038;c[]=status&#038;c[]=priority&#038;c[]=subject&#038;c[]=assigned_to&#038;c[]=updated_on&#038;c[]=fixed_version&#038;c[]=cf_14&#038;f[]=status_id&#038;f[]=fixed_version_id&#038;f[]=cf_2&#038;f[]=&#038;group_by=project&#038;op[cf_2]=%3D&#038;op[fixed_version_id]=%3D&#038;op[status_id]=c&#038;per_page=50&#038;set_filter=1&#038;v[cf_2][]=fixed&#038;v[fixed_version_id][]=204&#038;v[status_id][]=1">Закрытые тикеты</a></li>
<li><a href="http://dev.kohanaframework.org/projects/kohana3/issues?query_id=55">Незакрытые тикеты</a></li>
</ul>
<p>Скачать дистрибутив с официальной страницы загрузок пока нельзя. Скачайте zip-архив со страницы на <strong>github</strong>&#8216;е (кнопка <strong>ZIP</strong> в верхнем левом углу), либо используйте команды <strong>Git</strong>:</p>
<p><code>git clone http://github.com/kohana/kohana.git kohana-v3.3.0-RC1<br />
cd kohana-3.3.0-RC1<br />
git checkout v3.3.0-RC1<br />
git submodule update --init</code></p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&t=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&u_data[name]=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&title=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/&bm_description=%D0%92%D1%81%D1%82%D1%80%D0%B5%D1%87%D0%B0%D0%B9%D1%82%D0%B5+-+Kohana+3.3.0RC1+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/03/27/kohana-3-3-0rc1/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>[ссылка] Userguide v3.2 одним файлом</title>
		<link>http://brotkin.ru/2012/02/26/userguide-v32-one-fil/</link>
		<comments>http://brotkin.ru/2012/02/26/userguide-v32-one-fil/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 17:47:25 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[kohana 3.2]]></category>
		<category><![CDATA[userguide]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=672</guid>
		<description><![CDATA[Разработчик Xavi Esteve любезно предоставил возможность скачать оффлайн-версию гайда для Kohana v3.2 в различных форматах (PDF, ePub, HTML).

                
]]></description>
			<content:encoded><![CDATA[<p>Разработчик <strong>Xavi Esteve</strong> любезно предоставил возможность <a href="http://xaviesteve.com/2965/kohana-3-2-documentation-all-in-one-pdf-epub-and-html-formats/">скачать</a> оффлайн-версию гайда для <strong>Kohana v3.2</strong> в различных форматах (PDF, ePub, HTML).</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&t=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&u_data[name]=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&title=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/02/26/userguide-v32-one-fil/&bm_description=%5B%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%5D+Userguide+v3.2+%D0%BE%D0%B4%D0%BD%D0%B8%D0%BC+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%BC+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/02/26/userguide-v32-one-fil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kohana 101</title>
		<link>http://brotkin.ru/2012/01/11/kohana101/</link>
		<comments>http://brotkin.ru/2012/01/11/kohana101/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 21:25:58 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[cправочник]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[userguide]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=667</guid>
		<description><![CDATA[Как и обещал, начал работу над собственным вариантом русскоязычной документации для Kohana v3.2 (пока что последняя актуальная версия). На данный момент сделано не шибко много, но базовая информация (или ее зачатки) практически разложена по полочкам, в голове сложилась примерная структура проекта.
1. Проект на Github
2. Онлайн-версия.
Напомню, что это НЕ перевод документации, а попытка систематизировать имеющиеся знания [...]]]></description>
			<content:encoded><![CDATA[<p>Как и <a href="http://brotkin.ru/2011/11/26/tutorial-format/">обещал</a>, начал работу над собственным вариантом русскоязычной документации для Kohana v3.2 (пока что последняя актуальная версия). На данный момент сделано не шибко много, но базовая информация (или ее зачатки) практически разложена по полочкам, в голове сложилась примерная структура проекта.</p>
<p>1. <a href="https://github.com/biakaveron/kohana101-ru">Проект на Github</a><br />
2. <a href="http://101.brotkin.ru/guide/kohana101">Онлайн-версия</a>.</p>
<p>Напомню, что это <strong>НЕ</strong> перевод документации, а попытка систематизировать имеющиеся знания о внутренностях фреймворка в несколько вольной форме (хочется избежать сухого языка типичных гайдов). Помимо ядра хочется описать как минимум основные модули (Database, ORM, Auth, Cache).</p>
<p>Если у кого-то есть желание помочь с написанием каких-то глав (хотя бы в виде наброска-черновика), пишите в <a href="https://github.com/biakaveron/kohana101-ru/issues">тикеты</a> на гитхабе, так будет проще координироваться. Кроме того, приветствуются замечания и пожелания, будь то по структуре или по содержанию. И помните, что это еще пока черновик черновика <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2012/01/11/kohana101/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2012/01/11/kohana101/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2012/01/11/kohana101/&t=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2012/01/11/kohana101/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2012/01/11/kohana101/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2012/01/11/kohana101/&u_data[name]=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2012/01/11/kohana101/&title=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2012/01/11/kohana101/&bm_description=Kohana+101+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2012/01/11/kohana101/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>И люди за это платят деньги&#8230;</title>
		<link>http://brotkin.ru/2011/12/30/kohan-video-sucks/</link>
		<comments>http://brotkin.ru/2011/12/30/kohan-video-sucks/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 20:41:22 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=661</guid>
		<description><![CDATA[Наконец-то нашел время, чтобы поглядеть видеокурс &#8220;Kohana Framework от А до Я&#8221; (название рулит, ага). Интересно, сколько человек повелись на сомнительную честь глядеть за дрожащим курсором в чужой IDE, перенабирать чужой код и гадать, что будет если сделать шаг в сторону. Особенно порадовали показанные опечатки в коде. Естественно, клиенту интересно смотреть, как автор будет их [...]]]></description>
			<content:encoded><![CDATA[<p>Наконец-то нашел время, чтобы поглядеть видеокурс &#8220;<a href="http://brotkin.ru/2011/06/22/ko31-video-lol/">Kohana Framework от А до Я</a>&#8221; (название рулит, ага). Интересно, сколько человек повелись на сомнительную честь глядеть за дрожащим курсором в чужой IDE, перенабирать чужой код и гадать, что будет если сделать шаг в сторону. Особенно порадовали показанные опечатки в коде. Естественно, клиенту интересно смотреть, как автор будет их исправлять.</p>
<p>Возможно, среди моих читателей есть кто-то из участников того самого проведенного обучения? Отпишитесь в комментариях о своих впечатлениях. Будет любопытно.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2011/12/30/kohan-video-sucks/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2011/12/30/kohan-video-sucks/&t=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2011/12/30/kohan-video-sucks/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2011/12/30/kohan-video-sucks/&u_data[name]=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&title=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2011/12/30/kohan-video-sucks/&bm_description=%D0%98+%D0%BB%D1%8E%D0%B4%D0%B8+%D0%B7%D0%B0+%D1%8D%D1%82%D0%BE+%D0%BF%D0%BB%D0%B0%D1%82%D1%8F%D1%82+%D0%B4%D0%B5%D0%BD%D1%8C%D0%B3%D0%B8...+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2011/12/30/kohan-video-sucks/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>[опрос] Какой формат мини-учебника был бы удобнее?</title>
		<link>http://brotkin.ru/2011/11/26/tutorial-format/</link>
		<comments>http://brotkin.ru/2011/11/26/tutorial-format/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 19:27:53 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[учебник]]></category>
		<category><![CDATA[Kohana]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=654</guid>
		<description><![CDATA[Если вкратце, то у меня есть мысли (и даже желание) составить мини-учебник для начинающих, что-то вроде Kohana 101 (был такой PDF-файл для Kohana 2.3, если помните). Пока что не особо принципиально, в чем его писать. Есть некоторые аргументы в пользу одной или другой версии:
1. Поддержание в актуальном состоянии. Естественно, в случае с PDF это сложнее.
2. [...]]]></description>
			<content:encoded><![CDATA[Примечание: к этой записи прикреплён опрос. Чтобы принять в нем участие, зайдите на сайт.
<p>Если вкратце, то у меня есть мысли (и даже желание) составить мини-учебник для начинающих, что-то вроде Kohana 101 (был такой PDF-файл для Kohana 2.3, если помните). Пока что не особо принципиально, в чем его писать. Есть некоторые аргументы в пользу одной или другой версии:</p>
<p>1. Поддержание в актуальном состоянии. Естественно, в случае с PDF это сложнее.<br />
2. Обратная связь с пользователями. Статьи в блоге можно комментировать, это плюс.<br />
3. Версионность. Документацию на текстовых файлах можно выложить на Github и собирать поправки от других пользователей.<br />
4. Удобство пользованием. Что ни говори, а PDF-файл можно распечатать, его удобно читать с различных ридеров и т.д. В блоге больше лишних (отвлекающих) элементов.</p>
<p>Продолжать можно долго. А что думаете вы? Помимо формата, принимаются предложения по содержанию учебника.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2011/11/26/tutorial-format/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2011/11/26/tutorial-format/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2011/11/26/tutorial-format/&t=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2011/11/26/tutorial-format/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2011/11/26/tutorial-format/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2011/11/26/tutorial-format/&u_data[name]=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2011/11/26/tutorial-format/&title=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2011/11/26/tutorial-format/&bm_description=%5B%D0%BE%D0%BF%D1%80%D0%BE%D1%81%5D+%D0%9A%D0%B0%D0%BA%D0%BE%D0%B9+%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82+%D0%BC%D0%B8%D0%BD%D0%B8-%D1%83%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%D0%B0+%D0%B1%D1%8B%D0%BB+%D0%B1%D1%8B+%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D0%B5%D0%B5%3F+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2011/11/26/tutorial-format/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

