<?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; web разработка</title>
	<atom:link href="http://hudson.su/tag/web-development/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>Хочешь свой фреймворк &#8211; их есть у меня!..</title>
		<link>http://hudson.su/2012/01/05/how-to-create-own-framework-on-top-of-symfony2/</link>
		<comments>http://hudson.su/2012/01/05/how-to-create-own-framework-on-top-of-symfony2/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 07:00:51 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=2189</guid>
		<description><![CDATA[&#8230; Сказал Фабиен Потенсье: А зачем мне это надо &#8211; свой фреймворк? Почему вам может захотеться создать ваш собственный фреймворк? Если вы оглядитесь вокруг &#8211; все будут вам говорить, что не стоит изобретать колесо, что вам лучше выбрать фреймворк из существующих и забыть про создание чего-то своего. И таки да, в основном они все правы, [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; Сказал Фабиен Потенсье:</p>
<blockquote>
<h2>А зачем мне это надо &#8211; свой фреймворк?</h2>
<p>Почему вам может захотеться создать ваш собственный фреймворк? Если вы оглядитесь вокруг &#8211; все будут вам говорить, что не стоит изобретать колесо, что вам лучше выбрать фреймворк из существующих и забыть про создание чего-то своего. И таки да, в основном они все правы, но я хочу вам предложить несколько причин, по котором стоит заняться созданием своего фреймворка. Итак, я хочу создать свой фреймворк чтобы:</p>
<ul>
<li>Изучить низкоуровневую архитектуру современных web-фреймворков в общем и о Symfony2 в частности;</li>
<li>Создать фреймворк для некоторой особенной задачи (просто удостоверьтесь заранее, что ваша задача действительно особенная);</li>
<li>Провести эксперимент для удовольствия (метод учись-и-пробуй);</li>
<li>Провести рефакторинг старого/существующего приложения, которому нужен большой глоток современных практик web-разработки;</li>
<li>Доказать всем, что вы можете самостоятельно создать фреймворк (&#8230; ну может только слегка напрягшись)).</li>
</ul>
</blockquote>
<p><a href="http://symfony-gu.ru/blog/ru/create-your-own-framework-on-top-of-the-symfony2-components-part-1/" target="_blank">Пруф</a></p>
<p><strong>UPDATE1</strong>: <a href="http://fabien.potencier.org/article/51/create-your-own-framework-on-top-of-the-symfony2-components-part-2" target="_blank">вторая часть статьи </a>(работаем с компонентом Symfony2 <strong>HttpFoundation)</strong></p>
<p><strong>UPDATE2</strong>: <a href="http://fabien.potencier.org/article/52/create-your-own-framework-on-top-of-the-symfony2-components-part-3" target="_blank">третья часть статьи </a>(<strong>Request </strong>&amp;<strong> Response </strong>в действии<strong>)</strong></p>
<p><strong>UPDATE3</strong>: <a href="http://fabien.potencier.org/article/53/create-your-own-framework-on-top-of-the-symfony2-components-part-4" target="_blank">четвёртая часть статьи </a>(подключаем<strong> Routing)</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2012/01/05/how-to-create-own-framework-on-top-of-symfony2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Слайдкаст Игоря бондаренко с SQADays&#8217;10: тестирование защищенности веб приложений</title>
		<link>http://hudson.su/2011/12/06/slajdkast-igorya-bondarenko-s-sqadays10-testirovanie-zashhishhennosti-veb-prilozhenij/</link>
		<comments>http://hudson.su/2011/12/06/slajdkast-igorya-bondarenko-s-sqadays10-testirovanie-zashhishhennosti-veb-prilozhenij/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 09:13:46 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sql injection]]></category>
		<category><![CDATA[web разработка]]></category>
		<category><![CDATA[xss]]></category>
		<category><![CDATA[тестирование]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=2153</guid>
		<description><![CDATA[Данный слайдкаст будет прежде всего полезен начинающим (а также более матёрым &#8211; которые ранее не сталкивались с тестированием безопасности) тестировщикам, а также веб-разработчикам начинающего уровня, чтобы понимать как их код будут ломать коллеги из QA, а также злодеи-анонимусы: тестирование защищенности веб приложений View more presentations from Zestranec]]></description>
			<content:encoded><![CDATA[<p>Данный слайдкаст будет прежде всего полезен начинающим (а также более матёрым &#8211; которые ранее не сталкивались с тестированием безопасности) тестировщикам, а также веб-разработчикам начинающего уровня, чтобы понимать как их код будут ломать коллеги из QA, а также злодеи-анонимусы:</p>
<p><span id="more-2153"></span></p>
<div style="width:425px" id="__ss_10477412"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/Zestranec/ss-10477412" title="тестирование защищенности веб приложений" target="_blank">тестирование защищенности веб приложений</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/10477412" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/Zestranec" target="_blank">Zestranec</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/12/06/slajdkast-igorya-bondarenko-s-sqadays10-testirovanie-zashhishhennosti-veb-prilozhenij/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony2 Глоссарий</title>
		<link>http://hudson.su/2011/03/28/symfony2-glossary/</link>
		<comments>http://hudson.su/2011/03/28/symfony2-glossary/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 14:29:49 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1863</guid>
		<description><![CDATA[Для того чтобы эффективно общаться между собой, люди (и программисты не исключение) заранее договариваются о некоторой базовой терминологии, поэтому перевод Symfony2 the Book, я хочу начать с небольшого глоссария, терминологию которого я буду использовать в дальнейшем. Приложение (Application) Под Приложением мы будем понимать директорию, содержащую конфигурацию для данного конкретного набора пакетов. Пакет (Bundle) Пакет, это [...]]]></description>
			<content:encoded><![CDATA[<p>Для того чтобы эффективно общаться между собой, люди (и программисты не исключение) заранее договариваются о некоторой базовой терминологии, поэтому перевод <strong>Symfony2 the Book</strong>, я хочу начать с небольшого глоссария, терминологию которого я буду использовать в дальнейшем.</p>
<p><span id="more-1863"></span></p>
<dl>
<h3 id="term-application">Приложение (Application)</h3>
<dd> Под Приложением мы будем понимать директорию, содержащую <em>конфигурацию </em>для данного конкретного набора пакетов. </dd>
<h3 id="term-bundle">Пакет (Bundle)</h3>
<dd> Пакет, это директория, содержащая набор файлов (PHP, CSS, JavaScript, изображения), которые реализуют одну более-менее крупную функцию (блог, форум и т.д.). В Symfony2 всё (в основном) располагается внутри тех или иных пакетов. (<a href="http://symfony.com/doc/2.0/glossary/book/page_creation.html#page-creation-bundles" target="_blank"><em>The Bundle System</em></a>) </dd>
<h3 id="term-distribution">Дистрибутив (Distribution)</h3>
<dd>Дистрибутив &#8211; это совокупность компонент Symfony2, выбранных пакетов, соответствующей структуры директорий, конфигурации по-умолчанию и опциональной системы конфигурирования. (<em>Примечание: название &#8220;дистрибутив&#8221; показалось мне наиболее логичным в данном случае, слово конечно заимствованное, но в среде ИТ-шников все его знают, в то же время &#8220;дистрибьюция&#8221; &#8211; это уже что-то из мира продаж имхо</em>).</dd>
<h3 id="term-front-controller">Фронт-контроллер (Front Controller)</h3>
<dd>Фронт-контроллер, это короткий PHP-файл, который расположен в web-директории проекта. Обычно все запросы перехватываются фронт-контроллером, а основная его задача состоит в загрузке Symfony-приложения.</dd>
<h3 id="term-http-specification">Спецификация протокола HTTP (HTTP Specification)</h3>
<dd> Спецификация протокола HTTP &#8211; это документ, который описывает протокол передачи гипертекста &#8211; набор правил, описывающих классическую клиент-серверную коммуникацию, базирующуюся на запросах и ответах. Спецификация определяет формат, используемый для запросов и ответов, а также всевозможные HTTP заголовки, которые каждый запрос/ответ могут иметь. За дополнительной информацией о протоколе HTTP вы можете обратиться по ссылкам: <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">Http Wikipedia</a> и <a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">HTTP 1.1 RFC</a>.</dd>
<h3>Окружение (Environment)</h3>
<dd>Окружение это наименование (например prod или dev) совокупности параметров, которое соответствет некоторому набору конфигурационных параметров. Одно и то же приложение может быть запущено с использованием различных конфигураций посредством его запуска в различных окружениях. Это очень удобно, так как позволяет для одного приложения иметь <strong>dev</strong>[elopment] окружение для отладки и <strong>prod</strong>[uction] окружение, оптимизированное по скорости &#8211; для конечного пользователя.</dd>
<h3>Проект (Project)</h3>
<dd>Проект &#8211; это директория, состоящая из приложения, набора пакетов, сторонних библиотек, автозагрузчика и скрипта фронт-контроллера.</dd>
<h3 id="term-service">Служба (Service)</h3>
<dd>Служба &#8211; это базовый термин для любого объекта в PHP, который выполняет определнную задачу. Служба как правило используется глобально, например объект подключения к базе данных или объект для отправки email сообщений. О приложении, имеющим много независимых служб, говорят что оно реализует <a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0" target="_blank">сервисно-ориентированную архитектуру</a>.</dd>
<h3 id="term-service-container">Контейнер служб (Service Container)</h3>
<dd>Контейнер служб, также известный как Контейнер внедрения зависимости (<em>Dependency Injection Container</em>), это специальный объект, который управляет созданием экземпляров сервисов внутри приложения. Вместо того, чтобы создавать сервис напрямую, разработчик посредством конфигурации обучает контейнер служб как создавать тот или иной сервис. Контейнер служб в свою очередь позаботится о простом получении экземпляра службы и внедрения зависимых служб.</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/03/28/symfony2-glossary/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony 2: конфигурирование пакетов</title>
		<link>http://hudson.su/2011/02/18/symfony-2-bundle-configuration/</link>
		<comments>http://hudson.su/2011/02/18/symfony-2-bundle-configuration/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 08:27:05 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[bundles]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1770</guid>
		<description><![CDATA[Для обеспечения большей гибкости, пакет (bundle) может содержать ряд конфигурационных настроек, используя встроенный механизм Symfony2. Простая конфигурация Для простой конфигурации можно воспользоваться разделом parameters, по-умолчанию присутствующим в конфигурации Symfony2. Параметры &#8211; это простые пары ключ-значение; значением может быть любое валидное значение с точки зрения PHP. Каждое наименование параметра должно начинаться с наименования пакета в нижнем [...]]]></description>
			<content:encoded><![CDATA[<p>Для обеспечения большей гибкости, пакет (bundle) может содержать ряд конфигурационных настроек, используя встроенный механизм Symfony2.</p>
<div>
<h2>Простая конфигурация</h2>
<p>Для простой конфигурации можно воспользоваться разделом <tt>parameters</tt>, по-умолчанию присутствующим в конфигурации Symfony2. Параметры &#8211; это простые пары ключ-значение; значением может быть любое валидное значение с точки зрения PHP. Каждое наименование параметра должно начинаться с наименования пакета в нижнем регистре (<tt>hello</tt> для <tt>HelloBundle</tt>, или <tt>sensio.social.blog</tt> для <tt>SensioSocialBlogBundle</tt>).</p>
<p><span id="more-1770"></span>Пользователь может задавать значения в любом конфигурационном файле:</p>
<div>
<ul>
<li><em>YAML</em>
<pre># app/config/config.yml
parameters:
    hello.email.from: fabien@example.com</pre>
</li>
<li><em>XML</em>
<pre>&lt;!-- app/config/config.xml --&gt;
&lt;parameters&gt;
    &lt;parameter key="hello.email.from"&gt;fabien@example.com&lt;/parameter&gt;
&lt;/parameters&gt;</pre>
</li>
<li><em>PHP</em>
<pre>// app/config/config.php
$container-&gt;setParameter('hello.email.from', 'fabien@example.com');</pre>
</li>
<li><em>INI</em>
<pre>[parameters]
hello.email.from = fabien@example.com</pre>
</li>
</ul>
</div>
<p>Получить параметры в коде можно из контейнера:</p>
<pre>$container-&gt;getParameter('hello.email.from');</pre>
<p>Не смотря на то, что этот механизм является достаточно простым, <strong>настоятельно рекомендуется</strong> использовать семантические конфигурации описанные ниже.</p>
</div>
<div>
<h2>Семантическая конфигурация</h2>
<p>Семантическая конфигурация имеет бОльшую гибкость в конфигурировании пакетов и превосходит простые параметры по следующим показателям:</p>
<ul>
<li>Возможность определить больше чем просто параметры (например сервисы);</li>
<li>Лучшая иерархия в конфигурации (вы можете определять вложенные конфигурации);</li>
<li>&#8220;Умные&#8221; слияния (merging), когда несколько файлов конфигурации переопределяют существующую конфигурацию;</li>
<li>Валидация конфигурации (если вы определите XSD файл и используете XML);</li>
<li>Завершение при использовании XSD и XML (<span style="color: #808080"><em>прим. пер: видимо тут имеется в виду автозавершение в IDE на основе XSD структуры XML</em></span>)</li>
</ul>
<div>
<h3>Создание расширения (Extension)</h3>
<p>Для того чтобы использовать семантическую конфигурацию, создайте расширение Dependency Injection, которое наследуется от <tt>Extension</tt>:</p>
<pre>// HelloBundle/DependencyInjection/HelloExtension.php
use SymfonyComponentDependencyInjectionExtensionExtension;

class HelloExtension extends Extension
{
    public function configLoad($config, ContainerBuilder $container)
    {
        // ...
    }

    public function getXsdValidationBasePath()
    {
        return __DIR__.'/../Resources/config/';
    }

    public function getNamespace()
    {
        return 'http://www.example.com/symfony/schema/';
    }

    public function getAlias()
    {
        return 'hello';
    }
}</pre>
<p>Класс, описанный выше определяет пространство имен <tt>hello:config</tt>, доступное в любом конфигурационном файле:</p>
<div>
<ul>
<li><em>YAML</em>
<pre># app/config/config.yml
hello.config: ~</pre>
</li>
<li><em>XML</em>
<pre>&lt;!-- app/config/config.xml --&gt;
&lt;?xml version="1.0" ?&gt;

&lt;container xmlns="http://www.symfony-project.org/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:hello="http://www.example.com/symfony/schema/"
    xsi:schemaLocation="http://www.example.com/symfony/schema/ http://www.example.com/symfony/schema/hello-1.0.xsd"&gt;

   &lt;hello:config /&gt;
   ...

&lt;/container&gt;</pre>
</li>
<li><em>PHP</em>
<pre>// app/config/config.php
$container-&gt;loadFromExtension('hello', 'config', array());</pre>
</li>
</ul>
</div>
<div>Замечание: вы можете создать столько методов <tt>xxxLoad()</tt>, сколько хотите определить конфигурационных блоков для вашего расширения.</div>
</div>
<div>
<h3>Разбор конфигурации</h3>
<p>Всякий раз, когда пользователь включает пространство имен <tt>hello.config</tt><tt> </tt>в конфигурационный файл, вызывается метод <tt>configLoad()</tt> вашего расширения и конфигурация передается в виде массива (Symfony2 автоматически конвертирует XML и YAML в массивы).</p>
<p>Итак, мы имеем следующую конфигурацию:</p>
<div>
<ul>
<li><em>YAML</em>
<pre># app/config/config.yml
hello.config:
    foo: foo
    bar: bar</pre>
</li>
<li><em>XML</em>
<pre>&lt;!-- app/config/config.xml --&gt;
&lt;?xml version="1.0" ?&gt;

&lt;container xmlns="http://www.symfony-project.org/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:hello="http://www.example.com/symfony/schema/"
    xsi:schemaLocation="http://www.example.com/symfony/schema/ http://www.example.com/symfony/schema/hello-1.0.xsd"&gt;

    &lt;hello:config foo="foo"&gt;
        &lt;hello:bar&gt;foo&lt;/hello:bar&gt;
    &lt;/hello:config&gt;

&lt;/container&gt;</pre>
</li>
<li><em>PHP</em>
<pre>// app/config/config.php
$container-&gt;loadFromExtension('hello', 'config', array(
    'foo' =&gt; 'foo',
    'bar' =&gt; 'bar',
));</pre>
</li>
</ul>
</div>
<p>Массив, который будет передаваться в ваш метод будет таким:</p>
<pre>array(
    'foo' =&gt; 'foo',
    'bar' =&gt; 'bar',
)</pre>
<p>Внутри метода <tt>configLoad()</tt> переменная <tt>$container </tt>ссылается на контейнер, который знает лишь об этом пространстве имен. Вы можете манипулировать добавлением сервисов и параметров в нужном вам направлении. Когда метод вызывается первый раз, контейнер знает лишь о глобальных параметрах. При последующих вызовах он содержит конфигурацию, определенную предыдущими вызовами. Таким образом метод должен объединить новые настройки со старыми:</p>
<pre>// only load default services and parameters once
if (!$container-&gt;hasDefinition('xxxxx')) {
    $loader = new XmlFileLoader($container, __DIR__.'/../Resources/config');
    $loader-&gt;load('hello.xml');
}</pre>
<p>Глобальные параметры:</p>
<ul>
<li><tt>kernel.name</tt></li>
<li><tt>kernel.environment</tt></li>
<li><tt>kernel.debug</tt></li>
<li><tt>kernel.root_dir</tt></li>
<li><tt>kernel.cache_dir</tt></li>
<li><tt>kernel.logs_dir</tt></li>
<li><tt>kernel.bundle_dirs</tt></li>
<li><tt>kernel.bundles</tt></li>
<li><tt>kernel.charset</tt></li>
</ul>
<div><strong> Предупреждение</strong>: все имена параметров и сервисов, начинающиеся с подчерка (_) зарезервированы для использования фреймворком и новые не должны определяться в пакетах.</div>
</div>
<div>
<h3>Соглашения по созданию расширений<a title="Permalink to this headline" href="http://docs.symfony-reloaded.org/guides/bundles/configuration.html#extension-conventions"></a></h3>
<p>При создании расширения следуйте этим простым соглашениям:</p>
<ul>
<li>Расширение должно находиться во вложенном пространстве имен <tt>DependencyInjection</tt>;</li>
<li>Расширение должно именоваться при помощи наименования пакета и завершаться суффиксом <tt>Extension</tt> (<tt>HelloExtension</tt> для <tt>HelloBundle</tt>) &#8211; если же вы создаете несколько расширений для одного пакета, просто завершайте их суффиксом <tt>Extension</tt>;</li>
<li>Алиас должен быть уникальным и должен именоваться также при помощи наименования пакета (<tt>hello</tt> для <tt>HelloBundle</tt> или <tt>sensio.social.blog</tt> для <tt>SensioSocialBlogBundle</tt>);</li>
<li>Расширение должно содержать XSD схему.</li>
</ul>
<p>Если вы последуете этим рекомендациям, то ваше расширение автоматически будет зарегистрировано Symfony2. Если этого не произошло, переопределите метод пакета <tt>registerExtensions():</tt></p>
<pre>class HelloBundle extends Bundle
{
    public function registerExtensions(ContainerBuilder $container)
    {
        // register the extension(s) found in DependencyInjection/ directory
        parent::registerExtensions($container);

        // register extensions that do not follow the conventions manually
        $container-&gt;registerExtension(new ExtensionHello());
    }
}</pre>
</div>
<div>
<h3>Конфигурация по-умолчанию</h3>
<p>Как определено ранее, пользователь пакета должен включить пространство имен <tt>hello.config</tt> в конфигурационный файл, для того чтобы вызывался код вашего расширения. Но вы также можете автоматически регистрировать конфигурацию по-умолчанию, переопределяя метод пакета <tt>registerExtensions():</tt></p>
<pre>class HelloBundle extends Bundle
{
    public function registerExtensions(ContainerBuilder $container)
    {
        // will register the HelloBundle extension(s) found in DependencyInjection/ directory
        parent::registerExtensions($container);

        // load some defaults
        $container-&gt;loadFromExtension('hello', 'config', array(/* your default config for the hello.config namespace */));
    }
}</pre>
<div>
<p><strong>Внимание</strong>: Symfony2 старается быть максимально открытым и понятным. Поэтому определение конфигурации по-умолчанию автоматически это наверняка не очень хорошая идея.</p>
<blockquote><p>Оригинал тут: <a href="http://docs.symfony-reloaded.org/guides/bundles/configuration.html" target="_blank">http://docs.symfony-reloaded.org/guides/bundles/configuration.html</a></p>
<p>Перевод как всегда &#8211; мой авторский ))</p></blockquote>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/02/18/symfony-2-bundle-configuration/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>( PHP CLI &amp; eAccelerator ) != love</title>
		<link>http://hudson.su/2011/02/16/php-cli-and-eaccelerator-ne-love/</link>
		<comments>http://hudson.su/2011/02/16/php-cli-and-eaccelerator-ne-love/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 10:49:18 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[optimization]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1774</guid>
		<description><![CDATA[На днях встал вопрос об оптимизации запуска cron-скриптов. Подавляющая часть &#8211; это таски symfony (т.е. выполняется что-то типа ./symfony namespace:taskname params) и даже в условиях использования nice они создают приличный оверхед на сервер. В ходе разбора полетов решил уяснить, работает ли eAccelerator c php-cli. Собственно с подсказки @ibulatenko забрел на страницу http://eaccelerator.net/wiki/Faq, на которой черным [...]]]></description>
			<content:encoded><![CDATA[<p>На днях встал вопрос об оптимизации запуска cron-скриптов. Подавляющая часть &#8211; это таски symfony (т.е. выполняется что-то типа ./symfony namespace:taskname params) и даже в условиях использования nice они создают приличный оверхед на сервер.</p>
<p>В ходе разбора полетов решил уяснить, работает ли eAccelerator c php-cli. Собственно с подсказки <a href="http://twitter.com/ibulatenko" target="_blank">@ibulatenko</a> забрел на страницу <a href="http://eaccelerator.net/wiki/Faq" target="_blank">http://eaccelerator.net/wiki/Faq</a>, на которой черным по вебу написано в самом низу страницы:</p>
<blockquote><p><strong>Is eAccelerator working with php-cgi or php-cli?</strong><br />
This is not yet supported and it won&#8217;t be supported in the near future. However FastCGI <strong>is</strong> supported.</p></blockquote>
<p>P.S. Судя по всему ни один акселератор не работает при использовании CLI интерфейса (по крайней мере точно известно про XCache, при этом там также написано что поскольку у CLI совершенно другой принцип работы, то и ожидать не стоит).</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/02/16/php-cli-and-eaccelerator-ne-love/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony 2: пакеты, практические рекомендации</title>
		<link>http://hudson.su/2011/02/15/symfony-2-bundles-best-practices/</link>
		<comments>http://hudson.su/2011/02/15/symfony-2-bundles-best-practices/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 07:58:29 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[bundles]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1747</guid>
		<description><![CDATA[Пакет &#8211; прежде всего это директория, которая имеет строго определенную структуру и может содержать все что угодно (от классов, до контроллеров и web-ресурсов). Не смотря на то что пакеты очень гибки, вы должны следовать некоторым рекомендациям (best practices), если вы хотите выложить его в общий доступ. Об этих практиках мы и поговорим ниже: Наименование пакета [...]]]></description>
			<content:encoded><![CDATA[<p>Пакет &#8211; прежде всего это директория, которая имеет строго определенную структуру и может содержать все что угодно (от классов, до контроллеров и web-ресурсов). Не смотря на то что пакеты очень гибки, вы должны следовать некоторым рекомендациям (best practices), если вы хотите выложить его в общий доступ. Об этих практиках мы и поговорим ниже:</p>
<p><span id="more-1747"></span></p>
<div>
<h2>Наименование пакета<a title="Permalink to this headline" href="http://docs.symfony-reloaded.org/guides/bundles/best_practices.html#bundle-name"></a></h2>
<p>Пакет &#8211; это, помимо всего прочего, также пространство имен. Пространство имен должно соответствовать <a href="http://groups.google.com/group/php-standards/web/psr-0-final-proposal" target="_blank">стандартам совместимости</a> PHP 5.3 для пространств имен и наименований классов: они должны начинаться с сегмента &#8220;поставщика&#8221; (вендора), содержать несколько сегментов категорий (в том числе может не содержать ни одного) и оканчиваться коротким наименованием пространства имен, которое должно, в свою очередь, завершаться суффиксом <tt>Bundle</tt>.</p>
<p>Пространство имен становится пакетом как только вы добавите в него класс пакета (bundle class). Наименование класса пакета должно соответствовать нескольким нехитрым правилам:</p>
<ul>
<li>Использовать только буквы, цифры и подчерк;</li>
<li>Использовать <em>ВерблюжийРегистр (aka CamelCase)</em> для имени</li>
<li>Использовать описательные и короткие наименования (не менее 2х слов)</li>
<li>Использовать в качестве префикса наименование вендора (и опционально &#8211; категории пространства имен)</li>
<li>Использовать суффикс <tt>Bundle</tt>.</li>
</ul>
<p>В таблице ниже приведены несколько примеров правильных пространств имен и наименований классов для пакетов:</p>
<table style="height: 106px" border="1" width="525">
<col width="54%"></col>
<col width="46%"></col>
<thead>
<tr>
<th>Пространство имен</th>
<th>Наименование класса</th>
</tr>
</thead>
<tbody>
<tr>
<td><tt>SensioBundleBlogBundle</tt></td>
<td><tt>SensioBlogBundle</tt></td>
</tr>
<tr>
<td><tt>SensioBundleSocialBlogBundle</tt></td>
<td><tt>SensioSocialBlogBundle</tt></td>
</tr>
<tr>
<td><tt>SensioBlogBundle</tt></td>
<td><tt>SensioBlogBundle</tt></td>
</tr>
</tbody>
</table>
<p>По договоренности, метод <tt>getName()</tt> класса в пакете должен возвращать имя класса.</p>
</div>
<div>
<h2>Структура директорий</h2>
<p>Базовую структуру директорий пакета <tt>HelloBundle</tt> можно представить следующим образом:</p>
<pre>XXX/...
    HelloBundle/
        HelloBundle.php
        Controller/
        Resources/
            meta/
                LICENSE
            config/
            doc/
                index.rst
            translations/
            views/
            public/
        Tests/</pre>
<p>Структура директорий XXX отражает структуру пространства имен пакета.</p>
<p>Следующие файлы являются обязательными:</p>
<ul>
<li><tt>HelloBundle.php</tt>;</li>
<li><tt>Resources/meta/LICENSE</tt>: текст лицензии на код пакета;</li>
<li><tt>Resources/doc/index.rst</tt>: корневой файл документации пакета.</li>
</ul>
<div>
<p>Замечание: следование этим соглашениям обеспечивает работу средств автоматизации.</p>
</div>
<p>Глубина под-директорий должна быть минимально необходимой для используемых классов и файлов (максимум 2 уровня). Больший уровень вложенности может быть использован для малозначимых или же редкоиспользуемых файлов.</p>
<p>Дирктория пакета предназначается только для чтения. Если вам необходимо писать временные файлы &#8211; вы можете сохранять их в директории <tt>cache/ </tt>или <tt>log/</tt>. Вы можете генерировать файлы в директории пакета при помощи различных инструментов, но только в том случае, если генерированные файлы будут частью репозитория.</p>
<p>Следующие классы и файлы имеют определенное расположение:</p>
<table style="height: 168px" border="1" width="520">
<col width="48%"></col>
<col width="52%"></col>
<thead>
<tr>
<th>Тип</th>
<th>Директория</th>
</tr>
</thead>
<tbody>
<tr>
<td>Контроллеры</td>
<td><tt>Controller/</tt></td>
</tr>
<tr>
<td>Файлы с переводами</td>
<td><tt>Resources/translations/</tt></td>
</tr>
<tr>
<td>Шаблоны</td>
<td><tt>Resources/views/</tt></td>
</tr>
<tr>
<td>Модульные и функциональные тесты</td>
<td><tt>Tests/</tt></td>
</tr>
<tr>
<td>Web-ресурсы (доступные публично)</td>
<td><tt>Resources/public/</tt></td>
</tr>
<tr>
<td>Конфигурация</td>
<td><tt>Resources/config/</tt></td>
</tr>
<tr>
<td>Команды</td>
<td><tt>Command/</tt></td>
</tr>
</tbody>
</table>
</div>
<div>
<h2>Классы</h2>
<p>Структура директорий пакета используется как иерархия пространства имен Например, <tt>HelloController </tt>контроллер находится по пути <tt>Bundle/HelloBundle/Controller/HelloController.php и </tt>полное имя класса будет <tt>BundleHelloBundleControllerHelloController</tt>.</p>
<p>Все классы и файлы должны соответствовать <a href="http://docs.symfony-reloaded.org/contributing/code/standards.html" target="_blank">стандартам кодирования Symfony2</a>.</p>
</div>
<div>
<p>Некоторые классы следует рассматривать как фасады (facades) и стараться делать их как можно более короткими, например Commands, Helpers, Listeners и Controllers.</p>
<p>Классы, которые подключаются к Event dispatcher&#8217;у должны иметь суффикс <tt>Listener</tt>.</p>
<p>Классы исключений должны быть расположены во сложенном пространстве имен <tt>Exception</tt>.</p>
</div>
<div>
<h2>Вендоры<a title="Permalink to this headline" href="http://docs.symfony-reloaded.org/guides/bundles/best_practices.html#vendors"></a></h2>
<p>Пакет не должен включать сторонних PHP-библиотек. Вместо этого они должны располагаться в стандартной директории Symfony2, доступной автозагрузчику. Также пакет не должен включать сторонних библиотек на JavaScript, CSS или на других языках.</p>
</div>
<div>
<h2>Тесты<a title="Permalink to this headline" href="http://docs.symfony-reloaded.org/guides/bundles/best_practices.html#tests"></a></h2>
<p>Пакеты должны комплектоваться набором тестов на PHPUnit и расположенными в директории <tt>Tests/</tt>. Тесты должны следовать следующим принципам:</p>
<ul>
<li>Тестовый набор должен выполняться простой командой <tt>phpunit </tt>из демо-приложения;</li>
<li>Функциональные тесты должны быть использованы только для тестирования ответов (response output) и профильных данных, если таковые имеются;</li>
<li>Покрытие кода должно составлять не менее 95% кода вашего пакета.</li>
</ul>
<div>
<p>Замечание: тестовый набор не должен содержать скрипта <tt>AllTests.php</tt>, но должен полагаться на наличие файла <tt>phpunit.xml.dist</tt>.</p>
</div>
</div>
<div>
<h2>Документация</h2>
<p>Все классы и функции должны быть документированы в стиле PHPDoc.</p>
<p>Полная документация также должна быть представлена в формате <a href="http://docs.symfony-reloaded.org/contributing/documentation/format.html"><em>reStructuredText</em></a>, и располагаться в директории <tt>Resources/doc/</tt>; наличие файла <tt>Resources/doc/index.rst</tt> &#8211; <strong>обязательно</strong>!</p>
</div>
<div>
<h2>Контроллеры<a title="Permalink to this headline" href="http://docs.symfony-reloaded.org/guides/bundles/best_practices.html#controllers"></a></h2>
<p>Контроллеры в пакете не должны наследоваться от класса <tt><a title="SymfonyBundleFrameworkBundleControllerController" href="http://api.symfony-reloaded.org/PR6/Symfony/Bundle/FrameworkBundle/Controller/Controller.html">Controller</a></tt>. Они должны реализовывать интерфейс <tt><a title="SymfonyFoundationDependencyInjectionContainerAwareInterface" href="http://api.symfony-reloaded.org/PR6/Symfony/Foundation/DependencyInjection/ContainerAwareInterface.html">ContainerAwareInterface</a></tt> или наследоваться от класса <tt><a title="SymfonyFoundationDependencyInjectionContainerAware" href="http://api.symfony-reloaded.org/PR6/Symfony/Foundation/DependencyInjection/ContainerAware.html">ContainerAware</a></tt>.</p>
<div>
<p>Замечание: Если вы посмотрите на методы класса <tt><a title="SymfonyBundleFrameworkBundleControllerController" href="http://api.symfony-reloaded.org/PR6/Symfony/Bundle/FrameworkBundle/Controller/Controller.html">Controller</a></tt>, вы заметите что они представляют собой &#8220;ярлычки&#8221; для упрощения изучения.</p>
</div>
</div>
<div>
<h2>Шаблоны</h2>
<p>Если пакет включает в себя шаблоны, они должны использовать Twig. Пакет не должен включать в себя главный layout, за исключением случаев, если он представляет собой полноценное рабочее приложение.</p>
</div>
<div>
<h2>Файлы переводов</h2>
<p>Если пакет содержит переводы сообщений, они должны быть определены в формате XLIFF;</p>
<p>If a bundle provides message translations, they must be defined in the XLIFF format; домен должен располагаться после имени пакета (<tt>bundle.hello</tt>).</p>
<p>Пакет не должен переопределять уже существующие сообщения из других пакетов.</p>
</div>
<div>
<h2>Конфигурация</h2>
<p>Конфигурация пакета должна использовать строенный <a href="http://docs.symfony-reloaded.org/guides/bundles/configuration.html" target="_blank">механизм</a> Symfony2. Пакет должен предоставлять все его базовые настройки в виде XML.</p>
<blockquote><p>Оригинал тут <a href="http://docs.symfony-reloaded.org/guides/bundles/best_practices.html" target="_blank">http://docs.symfony-reloaded.org/guides/bundles/best_practices.html</a></p>
<p>Перевод как обычно авторский )</p></blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/02/15/symfony-2-bundles-best-practices/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony 2 для разработчиков на symfony 1.x</title>
		<link>http://hudson.su/2011/02/12/symfony2-for-symfony1-developers/</link>
		<comments>http://hudson.su/2011/02/12/symfony2-for-symfony1-developers/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 12:51:32 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1718</guid>
		<description><![CDATA[Symfony 2.0 по сравнению с первой версией фреймворка шагнул далеко вперед. К счастью, MVC архитектура, лежащая в основе его ядра, позволяет использовать те же навыки, что вы использовали, разрабатывая приложения для symfony1 и для Symfony2. App.yml вы конечно тут не увидите, но маршрутизация, контроллеры и шаблоны сохранились. В этой статье мы рассмотрим ключевые отличия между [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony 2.0 по сравнению с первой версией фреймворка шагнул далеко вперед. К счастью, MVC архитектура, лежащая в основе его ядра, позволяет использовать те же навыки, что вы использовали, разрабатывая приложения для symfony1 и для Symfony2. App.yml вы конечно тут не увидите, но маршрутизация, контроллеры и шаблоны сохранились.</p>
<p>В этой статье мы рассмотрим ключевые отличия между symfony1 and Symfony2. Как вы сможете увидеть, многие задачи там решаются несколько иными путями. И вы научитесь ценить эти небольшие изменения, так как они позволят вам разрабатывать стабильный, предсказуемый, тестируемый и независимый код в ваших будущих приложениях на Symfony2.</p>
<p>Итак, расслабьтесь, и внимайте.</p>
<p><span id="more-1718"></span></p>
<div>
<h2>Структура директорий</h2>
<p>Когда вы посмотрите на структуру директорий любого Symfony2 проекта (например <a href="https://github.com/symfony/symfony-sandbox" target="_blank">Symfony2 Sandbox</a>), вы конечно же заметите что структура сильно отличается от того что вы видели раньше. Однако, когда мы копнем поглубже, окажется что изменения не так уж и серьёзны.</p>
<div>
<h3>Директория <tt>app/</tt></h3>
<p>В symfony1 ваш проект мог иметь одно или больше приложений, каждое из которых располагалось в директории <tt>apps/</tt> (например <tt>apps/frontend</tt>). По умолчанию в Symfony2 у вас есть лишь одно приложение, которое расположено в директории <tt>app/</tt>. Как и в symfony1 директория app/ содержит конфигурационные файлы приложения. Также тут содержится кеш приложения, лог и директории для шаблонов, а так же класс <tt>Kernel</tt> (<tt>AppKernel</tt>), который является базовым объектом, представляющим приложение.</p>
<p>В отличие от symfony1 в директории <tt>app/</tt> в основном располагается не PHP-код. Эта директория не содержит модулей или библиотек, как это делает symfony1. Вместо этого, тут расположены конфигурационные файлы и прочие ресурсы (шаблоны, файлы переводов и т.п.).</p>
</div>
<div>
<h3>Директория <tt>src/</tt></h3>
<p>Будем кратки: основной ваш код располагается здесь. В Symfony2 весь код приложения располагается в пакете (bundle, который приблизительно можно сравнить с плагином в symfony1) и, по умолчанию, каждый пакет располагается в директории <tt>src/</tt>. Таким образом, директорию src можно сравнить с директорией plugins в symfony1, но все-таки она дает разработчику больше свободы и гибкости. Также, в случае, если ваши пакеты располагаются в директории src/, сторонние пакеты можно расположить в директории vendor/.</p>
<p>Для того чтобы получить более полную картину о директории src/, давайте вспомним о том как у нас все было организовано в приложении symfony1. Часть вашего кода скорее всего располагалась в одном или более приложений. Как правило код включал в себя модули, но это также могли быть прочие классы, которые вы сочли нужным разместить там. Вы также могли создать файл schema.yml в директории config вашего проекта и создать множество файлов модели. Наконец, для того чтобы не изобретать велосипеды, вы пользовались несколькими сторонними плагинами, которые располагались в директории plugins/. Другими словами, код, заставляющий взлетать ваше приложение, располагался в множестве различных мест.</p>
<p>В Symfony2 жизнь намного проще, потому что <strong>весь </strong>код приложения в Symfony2 должен располагаться внутри пакета (bundle). Следуя аналогии, в symfony1 весь наш код должен был бы быть размещен в одном или нескольких плагинах (что само по себе является неплохой практикой). Полагая что все наши модули, PHP классы, схема, конфигурация маршрутизатора и т.д. переедут в плагин, тогда директория plugins/ из symfony1 будет очень похожа на директорию src/ в Symfony2</p>
<p>Кратко резюмируя, в директории src/ будут расположены ваш код, ассеты, шаблоны и много чего еще, что дает жизнь вашему проекту.</p>
</div>
<div>
<h3>Директория <tt>vendor/</tt></h3>
<p>Директория vendor/ в основном похожа на директорию lib/vendor из symfony1, которая была общепринятым местом хранения всех сторонних библиотек. По умолчанию, вы найдете в этой директории библиотечные файлы Symfony2, а также несколько вспомогательных библиотек, таких как Doctrine2, Twig и Swiftmailer.</p>
</div>
<div>
<h3>Директория <tt>web/</tt></h3>
<p>В директории web/ поменялось не так уж и много. Наиболее заметное изменение &#8211; это отсутствие директорий <tt>css/</tt>, <tt>js/</tt> и <tt>images/</tt>. Не беспокойтесь, это было сделано преднамеренно. Как и в случае с вашим PHP кодом, все ассеты также должны располагаться внутри пакета (bundle). При помощи консольной команды, директория Resources/public каждого пакета копируется или линкуется символической ссылкой в директорию <tt>web/bundles/</tt>. Это позволяет вам упорядоченно хранить ваши ассеты внутри пакета, а также делать их доступными пользователям. Для того чтобы быть уверенными, что все пакеты доступны, выполните следующую команду:</p>
<pre>./app/console_dev assets:install web --symlink</pre>
<div>Отметим также, что эта команда эквивалентна команде symfony1 <tt>- plugin:publish-assets</tt>.</div>
<div>
<h2>Автозагрузка</h2>
<p>Одной из отличительных черт современных фреймворков является то, что разработчику не нужно беспокоиться о подключении файлов. С использованием автозагрузчика вы можете ссылаться на любой класс в вашем проекте и быть уверенными что он доступен. В Symfony2 автозагрузчик был доработан, стал более универсальным, более быстрым и не требующим очистки кеша.</p>
<p>В symfony1 автозагрузчик выполнял поиск PHP классов по всему проекту и кешировал эту информацию в гигантском массиве. Этот массив устанавливал строгое соответствие какой файл содержит тот или иной класс. В продуктовом окружении эта операция требовала очистки кеша при добавлении нового класса или перемещении уже существующего.</p>
<p>В Symfony2 за этот процесс отвечает класс <tt>UniversalClassLoader</tt>. Идея его проста: имя класса (включая пространство имен) должно соответствовать пути к файлу, который содержит класс. Давайте рассмотрим <tt>HelloController </tt>из песочницы Symfony2 в качестве примера:</p>
<pre>namespace SensioHelloBundleController;
use SymfonyBundleFrameworkBundleControllerController;
class HelloController extends Controller
{
    // ...</pre>
<p>Сам файл располагается по пути <tt>src/Sensio/HelloBundle/Controller/HelloController.php</tt>. Как вы видите, расположение файла соответствует пространству имен класса. А именно, пространство имен <tt>SensioHelloBundleController</tt>, сообщает что директория, где будет расположен файл &#8211; <tt>srcSensioHelloBundleController</tt>.</p>
<p>Если файл не будет найден по ожидаемому пути, вы получите ошибку: <tt>Class "SensioHelloBundleControllerHelloController" does not exist.</tt>. В Symfony2 ошибка “class does not exist” означает, что пространство имен класса и его физическое расположение на диске не совпадают. Таким образом, Symfony2 ищет класс в одном единственном месте, которое ему положено. Кроме того, для того чтобы класс был автозагружен, <strong>вам никогда не придется очищать кеш</strong> в Symfony2.</p>
<p>Тем не менее, для того чтобы автозагрузчик работал правильно, ему нужно знать, что пространство имен Sensio расположено в директории src и, например, что пространство имен Doctrine располагается в директории <tt>vendor/doctrine/lib/</tt>. Данные правила полностью контролируются разработчиком (вами) посредством файла <tt>app/autoload.php</tt>.</p>
</div>
<div>
<h2>Консоль</h2>
<p>В symfony1 консоль располагалась в корневой директории вашего проекта и называлась <tt>symfony</tt>.</p>
<p>В Symfony2 консоль располагается в суб-директории приложения и называется <tt>console</tt>.</p>
<p>Консоль обслуживает только одно окружение (например dev, prod). Это поведение отличается от symfony1, где некоторые задачи (task) позволяли вам указать окружение через опцию <tt>env=</tt>. Распространённой практикой является создание отдельного командного файла для каждого окружения. Как правило это означает наличие файла <tt>console</tt> для <tt>prod</tt> и <tt>console_dev</tt> для <tt>dev</tt> окружений.</p>
</div>
<div>
<h2>Приложения</h2>
<p>В проекте на symfony1 обычной практикой было создавать несколько приложений: например frontend и backend.</p>
<p>В проекте на Symfony2 вам нужно создать лишь одно приложение (блог, интранет-портал&#8230;). В большинстве случаев, если вы захотите создать еще одно приложение, вы можете вместо этого создать еще один проект и обеспечить доступность необходимых пакетов между ними.</p>
<p>И если вы хотите разделить frontend и backend функциональность в пакетах, вы можете создать вложенные пространства имен для контроллеров, субдиректории для шаблонов, различную семантику конфигурационных файлов, различные правила маршрутизации и т.д.</p>
<p>Конечно же, наличие нескольких приложений в проекте не будет совершенно неправильным шагом, но это целиком ваш выбор. Второе приложение будет означать новую директорию, например my_app/, с настройками, аналогичными тем, которые находятся в директории app/.</p>
<p>Совет: почитайте определения <a href="http://docs.symfony-reloaded.org/glossary.html#term-project" target="_blank"><em>проекта</em></a>, <a href="http://docs.symfony-reloaded.org/glossary.html#term-application" target="_blank"><em>приложения</em></a>, и <a href="http://docs.symfony-reloaded.org/glossary.html#term-bundle" target="_blank"><em>пакета</em></a> в глоссарии.</p>
</div>
<div>
<h2>Пакеты и плагины</h2>
<p>В проекте symfony1 плагин должен содержать конфигурацию, модули, PHP библиотеки, ассеты и все прочее, относящееся к вашему проекту. В Symfony2 место плагина заняли пакеты (bundles). Пакет даже более функционален нежели плагин, потому что ядро Symfony2 состоит из последовательности пакетов. В Symfony2 пакет это гражданин высшего сорта, настолько гибкий, что даже ядро это пакет.</p>
</div>
<div>
<p>В symfony1 плагин должен быть активирован в классе <tt>ProjectConfiguration</tt>:</p>
<pre>// config/ProjectConfiguration.class.php
public function setup()
{
    $this-&gt;enableAllPluginsExcept(array(/* some plugins here */));
}</pre>
<p>В Symfony2 пакеты активируются внутри ядра приложения:</p>
<pre>// app/AppKernel.php
public function registerBundles()
{
    $bundles = array(
        new SymfonyBundleFrameworkBundleFrameworkBundle(),
        new SymfonyBundleTwigBundleTwigBundle(),
        // ...
        new SensioHelloBundleHelloBundle(),
    );

    return $bundles;
}</pre>
<p>Также необходимо удостовериться что пространство имен <tt>Sensio</tt> присутствует в автозагрузчике:</p>
<pre>// app/autoload.php
$loader = new UniversalClassLoader();
$loader-&gt;registerNamespaces(array(
    'Symfony'                        =&gt; __DIR__.'/../vendor/symfony/src',
    'Sensio'                         =&gt; __DIR__.'/../src',
    // ...
));</pre>
<p>В symfony1 конфигурационные файлы <tt>routing.yml</tt> и <tt>app.yml</tt> загружались автоматически для любого плагина. В Symfony2 маршруты и конфигурация приложения из пакета должны быть подключены вручную. Например, чтобы подключить маршрутизацию из пакеты, вы должны выполнить следующее:</p>
<pre># app/config/routing.yml
hello:
    resource: @HelloBundle/Resources/config/routing.yml</pre>
<p>Таким образом, чтобы получить конфигурацию пакета, вам нужно ее импортировать в конфигурации вашего приложения.</p>
<blockquote><p>Оригинал тут: <a href="http://docs.symfony-reloaded.org/guides/symfony1.html" target="_blank">http://docs.symfony-reloaded.org/guides/symfony1.html</a></p>
<p>Перевод авторский <img src='http://hudson.su/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p></blockquote>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/02/12/symfony2-for-symfony1-developers/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Symfony без слэша на хвосте</title>
		<link>http://hudson.su/2010/06/12/symfony-without-trailing-slash/</link>
		<comments>http://hudson.su/2010/06/12/symfony-without-trailing-slash/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 20:09:43 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1558</guid>
		<description><![CDATA[Часто-часто задаваемый вопрос в канале по symfony: как избавиться от слэша на конце URL почему DoctrineRouteCollection не принимает последний слэш и т.д. в том же духе Так вот вам просто сниппет в помощь: #to avoid trailing slash problem RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L] Научной ценности сниппет не представляет, но вопрос действительно часто спрашиваемый ) Так что [...]]]></description>
			<content:encoded><![CDATA[<p>Часто-часто задаваемый вопрос в канале по symfony:</p>
<ul>
<li>как избавиться от слэша на конце URL</li>
<li>почему DoctrineRouteCollection не принимает последний слэш</li>
<li>и т.д. в том же духе</li>
</ul>
<p>Так вот вам просто сниппет в помощь:</p>
<pre>#to avoid trailing slash problem
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</pre>
<p>Научной ценности сниппет не представляет, но вопрос действительно часто спрашиваемый ) Так что &#8220;ищите и обрящете&#8221; ))</p>
<p>Have fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/06/12/symfony-without-trailing-slash/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BitNami &#8211; помощник ленивому программисту</title>
		<link>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/</link>
		<comments>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/#comments</comments>
		<pubDate>Sun, 30 May 2010 06:42:38 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[bitnami]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[suse]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1520</guid>
		<description><![CDATA[Кросспост из моего хабра. Век живи &#8211; век учись. Ковыряясь в публикациях о Ruby на википедии наткнулся на замечательный проект, который не только поможет ленивому программисту поднять development среду для своих нужд, но также во многих случаях выручит и администратора и менеджера проектов. Проект этот называется BitNami. Что же такое &#8211; BitNami? Целью BitNami является [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Кросспост из моего <a href="http://habrahabr.ru/blogs/webdev/94904/" target="_blank">хабра</a>.</p></blockquote>
<p>Век живи &#8211; век учись.</p>
<p>Ковыряясь в публикациях о Ruby на википедии наткнулся на замечательный проект, который не только поможет ленивому программисту поднять development среду для своих нужд, но также во многих случаях выручит и администратора и менеджера проектов. Проект этот называется <a href="http://bitnami.org" target="_blank">BitNami</a>.</p>
<p><span id="more-1520"></span>Что же такое &#8211; BitNami?</p>
<p>Целью BitNami является  упрощение процесса развертывания веб-приложений, таких как вики или блоги, что позволит сделать их более доступными. В мире есть много качественных программных пакетов с открытым исходным кодом, которые не  используются так широко, как они могли быть использованы, потому что установить их и настроить не каждому по плечу. Команда BitNami намерена бороться с этим.</p>
<p>BitNami Stack представляет  собой интегрированный пакет программного обеспечения, которое включает в  себя веб-приложение и все его необходимые компоненты (веб-сервер, базу  данных, Language Runtime), поэтому он готов к запуску &#8220;из коробки&#8221;. Stack&#8217;и могут быть представлены в виде нативных инсталляторов, образов виртуальных машин,  или образов для облачного хостинга.</p>
<p>Нативные инсталляторы &#8211; это отдельные исполнимые файлы, которые вы можете загрузить к себе на машину. После запуска инсталлятора будет выполнен пошаговый атоматический процесс установки выбранной системы. Инсталляторы доступны для Windows, Mac OS X, Linux и Solaris (согласитесь, этого более чем достаточно в 95% случаев).</p>
<p>Образы виртуальных машин &#8211; это преднастроенные виртуальные машины, которые включают минимальную инсталляцию Linux и собственно компоненты BitNami Stack. Образы виртуальных машин доступны для VMWare и последних версий VirtualBox.</p>
<p>Образы для облачного хостинга позволяют вам запустить BitNami Stack в облачном окружении и программно запускать или останавливать его. Облачные образы на текущий момент доступны для Amazon EC2, кроме того планируется также поддержка других облачных хостингов.</p>
<p>Независимо от того, какой тип стека выберете, все они позволяют запустить выбранное вами приложение в считанные минуты, не тратя времени на его конфигурирование и настройку.</p>
<p>На текущий момент доступно уже несколько десятков стеков. Вот некоторые из них:</p>
<ul type="none">
<li><strong>Infrastructure</strong>
<ul>
<li>DjangoStack</li>
<li>LAMPStack</li>
<li>RubyStack</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Blog</strong>
<ul>
<li>WordPress</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Bug-Tracking</strong>
<ul>
<li>Redmine</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>CMS</strong>
<ul>
<li>Drupal</li>
<li>Joomla</li>
<li>Radiant CMS</li>
<li>&#8230;</li>
</ul>
</li>
<li><strong>Forum</strong>
<ul>
<li>phpBB</li>
</ul>
</li>
<li><strong>Version  Control</strong>
<ul>
<li>Subversion</li>
</ul>
</li>
<li><strong>Wiki</strong>
<ul>
<li>DokuWiki</li>
<li>MediaWiki</li>
<li>&#8230;</li>
</ul>
</li>
</ul>
<p>Где же могут нам пригодиться BitNami Stacks?</p>
<ul>
<li>Локальные девелоперские среды.</li>
<li>Вируализация девелоперских сред на централизованных началах (безобразно, но однообразно, как в армии).</li>
<li>Тестирование CMS, Wiki, багтрекеров &#8211; поиграться, чтобы понять, а нужно ли оно вообще, подходит ли.</li>
<li>Развертывание быстрых конфигураций в продуктовых средах (облачный хостинг как минимум).</li>
<li>Ваш вариант?</li>
</ul>
<p>Я уже опробовал VMWare образы Python/Ruby/Redmine &#8211; очень понравилось. Django Stack (native installer) почему-то не установился на Win7 &#8211; что-то с PostgreSQL, пока детально не разбирался.</p>
<p>Вот вкратце и все. Надеюсь, был полезен ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/05/30/bitnami-helps-lazy-programmer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Конференция Symfony Camp UA 2010</title>
		<link>http://hudson.su/2010/05/28/symfony-camp-ua-2010/</link>
		<comments>http://hudson.su/2010/05/28/symfony-camp-ua-2010/#comments</comments>
		<pubDate>Fri, 28 May 2010 06:16:15 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web разработка]]></category>
		<category><![CDATA[события]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1512</guid>
		<description><![CDATA[Приглашаем всех желающих посетить конференцию по Symfony PHP Framework, которая состоится 3 июля 2010 года в г.Киев. Участие в конференции – бесплатное. Зарегистрироваться на мероприятие. Конференция ориентирована как на профессиональных веб-разработчиков, так и начинающих. Мероприятие будет интересным местом для общения программистов и руководителей интернет-проектов, которые используют или планируют использовать фреймворк Symfony, где можно будет пообщаться, [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Конференция Symfony Camp UA 2010" href="http://symfonycamp.org.ua/" target="_blank"><img src="http://symfonycamp.org.ua/uploads/logo-export/2010/symfonycamp-ua-2010-300x168.png" alt="Конференция Symfony Camp UA 2010" width="300" height="168" /></a></p>
<p>Приглашаем всех желающих посетить конференцию по <a href="http://www.symfony-project.org/" target="_blank">Symfony PHP Framework</a>, которая состоится 3 июля 2010 года в г.Киев. Участие в конференции – бесплатное. <a href="http://symfonycamp.org.ua/register/" target="_blank">Зарегистрироваться</a> на мероприятие.</p>
<p>Конференция ориентирована как на профессиональных веб-разработчиков, так и начинающих. Мероприятие будет интересным местом для общения программистов и руководителей интернет-проектов, которые используют или планируют использовать фреймворк Symfony, где можно будет пообщаться, поделиться своим опытом, получить новые знакомства.</p>
<h2>Планируемые доклады</h2>
<p><span id="more-1512"></span></p>
<h4>Перевод боевого сайта с ветки 1.0 на ветку 1.4</h4>
<p>Руслан Ханов (Россия, Новосибирск)</p>
<h4>Как мы делали langwhich.com и unique-shopper.com?</h4>
<p>Денис Пищенко, Дмитрий Одуло (Украина, Харьков)</p>
<h4>Symfony как платформа для open-source проектов (Sympal, Apostrophe, Diem)</h4>
<p>Александр Демченко (Украина, Харьков)</p>
<h4>Многоязычные сайты на Symfony. Проблемы и их решения</h4>
<p>Игорь Бровченко (Украина, Киев)</p>
<h4>Сontinuous Integration для Symfony</h4>
<p>Игорь Бровченко (Украина, Киев)</p>
<h4>LESS, SASS, HAML: 4 буквы, изменившие frontend development</h4>
<p>Константин Кудряшов (Белоруссия, Минск)</p>
<h4>Symfony Task – задачи батча (пакетной обработки). Как использовать, как улучшить</h4>
<p>Александр Безрученко (Россия, Таганрог)</p>
<h4>Кастомизация генераторов в Symfony 1.3/1.4. Эффективное управление функционалом и структурой плагинов</h4>
<p>Николай Зык (Украина, Киев)</p>
<h4>Философия сервисов. Практическое применение в Symfony 1.3/1.4</h4>
<p>Николай Зык (Украина, Киев)</p>
<h4>Symfony 2 – перезагрузка?</h4>
<p>Александр Демченко (Украина, Харьков)</p>
<h4>Этапы разработки реального проекта на Symfony 2 + Doctrine 2</h4>
<p>Александр Скорней (Украина, Киев)</p>
<h4>Внедрение компонента templating в существующий проект</h4>
<p>Станислав Сметанин (Россия, Ижевск)</p>
<p>Подробности и новости:</p>
<h4>Сайт конференции:</h4>
<p> <a href="http://symfonycamp.org.ua/" target="_blank">symfonycamp.org.ua</a></p>
<h4>Twitter:</h4>
<p> <a href="http://twitter.com/symfonycampua" target="_blank">@SymfonyCampUa</a></p>
<p>Если Вы находите возможным поддержать конференцию, можете связаться с <a href="http://symfonycamp.org.ua/contacts/" target="_blank">организаторами </a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/05/28/symfony-camp-ua-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

