<?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-dev.info &#187; Zend Framework</title>
	<atom:link href="http://web-dev.info/category/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://web-dev.info</link>
	<description>Информация о web-разработке для web-разработчиков.</description>
	<lastBuildDate>Tue, 02 Sep 2008 19:55:08 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pre-Post диспетчеризация, авторизация и Zend_Controller_Plugin_ErrorHandler</title>
		<link>http://web-dev.info/2008/05/pre-post-dispatch-auth-error-handling/</link>
		<comments>http://web-dev.info/2008/05/pre-post-dispatch-auth-error-handling/#comments</comments>
		<pubDate>Tue, 13 May 2008 23:34:12 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Zend_Acl]]></category>
		<category><![CDATA[Zend_Controller_Plugin_ErrorHandler]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/05/pre-post-dispatch-auth-error-handling/</guid>
		<description><![CDATA[Хороший подводный камень затаился в механизме работы ZF с плагинами когда вопрос авторизации разрешается именно с их помощью.
Вводная
Общеизвестно, что кроме прочего плагины позволяют выполнять некий код до и после действия (action) контроллера. Именно тут и притаилась логическая бомба размеров чуть меньше среднего.
Обычно авторизация (определение возможности выполнения тех или иных деяний в зависимости от прав) помещается [...]]]></description>
			<content:encoded><![CDATA[<p>Хороший подводный камень затаился в механизме работы ZF с плагинами когда вопрос авторизации разрешается именно с их помощью.</p>
<h3 class="floatBar">Вводная</h3>
<p>Общеизвестно, что кроме прочего плагины позволяют выполнять некий код до и после действия (action) контроллера. Именно тут и притаилась логическая бомба размеров чуть меньше среднего.</p>
<p><a href="http://devzone.zend.com/node/view/id/1665">Обычно</a> авторизация (определение возможности выполнения тех или иных деяний в зависимости от прав) помещается в Pre-обработчик:</p>
<pre name="code" class="php">class Application_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract{
    public function preDispatch(Zend_Controller_Request_Abstract $request){
        /*
        ...
        */
    }
}</pre>
<h6>о выборе:</h6>
<p class="notice">конечно, можно было бы поместить проверку в обработчик dispatchLoopStartup, но если в ходе выполнения запроса будут вызываться несколько контроллеров и действий, то авторизация будет неполной</p>
<p>Код  preDispatch представляет собой проверку возможности выполнения запрашиваемого действия с вынесением вердикта в виде перезаписи значений модуля, контроллера и  действия. В случае когда перезапись нужно произвести как в случае отказа, так и благоприятного исхода и возникает неловкость.</p>
<p>Плагин <span class="phpClass">Zend_Controller_Plugin_ErrorHandler</span>, включенный по-умолчанию, регистрирует Post-обработчик и выполняет аналогичные действия с перезаписью значений модуля, контроллера и действия, но в случае возникновения исключений.</p>
<h6>об исключениях:</h6>
<p class="notice">обычно в задачу этому плагину ставится отлов отсутствия вызываемого контроллера или действия, что можно рассматривать как ошибку №404, в то время как исключения внутри существующих действий как ошибку №500</p>
<h3 class="floatBar">Суть</h3>
<p>Авторизация, в подавляющем большинстве конфигураций, пропустит нас к несуществующему действию. Однако обработчик ошибок чутко перенаправит на контроллер и действие (по-умолчанию error и error соответственно) по обработке ошибки, что в цикле диспетчеризации опять вызовет проверку авторизации. Если забыть прописать правила на доступ к контроллеру и действию обработки ошибок, мы будем повторно брошены на поиски несуществующего со всеми печальными последствиями: плагин ErrorHandler, почуяв мистический вызов себя второй раз, бросит неотлавливаемое уже никем (ясное дело, их отловом он и занимается) исключение и все будет потеряно.</p>
<h6>к слову о перестраховке:</h6>
<p class="notice">можно обернуть в try...catch вызов <span class="code">Zend_Controller_Front::getInstance () -&gt;dispatch ()</span> чтобы ловить неотлавливаемое и там</p>
<h3 class="floatBar">Вывод и возможные решения</h3>
<p>Необходимо предотвратить натаптывание дорожки с граблями т.е. не давать коду авторизации перезаписывать значения модуля, контроллера и действия, если они ведут в место, где производится обработка ошибок.</p>
<p>Сделать это можно как прописыванием правил <span class="phpClass">Zend_Acl</span> для обработчика ошибок, так и проверкой на существование исключений за обработкой которого мы и обратились к некому контроллеру:</p>
<pre name="code" class="php">public function preDispatch(Zend_Controller_Request_Abstract $request){
    if ($this-&gt;_response-&gt;isException()) return;
    /*
    ...
    */
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/05/pre-post-dispatch-auth-error-handling/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Zend Framework: фильтры и mbstring в версии 1.5</title>
		<link>http://web-dev.info/2008/04/zf-filters-mbstring/</link>
		<comments>http://web-dev.info/2008/04/zf-filters-mbstring/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 12:46:07 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[mbstring]]></category>
		<category><![CDATA[Zend_Filter]]></category>
		<category><![CDATA[Zend_Filter_Alnum]]></category>
		<category><![CDATA[ZF]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/04/zf-filers-mbstring/</guid>
		<description><![CDATA[С выходом ZF 1.5.0 фильтры Zend_Filter_Alnum и Zend_Filter_Alpha могут перестать корректно работать, если вы используете в своих проектах utf-8 и включенный модуль mbstring. Ошибка проявляет себя при фильтрации строк в которых содержатся русские (а возможно, что и все не входящие в английский алфавит) символы:
$filter = new Zend_Filter_Alnum(true);
Zend_Debug::dump($filter->filter('это странненько - mbstring enabled'));
//string(19) "   mbstring [...]]]></description>
			<content:encoded><![CDATA[<p>С выходом ZF 1.5.0 фильтры Zend_Filter_Alnum и Zend_Filter_Alpha могут перестать корректно работать, если вы используете в своих проектах utf-8 и включенный модуль mbstring. Ошибка проявляет себя при фильтрации строк в которых содержатся русские (а возможно, что и все не входящие в английский алфавит) символы:</p>
<pre name="code" class="php">$filter = new Zend_Filter_Alnum(true);
Zend_Debug::dump($filter->filter('это странненько - mbstring enabled'));
//string(19) "   mbstring enabled"</pre>
<pre name="code" class="php">$filter = new Zend_Filter_Alnum(true);
Zend_Debug::dump($filter->filter('это странненько - mbstring disabled'));
//string(48) "это странненько  mbstring disabled"</pre>
<p>Данное поведение очень тесно перекликается с ошибочной фильтрацией умляутов, о которой было <a href="http://framework.zend.com/issues/browse/ZF-2929">заявлено</a> порядка месяца назад.</p>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/04/zf-filters-mbstring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zend Framework: дерево вложенных множеств</title>
		<link>http://web-dev.info/2008/03/zf-nestedset/</link>
		<comments>http://web-dev.info/2008/03/zf-nestedset/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 05:45:03 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[nestedset]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[вложенные множества]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/03/zf-nestedset/</guid>
		<description><![CDATA[Хранение деревьев в базе — вопрос если не самый популярный, то частовозникающий.
В свое время на phpclub.ru была опубликована статья с неплохим описанием модели, структурой таблиц и примерами. Также Максимом Матюхиным был приведен класс для работы с этой моделью. После возникшей потребности этот класс был переписан под Zend Framework. При «портировании» я просто заставил код немного [...]]]></description>
			<content:encoded><![CDATA[<p>Хранение деревьев в базе — вопрос если не самый популярный, то частовозникающий.</p>
<p><!-- footnote1-->В свое время на phpclub.ru была опубликована <a href="http://phpclub.ru/detail/article/db_tree">статья</a> с неплохим описанием модели, структурой таблиц и примерами. Также Максимом Матюхиным был приведен класс для работы с этой моделью.<!-- /footnote1--> После возникшей потребности этот класс был переписан под Zend Framework. При «портировании» я просто заставил код немного по другому звучать и добавил некоторую функциональность из <a href="http://pear.php.net/package-info.php?pacid=187">PEAR::DB_NestedSet</a>.</p>
<p>Для работы с любыми классами производными от <acronym title="Zend Framework">ZF</acronym>-классов обычно рядом с директорией Zend, содержащей фреймворк,  создается директория <span class="filePath">Application</span> с аналогичной <acronym title="Zend Framework">ZF</acronym> иерархией — в этом случае Zend_Loader сможет подгрузить их в обычном порядке. Этим и обусловлено название класса — Application_Db_Table_Nestedset.</p>
<p>Код документирован и не является чем-то новым поэтому развернутый мануал по использованию приводить бессмыслено.</p>
<p>Доступ через <a class="svn" href="http://svn.web-dev.info/repos/ZF/trunk/Application/">хранилище</a> или <a class="tar" href="/websvn/listing.php?path=%2FZF%2Ftrunk%2FApplication%2FDb%2FTable%2F#_ZF_trunk_Application_Db_Table_">архивом</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/03/zf-nestedset/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
