<?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>hudson@work &#187; symfony deploy checklist</title>
	<atom:link href="http://hudson.su/tag/symfony-deploy-checklist/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Чеклист: готов ли ваш symfony проект к развертыванию (часть 3)</title>
		<link>http://hudson.su/2010/02/14/check-your-symfony-application-is-ready-for-deployment-p3/</link>
		<comments>http://hudson.su/2010/02/14/check-your-symfony-application-is-ready-for-deployment-p3/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 19:29:46 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony deploy checklist]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=930</guid>
		<description><![CDATA[По мотивам Check if your symfony application is ready for deployment Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Часть 3-я. Удалите .htaccess, везде где это возможно Файлы .htaccess как правило очень удобны &#8211; гибкие, работают везде, изменения можно протестировать тут же. Но обратная сторона медали в том, что правила [...]]]></description>
			<content:encoded><![CDATA[<p>По мотивам <a href="http://www.symfony-check.org/" target="_blank">Check if your symfony application is ready for deployment</a></p>
<p>Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Часть 3-я.</p>
<p><span id="more-930"></span></p>
<h2>Удалите .htaccess, везде где это возможно</h2>
<p>Файлы .htaccess как правило очень удобны &#8211; гибкие, работают везде, изменения можно протестировать тут же. Но обратная сторона медали в том, что правила из .htaccess не могут быть закешированы на уровне apache, сервер вынужден сканировать файловую систему проекта (docroot) для каждогозапроса.</p>
<p>Если вы переместите правила из .htaccess в конфигурацию виртуального хоста в httpd.conf (или подлинкованном к нему файле с виртуальными хостами), эти правила будут кэшироваться apache, что увеличит производительность.</p>
<p>К сожалению, не всегда имеется доступ к конфигурации apache. В частности, на виртуальном shared-хостинге, вот почему symfony по умолчанию использует .htaccess файл по-умолчанию.</p>
<p><strong>Так что, извините, этот совет можно применить только на dedicated сервере (VPS/VDS тоже в доле).</strong></p>
<h3>Итак, откройте ваш конфиг с виртуальными хостами:</h3>
<p>Часто, конфигурации виртуальных хостов помещают в конце httpd.conf (или делают Include отдельного файла, например vhosts.conf или conf.d/vhosts.conf).</p>
<p>Ваш виртуальный хост может выглядеть примерно так:</p>
<pre>&lt;VirtualHost *:80&gt;
  ServerName my-symfony-project.com
  DirectoryIndex index.php
  DocumentRoot "/path-to-your-sf-project/web"
  &lt;Directory "/path-to-your-sf-project/web"&gt;
    AllowOverride All
    Allow from All
  &lt;/Directory&gt;
  Alias /sf /path-to-your-sf-project/lib/vendor/symfony/data/web/sf/
  &lt;Directory "/path-to-your-sf-project/lib/vendor/symfony/data/web/sf/"&gt;
    AllowOverride All
    Allow from All
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<p>Вам нужно добавить ваши правила в секцию &lt;Directory &#8220;/path-to-your-sf-project/web&#8221;&gt;</p>
<pre>&lt;Directory "/path-to-your-sf-project/web"&gt;
  AllowOverride None
  Allow from All
  Options FollowSymLinks ExecCGI

  RewriteEngine On

  # uncomment the following line, if you are having trouble
  # getting no_script_name to work
  #RewriteBase /

  # we skip all files with .something
  #RewriteCond %{REQUEST_URI} ..+$
  #RewriteCond %{REQUEST_URI} !.html$
  #RewriteRule .* - [L]

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ index.php [QSA,L]
&lt;/Directory&gt;
</pre>
<p>Сохраните конфиг и удалите ваш .htaccess файл &#8211; если вы не модифицировали этот файл под ваши нужны, он теперь не нужен.</p>
<h3>Тестирование изменений и рестарт apache</h3>
<p>Apache имеет встроенный инструмент тестирования конфигурации на предмет синтаксических ошибок: configtest.</p>
<p>На большинстве linux-серверов вы можете запустить утилиту управления apache следующим образом:</p>
<pre>/etc/init.d/apachectl configtest
или
/etc/init.d/httpd configtest
</pre>
<h3>Документируйте!</h3>
<p>Ваш проект должен иметь как минимум один README файл, где вы можете описать особенности настройки проекта и вебсервера.</p>
<p>Этот совет был предложен Jérôme Macias тут <a href="http://forum.symfony-project.org/index.php/m/81968/#msg_81968">http://forum.symfony-project.org/index.php/m/81968/#msg_81968</a></p>
<h2>Логгирование ошибок</h2>
<p>Логгирование ошибок &#8211; это точнейший инструмент, который позволит вам понять, что и где пошло не так на продуктовом сервере.</p>
<p>В <code>apps/frontend/config/settings.yml</code> активируйте опцию:</p>
<pre>prod:
  .settings:
    logging_enabled:    true
</pre>
<p>Потом, в <code>apps/frontend/config/factories.yml</code> внесите следующий изменения:</p>
<pre>prod:
  logger:
    class: sfAggregateLogger
    param:
      level: err
      loggers:
        sf_file_debug:
          class: sfFileLogger
          param:
            level: err
            file: %SF_LOG_DIR%/%SF_APP%_%SF_ENVIRONMENT%.log
</pre>
<p>И очистите кэш:</p>
<pre>php symfony cc
</pre>
<p>Не забудьте настроить cron-job для логгирования логов (можете посмотреть в сторону <a href="http://www.opennet.ru/base/sys/logrotate_howto.txt.html" target="_blank">logrotate</a>). Документация по логгированию: <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/22#chapter_22_sub_logging" target="_blank">http://www.symfony-project.org/jobeet/1_4/Doctrine/en/22#chapter_22_sub_logging</a>.</p>
<h2>Правка deployment списков</h2>
<p><strong>Скрипты для тестового окружения в продуктовую среду попасть не должны</strong>!</p>
<p>Для того чтобы на продуктовый сервер попали только продуктовые скрипты, symfony предоставляется два инструмента для этого:</p>
<ul>
<li>команду <code>php symfony project:clear-controllers</code></li>
<li>файл <code>myproject/config/rsync_exclude.txt</code></li>
</ul>
<p>rsync_exclude.txt по-умолчанию фильтрует скрипты, относящиеся к dev-окружению. Но вы также можете добавить свои исключения:</p>
<pre>/web/*_cache.php
/web/*_test.php
</pre>
<p>Также можете добавить такие некритичные файлы:</p>
<pre>Thumbs.db
.DS_Store
</pre>
<h3>Не забудьте также защитить продуктовую БД</h3>
<p>Вы также можете добавить следующие файлы в rsync_exclude.txt:</p>
<pre>/config/databases.yml
/data/sql/schema.sql
</pre>
<h2>Escaping для шаблонов</h2>
<p><strong>Бесполезно для проектов на symfony 1.3/1.4</strong></p>
<p>По-умолчанию, output escaping отключен. В файле <code>/apps/frontend/config/settings.yml</code> добавьте:</p>
<pre>all:
  .settings:
    # Output escaping settings
    escaping_strategy:      true
    escaping_method:        ESC_SPECIALCHARS
</pre>
<h2>Защита форм</h2>
<p><strong>Бесполезно для проектов на symfony 1.3/1.4</strong></p>
<p>symfony имеет возможность защищать каждую форму в приложении от <a href="http://en.wikipedia.org/wiki/CSRF" target="_blank">CSRF атак</a>. Для того чтобы подключить эту возможность, вы должны указать csrf ключ в <code>apps/frontend/config/settings.yml</code></p>
<pre>all:
  .settings:
    csrf_secret:       chooseYouOwnSecretKey
</pre>
<p>Эта функция будет внедрять в каждую форму токен, уникальный для каждого пользователя и каждой формы. Но будьте осторожны, формы с протекцией больше нельзя кэшировать.</p>
<h2>Отображайте сообщение &#8220;Сайт недоступен&#8221; на время работ</h2>
<p>Чем больше ваш сайт, тем медленне работают некоторые таски symfony. В некоторых случаях, эти операции могут значительно замедлить ваше приложение и помешать нормально работе пользователей.</p>
<p>Отображать некую страницу, которая будет предупреждать пользователя о ведущихся на сайте работах, это наилучший выход в данной ситуации.</p>
<p>Для того чтобы настроить перенаправление пользователей на страницу unavailable.php, в то время когда вы выполняете так типа <code>php symfony cc</code>, внесите изменения в <code>apps/frontend/config/settings.yml:</code></p>
<pre>all:
  .settings:
    check_lock:    true
</pre>
<h2>Оптимизация маршрутизации</h2>
<p>Система маршрутизации symfony &#8211; это одна из убийственных фич этого каркаса.</p>
<pre>&lt;p&gt;Please have a look on &lt;php echo link_to('our products', 'product/index') ?&gt;.&lt;/p&gt;</pre>
<p>Укажите в вашем шаблоне, какие модуль/действие вам нужны и предоставьте маршрутизатору сделать все остальное.<br />
Вы можете использовать правило по-умолчанию:</p>
<pre>default:
  url:   /:module/:action/*
</pre>
<p>Или добавить свое собственное</p>
<pre>product_list:
  url:     /our-products
  param:   { module: product, action: index }
</pre>
<p>Очистите кэш и все соответствующие ссылки и URI будут изменены.</p>
<h3>Выглядит как магия, но маршрутизация имеет свою цену.</h3>
<p>Каждый раз, когда при обработке запроса в шаблоне встречается product/index, symfony сканирует все правила, определенные в routing.yml и определяет, какое из них будет обрабатывать запрос: правило по умолчанию? или какое-то другое?</p>
<p>Этот процесс повторяется для каждой ссылки&#8230;</p>
<p>Если у вас много страниц и много правил маршрутизации, вы можете увеличить производительность вашего приложения, используя метки маршрутов, вместо пары module/action:</p>
<pre>&lt;p&gt;Please have a look on &lt;php echo link_to('our products', '@product_list') ?&gt;.&lt;/p&gt;</pre>
<p>Это решение позволит ускорить процесс маршрутизации, но сделает представление ссылок в коде менее читабельным.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/02/14/check-your-symfony-application-is-ready-for-deployment-p3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чеклист: готов ли ваш symfony проект к развертыванию (часть 2)</title>
		<link>http://hudson.su/2010/02/04/check-your-symfony-application-is-ready-for-deployment-p2/</link>
		<comments>http://hudson.su/2010/02/04/check-your-symfony-application-is-ready-for-deployment-p2/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 12:32:30 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony deploy checklist]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=814</guid>
		<description><![CDATA[По мотивам Check if your symfony application is ready for deployment Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Часть 2-я. Favicon Браузеры запрашивают favicon.ico файл, когда юзер в первый раз посещает страницу и впоследствии использует его для отображения в адресной строке и в меню закладок. Этот файлик не только [...]]]></description>
			<content:encoded><![CDATA[<p>По мотивам <a href="http://www.symfony-check.org/" target="_blank">Check if your symfony application is ready for deployment</a></p>
<p>Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Часть 2-я.</p>
<h2><span id="more-814"></span>Favicon</h2>
<p>Браузеры запрашивают favicon.ico файл, когда юзер в первый раз посещает страницу и впоследствии использует его для отображения в адресной строке и в меню закладок. Этот файлик не только делает внешний вид вашего сайта целостным, но и позволяет визуально отделять его от других сайтов в закладках, добавляет уникальности.</p>
<p>Вот несколько полезных ссылок для создания иконок:</p>
<ul>
<li><a href="http://www.symfony-check.org/images/favicon.ico">Пустой favicon</a></li>
<li><a href="http://www.favicon.cc/">Генератор favicon</a></li>
<li><a href="http://tools.dynamicdrive.com/favicon/">Еще один генератор</a></li>
</ul>
<h2>Имена кукисов</h2>
<p>Механизм сессий использует куки на стороне клиента и эти куки по умолчанию именуются <strong>symfony</strong>. В <code>apps/frontend/config/factories.yml</code> добавьте следующие строки для всех окружений:</p>
<pre>storage:
  class: sfSessionStorage
  param:
    session_name: my_project
</pre>
<p>Если у вас используется <strong>sf[Doctrine]GuardPlugin</strong>, вы можете изменить имя куки &#8220;Remember me&#8221; в <code>myProject/config/app.yml</code></p>
<pre>all:
  sf_guard_plugin:
    remember_cookie_name:   myProjectRememberMe
</pre>
<h2>Проверка продакшн сервера</h2>
<p>Для проверки того, корректно ли настроен сервер для symfony-проекта, ребята из <strong>Sensio </strong>написали тестовый скрипт. Загрузить его можно здесь: <a href="http://svn.symfony-project.com/branches/1.4/data/bin/check_configuration.php" target="_blank">http://svn.symfony-project.com/branches/1.4/data/bin/check_configuration.php</a>. Поместите его в web-директорию (зачем именно туда непонятно, так как тестируются общие настройки). Выполните скрипт:</p>
<pre>$ php check_configuration.php

********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: Z:usrlocalphp5php.ini

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  (especially on the Windows platform)
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        PHP version is at least 5.2.4 (5.2.4)

** Optional checks **

  OK        PDO is installed
  OK        PDO has some drivers installed: mysql
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
  OK        A PHP accelerator is installed
[[WARNING]] php.ini has short_open_tag set to off: FAILED
            *** Set it to off in php.ini ***
[[WARNING]] php.ini has magic_quotes_gpc set to off: FAILED
            *** Set it to off in php.ini ***
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9
</pre>
<p>Соответствующую документацию можно почитать тут: <a href="http://www.symfony-project.org/getting-started/1_4/en/02-Prerequisites" target="_blank">http://www.symfony-project.org/getting-started/1_4/en/02-Prerequisites</a>.</p>
<h2>Языковые настройки</h2>
<p>По умолчанию, symfony помещает <code>lang=en</code> на каждую страницу вашего проекта. Если ваше приложение работает с другими языками, отредактируйте <code>apps/frontend/templates/layout.php</code> следующим образом:</p>
<pre>&lt;html
  xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="&lt;?php echo $sf_user-&gt;getCulture() ?&gt;"
  lang="&lt;?php echo $sf_user-&gt;getCulture() ?&gt;"
&gt;
</pre>
<h2>Удаляем /backend.php/ из URI</h2>
<p>В файле <code>apps/frontend/config/settings.yml</code> вы можете скрыть отображение имени bootstrap скрипта при помощи опции <code>no_script_name</code>. Эта опция включена для первого сгенерированного рпиложения (как правило frontend) и отключена для последующих.</p>
<h3>Почему?</h3>
<p>Потому что без указания backend.php (ну или грубо говоря имени приложения через скрипт), symfony не может понять, какое из приложений запускать. Обратите внимание на <code>web/index.php</code>:</p>
<pre>&lt;?php

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)-&gt;dispatch();
</pre>
<p>Явно указано приложение (frontend) и окружение (prod). Т.о. мы должны придумать как указать symfony нужное приложение, не используя для этого backend.php явно.</p>
<p>Мы можем, например, использовать разные домены:</p>
<ul>
<li>http://my-app.com для фронтэнда</li>
<li>http://my-app-backend.com для бэкэнда</li>
</ul>
<p>Или, что еще лучше, для бэкэнжа можно использовать поддомен:</p>
<ul>
<li>http://my-app.com для фронтэнда</li>
<li>http://admin.my-app.com для бэкэнда</li>
</ul>
<h3>Если ваш проект размещен на выделенном сервере</h3>
<p>Вам нужно добавить новый виртуальный хост в <code>httpd.conf</code>:</p>
<pre>&lt;VirtualHost *:80&gt;
  ServerName admin.my-app.com
  DirectoryIndex backend.php
  DocumentRoot "/path/to/the/web/directory"
  &lt;Directory "/path/to/the/web/directory"&gt;
    AllowOverride All
    Allow from All
  &lt;/Directory&gt;
  Alias /sf /path/to/the/symfony/data/web/sf
  &lt;Directory "/path/to/the/symfony/data/web/sf"&gt;
    AllowOverride All
    Allow from All
  &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</pre>
<h3>Если ваш проект расположен на виртуальном хостинге</h3>
<p>В этом случае у вас скорее всего нет доступа к <code>http.conf</code> и единственный доступный способ конфигурирования &#8211; это <code>.htaccess</code>. Добавим после строк:</p>
<pre>&lt;IfModule mod_rewrite.c&gt;
  RewriteEngine On
</pre>
<p>Следующие строки:</p>
<pre># The admin subdomain returns to the backend
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^admin.my-app..*
RewriteRule ^(.*)$ backend.php [QSA,L]
</pre>
<h3>И, наконец,</h3>
<p>можно модифицировать <code>settings.yml</code>:</p>
<pre>prod:
  .settings:
    no_script_name:  true
</pre>
<p>И очистить кэш:</p>
<pre>php symfony cc
</pre>
<h2>PHP акселератор</h2>
<p>Для продуктового сервера вам нужна максимальная производительность. Установка акселератора (вики-статья про акселераторы <a href="http://en.wikipedia.org/wiki/PHP_accelerator" target="_blank">http://en.wikipedia.org/wiki/PHP_accelerator</a>) даст хороший прирост производительности при малых затратах. Одним из популярных акселераторов является APC (Advanced PHP Cache &#8211; <a href="http://www.php.net/apc" target="_blank">http://www.php.net/apc</a>).</p>
<h3>Установка на выделенный сервер</h3>
<p>Процесс установки APC на выделенный сервер прост насколько это вообще возможно ))</p>
<pre>pecl install apc</pre>
<h3>Виртуальный хостинг</h3>
<p>Как правило поставить что-то на виртуальном хостинге нельзя. Но в Doctrine ORM вы можете включить встроенный механизм кэширования. Включить кэширование можно добавив следующий метод в <code>mySfProject/config/ProjectConfiguration.class.php</code> (документация: <a href="http://www.doctrine-project.org/documentation/manual/1_2/en/introduction" target="_blank">http://www.doctrine-project.org/documentation/manual/1_2/en/introduction</a>):</p>
<pre>/**
 * Configure the Doctrine engine
 **/
public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager-&gt;setAttribute(Doctrine::ATTR_QUERY_CACHE, new Doctrine_Cache_Apc());
}
</pre>
<p>P.S. Установка eAccelerator для PHP5 под Windows <a href="http://hudson.su/?p=808" target="_blank">http://hudson.su/?p=808</a> (хотя для posix систем принцип тот же, из исходников вы вряд ли его будете собирать, <code>yum install</code> или <code>apt get</code>&#8230;)</p>
<blockquote><p>Оставайтесь с нами, окончание следует ))</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/02/04/check-your-symfony-application-is-ready-for-deployment-p2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Чеклист: готов ли ваш symfony проект к развертыванию (часть 1)</title>
		<link>http://hudson.su/2010/01/29/check-your-symfony-application-is-ready-for-deployment-p1/</link>
		<comments>http://hudson.su/2010/01/29/check-your-symfony-application-is-ready-for-deployment-p1/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 13:12:15 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony deploy checklist]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=785</guid>
		<description><![CDATA[По мотивам Check if your symfony application is ready for deployment Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов. Страница &#8220;Oops! Page Not Found&#8221; Когда запрошенный URL не соответствует ни одному маршруту или когда вызывается sfError404Exception, symfony пытается отобразить действие default/error404: Для того чтобы облагородить эту страницу, добавьте метод executeError404() [...]]]></description>
			<content:encoded><![CDATA[<p>По мотивам <a href="http://www.symfony-check.org/" target="_blank">Check if your symfony application is ready for deployment</a></p>
<p>Небольшой сборник рецептов (или же мини тестов), которые желательно выполнять перед развертыванием symfony-проектов.</p>
<p><span id="more-785"></span></p>
<h2>Страница &#8220;Oops! Page Not Found&#8221;</h2>
<p>Когда запрошенный URL не соответствует ни одному маршруту или когда вызывается sfError404Exception, symfony пытается отобразить действие default/error404:</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/not_found_thumb.png"><img class="alignnone size-full wp-image-786" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/not_found_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Для того чтобы облагородить эту страницу, добавьте метод executeError404() в класс <code>apps/frontend/modules/default/actions/actions.class.php:</code></p>
<pre>/**
 * Error page for page not found (404) error
 *
 */
public function executeError404()
{
}
</pre>
<p>После этого создайте шаблон <code>apps/frontend/modules/default/templates/error404Success.php</code>. Если хотите, можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/controller/default/templates/error404Success.php" target="_blank">оригинальный файл</a> и модифицировать его под ваш дизайн.</p>
<p>Теперь нужно протестировать, как будет выглядеть ваша страничка 404. Возьмите одно из действий проекта, которое работает и добавьте в его начале строку:</p>
<pre>// тестовый эксепшн
throw new sfError404Exception('Only for test, don't forget to remove it!');</pre>
<p>После этого вы можете протестировать соответствующую страницу в продуктовом окружении. Если в вашем приложении модуль <strong>default</strong> защищен &#8211; нужно убедиться, что действие error404 не является защищенным: в файле <code>apps/frontend/modules/default/config/security.yml</code> проверяем (или добавляем) следующие стоки:</p>
<pre>error404:
  is_secure: false
</pre>
<p>Вы также можете использовать другой модуль. Для этого модифицируйте <code>apps/frontend/config/settings.yml</code>:</p>
<pre>all:
  .actions:
    error_404_module: foo   # To be called when a 404 error is raised
    error_404_action: bar   # Or when the requested URL doesn't match any route
</pre>
<p>После этого остается только очистить кэш:</p>
<pre>php symfony cc
</pre>
<h2>Страница &#8220;Oops! An Error Occurred&#8221;</h2>
<p>Эта страница отображается в продуктовом окружении когда symfony перехватывает ошибку.</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/error_thumb.png"><img class="alignnone size-full wp-image-789" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/error_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Symfony ищет файл error.html.php и у вас есть выбор, где его разместить:</p>
<ol>
<li>В <code>mySfProject/apps/frontend/config/error/error.html.php</code>. Имеет смысл в случае, когда у вас планируется отдельная версия для каждого приложения (app).</li>
<li>В <code>mySfProject/config/error/error.html.php.</code></li>
</ol>
<p>Если хотите, вы можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/exception/data/error.html.php" target="_blank">оригинальный файл</a> и изменить его.</p>
<p>Для того чтобы протестировать страницу ошибки в любое действие добавьте строку:</p>
<pre>throw new Exception('Only for test, don't forget to remove it!');</pre>
<p>Протестируйте соответствующую страницу в продуктовом окружении.</p>
<h2>Страница &#8220;Login Required&#8221;</h2>
<p>Когда неаутентифицированный пользователь пытается открыть страницу, которая объявлена как secure в security.yml, symfony пытается отобразить действие default/login:</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/login_required_thumb.png"><img class="alignnone size-full wp-image-790" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/login_required_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Для того чтобы изменить внешний вид этой страницы, добавьте метод executeLogin() в класс <code>apps/frontend/modules/default/actions/actions.class.php:</code></p>
<pre>/**
 * Warning page for restricted area - requires credentials
 */
public function executeLogin()
{
}
</pre>
<p>Затем нужно создать шаблон <code>apps/frontend/modules/default/templates/loginSuccess.php.</code></p>
<p>Если хотите, можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/controller/default/templates/loginSuccess.php" target="_blank">оригинальный файл</a> и модифицировать его.</p>
<p>Для того, чтобы протестировать эту страницу нужно:</p>
<ol>
<li>Перейти в продуктовое окружение</li>
<li>Разлогиниться (используйте линк logout или же, если у вас его нет, удалите все куки для домена с вашим приложением (в firefox можете воспользоваться плагином <a href="https://addons.mozilla.org/en-US/firefox/addon/60" target="_blank">web developer</a>)).</li>
<li>Откройте защищенную страницу.</li>
</ol>
<p>Используем отдельный модуль. Для этого модифицируем <code>apps/frontend/config/settings.yml</code>:</p>
<pre>all:
  .actions:
    login_module: foo   # To be called when a non-authenticated user
    login_action: bar   # Tries to access a secure page
</pre>
<p>Убедитесь, что foo::bar не защищенное действие (мы ведь хотим показывать эту страницу незалогинившимся пользователям!) &#8211; проверьте или добавьте в apps/frontend/modules/foo/config/security.yml следующие строки:</p>
<pre>bar:
  is_secure: false
</pre>
<p>После не забудьте очистить кэш:</p>
<pre>php symfony cc
</pre>
<p>Соответствующая документация для <a href="http://www.symfony-project.org/book/1_2/06-Inside-the-Controller-Layer#chapter_06_action_security" target="_blank">1.2</a>, для <a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/en/13#chapter_13_application_security" target="_blank">1.4 doctrine</a>, <a href="http://www.symfony-project.org/jobeet/1_4/Propel/en/13#chapter_13_application_security" target="_blank">1.4 propel</a>.</p>
<h2>Страница &#8220;Credentials Required&#8221;</h2>
<p>Когда пользователь не имеет необходимых прав доступа (credentials) для действия, symfony пытается отобразить действие default/secure:</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/credentials_required_thumb.png"><img class="alignnone size-full wp-image-792" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/credentials_required_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Для того чтобы настроить внешний вид этой страницы, добавьте метод executeSecure() в <code>apps/frontend/modules/default/actions/actions.class.php:</code></p>
<pre>/**
 * Warning page for restricted area - requires login
 */
public function executeSecure()
{
}
</pre>
<p>и создайте шаблон <code>apps/frontend/modules/default/templates/secureSuccess.php</code>. Если хотите, можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/controller/default/templates/secureSuccess.php" target="_blank">оригинальный файл</a> и модифицировать его.</p>
<p>Теперь нужно протестировать экшен. Для этого нужно:</p>
<ol>
<li>Перейти в продуктовое окружение</li>
<li>Войти в систему, <strong>но не как super admin</strong></li>
<li>Для одного из модулей добавить в <code>apps/frontend/modules/yourModule/config/security.yml:</code></li>
<pre>all:
  credentials: [ aCredentialYouDontHave ]
</pre>
<li>Очистить кэш</li>
<li>Открыть любое из действий данного модуля</li>
</ol>
<p>Если вы хотите использовать другой модуль, модифицируйте <code>apps/frontend/config/settings.yml</code>:</p>
<pre>all:
  .actions:
    secure_module: foo   # To be called when a user doesn't have
    secure_action: bar   # The credentials required for an action
</pre>
<p>И очистите кэш</p>
<pre>php symfony cc</pre>
<h2>Страница &#8220;This Module is Unavailable&#8221;</h2>
<p>Когда пользователь пытается вызвать действие из модуля, который объявлен как disabled, symfony пытается отобразить действие default/disabled:</p>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/module_unavailable_thumb.png"><img class="alignnone size-full wp-image-794" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/module_unavailable_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Для того чтобы настроить внешний вид этой страницы, добавьте метод executeDisabled() в <code>apps/frontend/modules/default/actions/actions.class.php:</code></p>
<pre>/**
 * Module disabled
 *
 */
public function executeDisabled()
{
}</pre>
<p>и создайте шаблон <code>apps/frontend/modules/default/templates/disabledSuccess.php</code>. Если хотите, можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/controller/default/templates/disabledSuccess.php" target="_blank">оригинальный файл</a> и модифицировать его.</p>
<p>Теперь нужно протестировать отключенный модуль. Для этого нужно:</p>
<ol>
<li>Перейти в продуктовое окружение</li>
<li>Для одного из модулей добавить в <code>apps/frontend/modules/yourModule/config/module.yml:</code></li>
<pre>all:
  enabled: false
</pre>
<li>Очистить кэш</li>
<li>Открыть любое из действий данного модуля</li>
</ol>
<p>Если default модуль защищен, убедитесь что действие disabled доступно пользователям &#8211; проверьте или добавьте в <code>apps/frontend/modules/default/config/security.yml</code> следующие строчки:</p>
<pre>disabled:
  is_secure: off
</pre>
<p>Если вы хотите использовать другой модуль, модифицируйте <code>apps/frontend/config/settings.yml</code>:</p>
<pre>all:
all:
  .actions:
    module_disabled_module: foo   # To be called when a user requests
    module_disabled_action: bar     # A module disabled in the module.yml
</pre>
<p>И очистите кэш</p>
<pre>php symfony cc</pre>
<h2>Страница &#8220;Website Temporarily Unavailable&#8221;</h2>
<p>Вебсайт может отображаться как &#8220;недоступный&#8221; если:</p>
<ul>
<li>приложение отключено через таск <code>php symfony project:disable</code></li>
<li>В процессе очистки кэша, если опция check_lock включена в settings.yml.</li>
</ul>
<p>В этих случаях symfony ищет файл <code>unavailable.php</code> и вы можете разместить его в следующих местах:</p>
<ol>
<li>В <code>mySfProject/apps/frontend/config/unavailable.php</code> (имеет смысл, если у вас будут разные версии для разных приложений)</li>
<li>В <code>mySfProject/config/unavailable.php</code></li>
</ol>
<p><a href="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/website_unavailable_thumb.png"><img class="alignnone size-full wp-image-796" src="http://hudson.su/wp-content/blogs.dir/1/files/2010/01/website_unavailable_thumb.png" alt="" width="527" height="60" /></a></p>
<p>Если хотите, вы можете взять <a href="http://svn.symfony-project.com/branches/1.4/lib/exception/data/unavailable.php" target="_blank">оригинальный файл</a> и модифицировать его.</p>
<p>Не забывайте очистить кэш.</p>
<p>Чтобы протестировать эту страницу, нужно отключить фронтэнд и dev окружении:</p>
<pre>php symfony project:disable frontend dev</pre>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/01/29/check-your-symfony-application-is-ready-for-deployment-p1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

