<?xml version="1.0" encoding="windows-1251"?><?xml-stylesheet href="http://fit-media.com//css/rss.css" type="text/css" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>FIT-Media Blog</title>
 <link>http://fit-media.com/</link>
 <description>FIT-Media Blogging Engine</description>
 <language>ru</language>
 <image>
  <url>http://fit-media.com/i/fitmediablog.png</url>
  <title>FIT-Media Blog</title>
  <link>http://fit-media.com/</link>
 </image>


<item>
<title>Yii - перехват запросов</title>
<link>http://fit-media.com/post_1313836666.html</link>
<description>&lt;p&gt;Все фреймворки, с которыми мне приходилось работать, при всей своей гибкости, все же слегка &amp;laquo;деревянные&amp;raquo;. Например, ни один из них не позволяет динамически менять конфигурацию приложения, без редактирования конфигурационных файлов. Это создает определенные проблемы, если вы хотите, чтобы ваше приложение было по-настоящему модульным.&lt;/p&gt;

&lt;p&gt;Представим, что вы хотите создать CMS, которая будет иметь кучу модулей, созданных сторонними разработчиками. И каждый пользователь вашей CMS должен иметь возможность сам решать, какие именно модули ему устанавливать. При этом установка/удаление модуля должны происходит по принципу &amp;laquo;одного клика&amp;raquo;, т.е. пользователь должен лишь выбрать нужный модуль и нажать кнопку &amp;laquo;Установить&amp;raquo; (или &amp;laquo;Удалить&amp;raquo;), всю остальную работу, включая изменение настроек, система должна сделать сама.&lt;/p&gt;

&lt;p&gt;Вот тут и начинаются проблемы. Скопировать (скачать) файлы модуля в определенную папку сервера не представляет труда, но как обновить &amp;laquo;hard-coded&amp;raquo; конфигурацию? Писать парсер php-файлов ради добавления пары строк в конфиг - далеко не самое умное решение. Гораздо лучше (и удобнее) работать с конфигурацией, находящейся в каком-нибудь хранилище (например в БД) и считывать ее при запуске приложения. Осталось только придумать как успеть загрузить настройки ДО начала работы приложения (обработки запроса)...&lt;/p&gt;

&lt;p&gt;Описанная выше ситуация &amp;mdash; это только один из случаев, когда приложение должно по каким-то причинам &amp;laquo;перехватить управление&amp;raquo; до начала обработки запроса самим фреймворком. Другая частая необходимость в таком поведении &amp;mdash; проверка прав доступа. К примеру некоторые из установленных модулей сейчас отключены и хорошо бы чтобы фреймворк об этом узнал и соответственно отреагировал.&lt;/p&gt;

&lt;p&gt;Предлагаемое ниже решение прекрасно работает в Yii и позволяет одним махом &amp;laquo;закрыть&amp;raquo; все подобные вопросы.&lt;/p&gt;

&lt;p&gt;Yii имеет механизм временной блокировки сайта. Суть его сводится к следующему: &lt;em&gt;в настройках можно указать маршрут (контроллер/действие), который будет вызываться при любом обращении к сайту&lt;/em&gt;. В самом действии обычно прописан код вывода сообщения типа &amp;laquo;На сайте ведутся технические работы. Зайдите позже&amp;raquo;.&lt;/p&gt;

&lt;p&gt;Как оказалось, этот механизм прекрасно подходит для решения вышеописанных задач, нужно лишь добавить пару строк, чтобы заставить фреймворк продолжить обработку запроса, когда все настройки и проверки уже выполнены. Таким образом мы получим систему, в которой перед обработкой любого запроса будет вызываться созданное нами действие (метод класса контроллера).&lt;/p&gt;

&lt;h3&gt;Перейдем к практической реализации.&lt;/h3&gt;

&lt;p&gt;Код до смешного прост. Создадим контроллер и обзовем его Privratnik:&lt;/p&gt;

&lt;div class=&quot;codeblock&quot;&gt;

&lt;div class=&quot;codehdr&quot;&gt;Пример контроллера&lt;/div&gt;

&lt;div class=&quot;codetext&quot;&gt;

&lt;pre&gt;

   class PrivratnikController extends Controller

   {

      public function actionIndex()&lt;br /&gt;

      {

        // здесь будем добавлять код

   

        // возвращаем управление фреймворку

        $_app = Yii::app();

        $route = $_app-&gt;getUrlManager()-&gt;parseUrl($_app-&gt;getRequest());

        $_app-&gt;runController($route);

      }

   }&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Сохраним текст класса в файле  &lt;strong&gt;PrivratnikController.php&lt;/strong&gt; в папке &lt;strong&gt;protected/controllers&lt;/strong&gt;. Затем активируем его, установив в конфигурации фреймворка значение параметра catchAllRequest  равным маршруту к нашему контроллеру:&lt;/p&gt;

&lt;div class=&quot;codeblock&quot;&gt;

&lt;div class=&quot;codehdr&quot;&gt;Настройка фреймворка&lt;/div&gt;

&lt;div class=&quot;codetext&quot;&gt;

&lt;pre&gt;

&#039;catchAllRequest&#039; =&gt; array(&#039;privratnik/index&#039;),

&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;Проверив работу сайта можно убедиться, что ничего не изменилось &amp;mdash; все страницы открываются так же как и раньше. Но теперь все вызовы проходят через наш контроллер. Убедиться в этом проще простого: например, измените метод &lt;strong&gt;actionIndex()&lt;/strong&gt; вот так:&lt;/p&gt;

&lt;div class=&quot;codeblock&quot;&gt;

&lt;div class=&quot;codehdr&quot;&gt;Измененный обработчик&lt;/div&gt;

&lt;div class=&quot;codetext&quot;&gt;

&lt;pre&gt;

public function actionIndex()

 {

     echo &#039;&amp;lt;h1&gt;Hello World&amp;lt;/h1&gt;&#039;;

     $_app = Yii::app();

     $route = $_app-&gt;getUrlManager()-&gt;parseUrl($_app-&gt;getRequest());

     $_app-&gt;runController($route);

 }&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p&gt;и вверху каждой страницы вашего сайты вы увидите надпись Hello World&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;http://fit-media.com/fckeditor/editor/images/smiley/ad.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Как применять описанную возможность думайте сами. Например, можно динамически подменять параметры генерации URL&#039;ов страниц и получить возможность указания элиасов страниц. Или можно проверить авторизацию пользователя и, в зависимости от нее, блокировать доступ к некоторым частям сайта. Так же здесь можно вставить анализ запросов для сбора статистики или защиты от DdoS-атак...&lt;/p&gt;

&lt;p&gt;В общем применений масса.&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;a href=http://fit-media.com/comment_1313836666.html&gt;Оставить комментарий&lt;/a&gt;</description>
<pubDate>Sat, 20 Aug 2011 06:37:46 GMT</pubDate>
</item>

  </channel>
</rss>
