<?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"
	>

<channel>
	<title>symfonybr</title>
	<atom:link href="http://www.symfonybr.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.symfonybr.com</link>
	<description>um framework bizarro</description>
	<pubDate>Wed, 06 Aug 2008 03:59:39 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Dinamizando conteúdo no symfony com slots</title>
		<link>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/</link>
		<comments>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/#comments</comments>
		<pubDate>Wed, 06 Aug 2008 03:59:39 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=36</guid>
		<description><![CDATA[	Em diversos casos precisamos completar nosso layout com mais de uma área dinâmica. Por exemplo, suponha uma situação em que nós precisamos ter as meta-tags diferentes para cada action executada. No nosso caso, nós teremos as meta-tags padrões e estaremos fazendo um override delas no template. A intenção é termos as meta-tags de description e [...]]]></description>
			<content:encoded><![CDATA[	<p>Em diversos casos precisamos completar nosso layout com mais de uma área dinâmica. Por exemplo, suponha uma situação em que nós precisamos ter as meta-tags diferentes para cada action executada. No nosso caso, nós teremos as meta-tags padrões e estaremos fazendo um override delas no template. A intenção é termos as meta-tags de <em>description</em> e <em>keywords</em> (nesse exemplo) dinâmicas. Sendo assim, cada página terá as keywords e descriptions respectivas. Isso é fundamental para motores de busca, <span class="caps">SEO</span>, etc..</p>

	<p>Para essa solução, utilizaremos o <strong>slot</strong>. Basicamente, slot é um lugar que você estará reservando para um conteúdo específico. Esse lugar pode ser definido no layout, template ou até em um partial. Está muito abstrato ainda, não é? Vou mostrar um exemplo.</p>

	<p>Podemos ter por exemplo no <strong>apps/APLICACAO/templates/layout.php</strong> algo assim:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&lt;html&gt;<br />

&lt;head&gt;<br />

&nbsp;<span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">&#40;</span>has_slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>: <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp;<span class="kw2">&lt;?php</span> include_slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;<span class="kw2">&lt;?php</span> <span class="kw1">endif</span>: <span class="kw2">?&gt;</span><br />

&lt;/head&gt;<br />

&nbsp;</div>

	<p>Dentro de um template, <strong>apps/APLICACAO/modules/faleconosco/indexSuccess.php</strong> poderíamos ter um código como esse:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">&lt;?php</span> slot<span class="br0">&#40;</span><span class="st0">&#8216;http_metas&#8217;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;&lt;meta name=<span class="st0">&quot;title&quot;</span> content=<span class="st0">&quot;Fale conosco&quot;</span> /&gt;<br />

&nbsp;&lt;meta name=<span class="st0">&quot;description&quot;</span> content=<span class="st0">&quot;Entre em contato conosco pelo formulário abaixo ou fale direto conosco pelo telefone xxxxx&quot;</span> /&gt;<br />

&nbsp;&lt;meta name=<span class="st0">&quot;keywords&quot;</span> content=<span class="st0">&quot;contato, telefone, etc, etc&quot;</span> /&gt;<br />

<span class="kw2">&lt;?php</span> end_slot<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp;</div>

	<p>Ou seja, quando o usuário acessar a action index do módulo faleconosco, as meta-tags dele serão essas citadas acima. É claro que esse é um exemplo muito simples.</p>

	<p>Isso pode ficar mais interessante pegando palavras-chave de um banco de dados, ou a descrição de um produto, artigo, etc.. É bom lembrar que a meta-tag de description tem um ideal de caracteres. Se não me engano é algo em torno de 200~300. Corrijam se estiver errado.</p>

	<p>Vale a pena lembrar que para setar os meta-tags não é obrigatório utilizar os slots. Eles podem ser setados direto na action <strong>apps/APLICACAO/modules/faleconosco/actions/actions.class.php</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">setTitle</span><span class="br0">&#40;</span><span class="st0">&#8216;My Title&#8217;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">addMeta</span><span class="br0">&#40;</span><span class="st0">&#8216;description&#8217;</span>,<span class="st0">&#8216;My Description&#8217;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$this</span>&#45;&gt;<span class="me1">getResponse</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">addMeta</span><span class="br0">&#40;</span><span class="st0">&#8216;keywords&#8217;</span>,<span class="st0">&#8216;My Keywords&#8217;</span><span class="br0">&#41;</span>;<br />

&nbsp;</div>

	<p>Esse foi só um exemplo da utilização dos slots. Eles possuem diversas outras utilidades para dinamizar conteúdos.</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/08/05/dinamizando-conteudo-no-symfony-com-slots/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Descompactando arquivos ZIP vindo de um form com symfony</title>
		<link>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/</link>
		<comments>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 14:23:46 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=47</guid>
		<description><![CDATA[	Nesse post vou mostrar como faço para tratar arquivos ZIP vindo de um formulário.

	Primeiramente, precisamos ter instalado a biblioteca zip. Para isso, podemos utilizar o comando abaixo:

 $ pecl install zip

	Suponhamos um formulário simples:



&#160; &#160; &#60;?php echo form_tag&#40;&#34;upload/do&#34; , &#34;method=post multipart=true&#34;&#41; ?&#62;

&#160; &#160; &#160; &#60;?php echo input_file_tag&#40;&#34;anexos&#34;&#41; ?&#62;

&#160; &#160; &#60;/form&#62;

&#160;

	Na action que irá tratar o [...]]]></description>
			<content:encoded><![CDATA[	<p>Nesse post vou mostrar como faço para tratar arquivos <span class="caps">ZIP</span> vindo de um formulário.</p>

	<p>Primeiramente, precisamos ter instalado a biblioteca zip. Para isso, podemos utilizar o comando abaixo:</p>

<div class="shell"> $ pecl install zip</div>

	<p>Suponhamos um formulário simples:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; <span class="kw2">&lt;?php</span> <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> form_tag<span class="br0">&#40;</span><span class="st0">&quot;upload/do&quot;</span> , <span class="st0">&quot;method=post multipart=true&quot;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> input_file_tag<span class="br0">&#40;</span><span class="st0">&quot;anexos&quot;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span><br />

&nbsp; &nbsp; &lt;/form&gt;<br />

&nbsp;</div>

	<p>Na action que irá tratar o formulário:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; <span class="re0">$phpFile</span> = sfContext::<span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getRequest</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getFile</span><span class="br0">&#40;</span><span class="st0">&#8216;anexos&#8217;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; <span class="re0">$zip</span> = <span class="kw2">new</span> ZipArchive<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="re0">$res</span> = <span class="re0">$zip</span>-&gt;<span class="me1">open</span><span class="br0">&#40;</span><span class="re0">$phpFile</span><span class="br0">&#91;</span><span class="st0">&quot;tmp_name&quot;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$res</span> === <span class="kw2">TRUE</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$zip</span>-&gt;<span class="me1">extractTo</span><span class="br0">&#40;</span>sfConfig::<span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#8216;sf_upload_dir&#8217;</span><span class="br0">&#41;</span>.<span class="st0">&#8216;/imagens/&#8217;</span><span class="br0">&#41;</span>; <span class="co1">// web/uploads/imagens</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$zip</span>-&gt;<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">// logar o erro onde preferir..</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// echo &#8216;failed, code:&#8217; . $res;</span><br />

&nbsp; &nbsp; <span class="br0">&#125;</span> <br />

&nbsp;</div>

	<p>Neste exemplo não estou considerando validação do tipo de arquivo, etc..</p>

	<p><strong>É obrigatório ter no formulário multipart=true senão não irá funcionar.</strong></p>

	<p>Valeeeeu! =)</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/28/descompactando-arquivos-zip-vindo-de-um-form-com-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Utilizando o rsync do symfony com parâmetros personalizados</title>
		<link>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/</link>
		<comments>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 16:47:56 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[producao]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=46</guid>
		<description><![CDATA[	Essa é uma dica legal que descobri a um tempo. Para aqueles que quiserem utilizar outras funçoes que o rsync oferece, segue abaixo um trecho de código.

	Editando o arquivo config/properties.ini:



&#91;producao&#93;

&#160; host=servidor

&#160; port=porta

&#160; user=usuario

&#160; dir=/diretorio

&#160; parameters=&#34;-azC &#8212;copy-links &#8212;exclude-from=config/rsync_exclude.txt &#8212;force &#8212;delete&#34; 

&#160;

	Através do &#8220;parameters&#8221; podemos passar os parâmetros manualmente.. Nesse caso adicionei o &#8212;copy-links

	Agora é mole

	 $ [...]]]></description>
			<content:encoded><![CDATA[	<p>Essa é uma dica legal que descobri a um tempo. Para aqueles que quiserem utilizar outras funçoes que o rsync oferece, segue abaixo um trecho de código.</p>

	<p>Editando o arquivo <strong>config/properties.ini</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="br0">&#91;</span>producao<span class="br0">&#93;</span><br />

&nbsp; host=servidor<br />

&nbsp; port=porta<br />

&nbsp; user=usuario<br />

&nbsp; <a href="http://www.php.net/dir"><span class="kw3">dir</span></a>=/diretorio<br />

&nbsp; parameters=<span class="st0">&quot;-azC &#8212;copy-links &#8212;exclude-from=config/rsync_exclude.txt &#8212;force &#8212;delete&quot;</span> <br />

&nbsp;</div>

	<p>Através do &#8220;parameters&#8221; podemos passar os parâmetros manualmente.. Nesse caso adicionei o &#8212;copy-links</p>

	<p>Agora é mole</p>

	<p><div class="shell"> $ symfony sync producao go </div><br />
Valeu!</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/22/utilizando-o-rsync-do-symfony-com-parametros-personalizados/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Utilizando um CSS específico para cada módulo do symfony</title>
		<link>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/</link>
		<comments>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/#comments</comments>
		<pubDate>Thu, 17 Jul 2008 18:02:05 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[css]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=48</guid>
		<description><![CDATA[	Essa é uma dica simples. Se você tem alguns módulos e quer ter um CSS para cada módulo, aqui vai uma linha que pode ser bastante útil.



&#160; &#60;?php use_stylesheet&#40;$sf_context-&#62;getModuleName&#40;&#41;&#41; ?&#62; &#160;

&#160;

	ciao! ]]></description>
			<content:encoded><![CDATA[	<p>Essa é uma dica simples. Se você tem alguns módulos e quer ter um <span class="caps">CSS</span> para cada módulo, aqui vai uma linha que pode ser bastante útil.</p>

<div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; <span class="kw2">&lt;?php</span> use_stylesheet<span class="br0">&#40;</span><span class="re0">$sf_context</span>-&gt;<span class="me1">getModuleName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw2">?&gt;</span> &nbsp;<br />

&nbsp;</div>

	<p>ciao! </p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/17/utilizando-um-css-especifico-para-cada-modulo-do-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Trabalhando com Symfony 1.1 e Doctrine</title>
		<link>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/</link>
		<comments>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 13:37:34 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[doctrine]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=44</guid>
		<description><![CDATA[	Quer experimentar o symfony 1.1? Primeiramente vamos ter que configurar um novo projeto e instalar o sfDoctrine para o symfony 1.1. Execute os comandos abaixo e continue lendo:

    $ mkdir symfony1.1Doctrine
    $ cd symfony1.1Doctrine
    $ /path/to/symfony generate:project symfony1.1Doctrine
    $ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin
 [...]]]></description>
			<content:encoded><![CDATA[	<p>Quer experimentar o symfony 1.1? Primeiramente vamos ter que configurar um novo projeto e instalar o sfDoctrine para o symfony 1.1. Execute os comandos abaixo e continue lendo:</p>

    <div class="shell">$ mkdir symfony1.1Doctrine</div>
    <div class="shell">$ cd symfony1.1Doctrine</div>
    <div class="shell">$ /path/to/symfony generate:project symfony1.1Doctrine</div>
    <div class="shell">$ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin/trunk plugins/sfDoctrinePlugin</div>
    <div class="shell">$ php symfony cc</div>

	<p>
Agora, digite o comando abaixo para listar tudo que o `sfDoctrinePlugin` oferece. Você vai perceber que o comando vai listar os mesmos comandos do `sfPropelPlugin` e muitos outros.</p>

    <div class="shell">$ php symfony list doctrine</div>
    <div class="shell">Available tasks for the &#8220;doctrine&#8221; namespace:</div>
    <div class="shell">  :build-all                   Generates Doctrine model, <span class="caps">SQL</span> and initializes the database (doctrine-build-all)</div>
    <div class="shell">  :build-all-load              Generates Doctrine model, <span class="caps">SQL</span>, initializes database, and load data (doctrine-build-all-load)</div>
    <div class="shell">  :build-all-reload            Generates Doctrine model, <span class="caps">SQL</span>, initializes database, and load data (doctrine-build-all-reload)</div>
    <div class="shell">  :build-all-reload-test-all   Generates Doctrine model, <span class="caps">SQL</span>, initializes database, load data and run all test suites (doctrine-build-all-reload-test-all)</div>
    <div class="shell">  :build-db                    Creates database for current model (doctrine-build-db)</div>
    <div class="shell">  :build-forms                 Creates form classes for the current model (doctrine-build-forms)</div>
    <div class="shell">  :build-model                 Creates classes for the current model (doctrine-build-model)</div>
    <div class="shell">  :build-schema                Creates a schema.xml from an existing database (doctrine-build-schema)</div>
    <div class="shell">  :build-sql                   Creates <span class="caps">SQL</span> for the current model (doctrine-build-sql)</div>
    <div class="shell">  :data-dump                   Dumps data to the fixtures directory (doctrine-dump-data)</div>
    <div class="shell">  :data-load                   Loads data from fixtures directory (doctrine-load-data)</div>
    <div class="shell">  :dql                         Execute a <span class="caps">DQL</span> query and view the results (doctrine-dql)</div>
    <div class="shell">  :drop-db                     Drops database for current model (doctrine-drop-db)</div>
    <div class="shell">  :generate-crud               Generates a Doctrine <span class="caps">CRUD</span> module (doctrine-generate-crud)</div>
    <div class="shell">  :generate-migration          Generate migration class (doctrine-generate-migration)</div>
    <div class="shell">  :generate-migrations-db      Generate migration classes from existing database connections (doctrine-generate-migrations-db, doctrine-gen-migrations-from-db)</div>
    <div class="shell">  :generate-migrations-models  Generate migration classes from an existing set of models (doctrine-generate-migrations-models, doctrine-gen-migrations-from-models)</div>
    <div class="shell">  :init-admin                  Initializes a Doctrine admin module (doctrine-init-admin)</div>
    <div class="shell">  :insert-sql                  Inserts <span class="caps">SQL</span> for current model (doctrine-insert-sql)</div>
    <div class="shell">  :migrate                     Migrates database to current/specified version (doctrine-migrate)</div>
    <div class="shell">  :rebuild-db                  Creates database for current model (doctrine-rebuild-db)</div>

	<p>
O `sfDoctrinePlugin` atualmente necessita de pelo menos uma aplicação configurada, então, vamos instanciar a aplicação `frontend`.</p>

    <div class="shell">$ php symfony generate:app frontend</div>

	<p>Agora vamos configurar nosso banco de dados em `config/databases.yml`. Abra o arquivo no seu editor predileto e utilize o <span class="caps">YAML</span> abaixo. Para esse teste, estamos simplesmente utilizando um banco de dados SQLite. O Doctrine é capaz de criar o banco de dados em `config/doctrine.db`. </p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; all:<br />

&nbsp; &nbsp; &nbsp; doctrine:<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: &nbsp; &nbsp;sfDoctrineDatabase<br />

&nbsp; &nbsp; &nbsp; &nbsp; param:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn: &nbsp; &nbsp;sqlite:<span class="co1">///&lt;?php echo dirname(__FILE__); ?&gt;/doctrine.db</span><br />

&nbsp; &nbsp;</div>

	<p>Agora que nós temos nosso banco de dados configurado, vamos definir nosso schema em `config/doctrine/schema.yml`. Nesse exemplo nós estamos configurando o modelo `BlogPost` que `hasMany` (possui diversas) , `Tags`.</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; &#8212;-<br />

&nbsp; &nbsp; BlogPost:<br />

&nbsp; &nbsp; &nbsp; actAs:<br />

&nbsp; &nbsp; &nbsp; &nbsp; Sluggable:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields: <span class="br0">&#91;</span>title<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; Timestampable:<br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; title: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; body: clob<br />

&nbsp; &nbsp; &nbsp; &nbsp; author: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; &nbsp; relations:<br />

&nbsp; &nbsp; &nbsp; &nbsp; Tags:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: Tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refClass: BlogPostTag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreignAlias: BlogPosts<br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; BlogPostTag:<br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; blog_post_id:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: integer<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; primary: <span class="kw2">true</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; tag_id:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: integer<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; primary: <span class="kw2">true</span><br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; Tag:<br />

&nbsp; &nbsp; &nbsp; actAs: <span class="br0">&#91;</span>Timestampable<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; columns:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: string<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp;</div>

	<p>Agora que nos temos nosso schema definido, vamos criar uma massa de teste em `data/fixtures/data.yml`. Abra o arquivo, e cole o <span class="caps">YAML</span> abaixo.</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; &#8212;-<br />

&nbsp; &nbsp; BlogPost:<br />

&nbsp; &nbsp; &nbsp; BlogPost_1:<br />

&nbsp; &nbsp; &nbsp; &nbsp; title: &nbsp;symfony + Doctrine<br />

&nbsp; &nbsp; &nbsp; &nbsp; body: &nbsp; symfony and Doctrine are great!<br />

&nbsp; &nbsp; &nbsp; &nbsp; author: Jonathan H. Wage<br />

&nbsp; &nbsp; &nbsp; &nbsp; Tags: &nbsp; <span class="br0">&#91;</span>symfony, doctrine, php<span class="br0">&#93;</span><br />

&nbsp; &nbsp; <br />

&nbsp; &nbsp; Tag:<br />

&nbsp; &nbsp; &nbsp; symfony:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: symfony<br />

&nbsp; &nbsp; &nbsp; doctrine:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: doctrine<br />

&nbsp; &nbsp; &nbsp; php:<br />

&nbsp; &nbsp; &nbsp; &nbsp; name: php<br />

&nbsp; &nbsp;</div>

	<p>Ok, vamos para parte legal. Nós temos nosso schema, e temos também nossa massa, então vamos rodar uma única fez o comando do Doctrine abaixo para criar nosso banco de dados, gerar os modelos, criar as tabelas e carregar a massa de teste.</p>

    <div class="shell">$ php symfony doctrine-build-all-reload frontend</div>
    <div class="shell">>> doctrine  Are you sure you wish to drop your databases? (y/n)</div>
    <div class="shell">y</div>
    <div class="shell">>> doctrine  Successfully dropped database f&#8230;1.1Doctrine/config/doctrine.db&#8221;</div>
    <div class="shell">>> doctrine  Successfully created database f&#8230;1.1Doctrine/config/doctrine.db&#8221;</div>
    <div class="shell">>> doctrine  Generated models successfully</div>
    <div class="shell">>> doctrine  Created tables successfully</div>
    <div class="shell">>> doctrine  Data was successfully loaded</div>

	<p>
Agora nosso banco de dados SQLite `doctrine.db` foi criado, todas as tabelas do nosso schema foram criadas e populadas. Agora vamos começar a brincar com os dados e ver como nós podemos utilizar o Doctrine Query Language para trazer as informações do banco.</p>

    <div class="shell">$ php symfony doctrine:dql frontend &#8220;<span class="caps">FROM</span> BlogPost p, p.Tags t&#8221;</div>
    <div class="shell">>> doctrine  executing: &#8220;<span class="caps">FROM</span> BlogPost p, p.Tags t&#8221; ()</div>
    <div class="shell">>> doctrine  &#8211; </div>
    <div class="shell">>> doctrine    id: 1</div>
    <div class="shell">>> doctrine    title: symfony + Doctrine</div>
    <div class="shell">>> doctrine    body: symfony and Doctrine are great!</div>
    <div class="shell">>> doctrine    author: Jonathan H. Wage</div>
    <div class="shell">>> doctrine    slug: symfony-doctrine</div>
    <div class="shell">>> doctrine    created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine    updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine    Tags: </div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 1</div>
    <div class="shell">>> doctrine        name: symfony</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 2</div>
    <div class="shell">>> doctrine        name: doctrine</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine      &#8211; </div>
    <div class="shell">>> doctrine        id: 3</div>
    <div class="shell">>> doctrine        name: php</div>
    <div class="shell">>> doctrine        created_at: 2008-06-16 12:28:57</div>
    <div class="shell">>> doctrine        updated_at: 2008-06-16 12:28:57</div>
    </div>

	<p>Agora, vamos explicar um pouco os resultados obtidos. Como você pode ver, nos modelos nós temos as colunas created_at, updated_at and slug que não foram definidas no schema. Essas colunas são adicionadas pelo behavior anexado ao schema dentro da configuração actAs. As colunas `created_at` e `updated_at` são automaticamente atualizadas `onInsert` e `onUpdate`, e a coluna do slug é uma string criada baseada na coluna name para ser utilizada na url(url amigável). O Doctrine tem alguns behaviors que são incluídos no core como `Sluggable` e `Timestampable`, mas o sistema de behavior é feito para permitir que qualquer pessoa escreva novos behaviors para os modelos e serem reutilizados.</p>

	<p>Agora que nós temos nossa base configurada e populada, vamos fazer alguns testes utilizando o admin generator para manipular os posts e tags do blog.</p>

    <div class="shell">$ php symfony doctrine:init-admin frontend blog_posts BlogPost</div>
    <div class="shell">$ php symfony doctrine:init-admin frontend tags Tag</div>

	<p><strong>Nota</strong><br />
> Os templates do admin generator para `sfDoctrinePlugin` ainda não foram totalmente atualizados para o symfony 1.1, então vamos precisar ativar a opção `compat_10` em `apps/frontend/config/settings.yml`. Eles vão ser atualizados antes do lançamento da versão estável do symfony 1.1.</p>

	<p>Agora vamos abrir nosso browser e verificar a aplicação `frontend` e os módulos `blog_posts` e `tags`. Eles devem ser localizados numas urls parecida com essas</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; http:<span class="co1">//localhost/symfony1.1Doctrine/web/frontend_dev.php/blog_posts</span><br />

&nbsp; &nbsp; http:<span class="co1">//localhost/symfony1.1Doctrine/web/frontend_dev.php/tags</span><br />

&nbsp; &nbsp;</div>

	<p><img src='http://www.symfony-project.org/uploads/assets/doctrine/blog_posts.gif' alt='' class='alignnone' /></p>

	<p>Agora, com um pouco de configuração no admin generator do blog_post, nós podemos controlar o relacionamento entre blog_post e tags marcando checkboxes quando editando um post. Abra o arquivo `apps/frontend/modules/blog_posts/config/generator.yml` e troque o conteúdo pelo <span class="caps">YAML</span> abaixo:</p>

    <div class="dean_ch" style="white-space: wrap;"><br />

&nbsp; &nbsp; generator:<br />

&nbsp; &nbsp; &nbsp; <span class="kw2">class</span>: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sfDoctrineAdminGenerator<br />

&nbsp; &nbsp; &nbsp; param:<br />

&nbsp; &nbsp; &nbsp; &nbsp; model_class: &nbsp; &nbsp; &nbsp;BlogPost<br />

&nbsp; &nbsp; &nbsp; &nbsp; theme: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">default</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/list"><span class="kw3">list</span></a>:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display: &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>=title, author<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; object_actions:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _edit: &nbsp; &nbsp; &nbsp; &nbsp;-<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _delete: &nbsp; &nbsp; &nbsp;-<br />

&nbsp; &nbsp; &nbsp; &nbsp; edit:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; display: &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>author, title, body, Tags<span class="br0">&#93;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; author:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; input_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; input_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; body:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; textarea_tag<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params: &nbsp; &nbsp; size=50&#215;10<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tags:<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; type: &nbsp; &nbsp; &nbsp; doctrine_admin_check_list<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; params: &nbsp; &nbsp; through_class=BlogPostTag<br />

<br />

&nbsp; &nbsp;</div>

	<p>Agora atualize (f5) seu browser para listar os posts do blog. Você vai ver tudo de uma maneira mais limpa. Edite um post clicando no ícone ou no título. Veja abaixo como você pode marcar as tags associadas ao post.</p>

	<p><img src='http://www.symfony-project.org/uploads/assets/doctrine/edit_blog_post.gif' alt='' class='alignnone' /></p>

	<p>99% das ferramentas que você vê funcionando no Propel, você pode ver também no Doctrine. Então, é fácil entender e aplicar. O sfDoctrinePlugin implementa todas as funcionalidades que o sfPropelPlugin e algumas mais. Nos links abaixo você pode obter mais informação sobre o que o Doctrine suporta.</p>

<ul>
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=plugins">Behaviors</a> &#8211; Easily create reusable behaviors for your Doctrine models. 
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=migration">Migrations</a> &#8211; Deploy database schema changes to your production environment through a programmatic interface.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=dql-doctrine-query-language">Doctrine Query Language</a> &#8211; Build your database queries through a fluent OO interface  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=basic-schema-mapping#constraints-and-validators">Validators</a>  &#8211; Turn on column validators for both database and code level validation.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=hierarchical-data">Hierarchical Data</a> &#8211; Turn your models in to nested sets easily with the flip of a switch.  
 <li> <a href="http://www.phpdoctrine.org/documentation/manual/0_11?chapter=caching">Caching</a> &#8211; Tune performance by caching your <span class="caps">DQL</span> query parsing and the result sets of queries.
</ul>

	<p>Se esse pequeno tutorial despertou seu interesse no Doctrine, você pode encontrar mais informações do Doctrine abaixo e aprender um pouco mais sobre ele:</p>

<ul>
 <li><a href="http://www.phpdoctrine.org/documentation/manual/0_11?one-page">Full User Manual</a> </li>
 <li><a href="http://www.phpdoctrine.org/documentation/api/0_11"><span class="caps">API</span> Documentation</a>           </li>
 <li><a href="http://www.phpdoctrine.org/Doctrine-Cheat-Sheet.pdf">Cheatsheet</a>       </li>      
 <li><a href="http://www.phpdoctrine.org/blog">Blog</a>  </li>
 <li><a href="http://www.phpdoctrine.org/community">Community</a>  </li>
 <li><a href="http://www.phpdoctrine.org/faq">Frequently Asked Questions</a>  </li>
 <li><a href="http://www.phpdoctrine.org/download">Download</a> </li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/15/trabalhando-com-symfony-11-e-doctrine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gerando feeds rss com sfFeed2Plugin</title>
		<link>http://www.symfonybr.com/2008/07/08/gerando-feeds-rss-com-sffeed2plugin/</link>
		<comments>http://www.symfonybr.com/2008/07/08/gerando-feeds-rss-com-sffeed2plugin/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 13:03:05 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[RSS]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=40</guid>
		<description><![CDATA[	Vou mostrar nesse post uma maneira que utilizo para gerar RSS de notícias publicadas.

	Primeiramente, precisamos ter instalado o plugin sfFeed2Plugin
symfony plugin-install http://plugins.symfony-project.com/sfFeed2Plugin

	Considere um schema.yml parecido com esse


propel:

&#160; artigo:

&#160; &#160; _attributes: &#123; Artigo &#125;

&#160; &#160; id:

&#160; &#160; titulo: &#160; &#160; varchar&#40;200&#41;

&#160; &#160; data: &#160; &#160; &#160;date

&#160; &#160; resumo: &#160; &#160;varchar&#40;200&#41;

&#160; &#160; texto: &#160; &#160; longvarchar

&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[	<p>Vou mostrar nesse post uma maneira que utilizo para gerar <span class="caps">RSS</span> de notícias publicadas.</p>

	<p>Primeiramente, precisamos ter instalado o plugin <a href="http://trac.symfony-project.org/wiki/sfFeed2Plugin">sfFeed2Plugin</a><br />
<div class="shell">symfony plugin-install http://plugins.symfony-project.com/sfFeed2Plugin</div></p>

	<p>Considere um <strong>schema.yml</strong> parecido com esse<br />
<div class="dean_ch" style="white-space: wrap;"><br />

propel:<br />

&nbsp; artigo:<br />

&nbsp; &nbsp; _attributes: <span class="br0">&#123;</span> Artigo <span class="br0">&#125;</span><br />

&nbsp; &nbsp; id:<br />

&nbsp; &nbsp; titulo: &nbsp; &nbsp; varchar<span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; data: &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/date"><span class="kw3">date</span></a><br />

&nbsp; &nbsp; resumo: &nbsp; &nbsp;varchar<span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; texto: &nbsp; &nbsp; longvarchar<br />

&nbsp; &nbsp; &#8230;<br />

&nbsp;</div></p>

	<p>Estou usando também uma rota para os links de noticias. O <strong>apps/APLICACAO/config/routings.yml</strong> precisa ser configurado para isso. Essa rota será utilizada no link para o artigo.<br />
<div class="dean_ch" style="white-space: wrap;"><br />

noticiaver:<br />

&nbsp; url: /noticia/:id<br />

&nbsp; param: <span class="br0">&#123;</span> module: noticias , action: ver <span class="br0">&#125;</span><br />

&nbsp;</div></p>

	<p>Dentro do módulo <strong>noticias</strong>, vamos adicionar no <strong>apps/APLICACAO/modules/noticias/actions/actions.class.php</strong></p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">public</span> <span class="kw2">function</span> executeRss<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; <span class="re0">$feed</span> = <span class="kw2">new</span> sfAtom1Feed<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; &nbsp; <span class="re0">$feed</span>-&gt;<span class="me1">initialize</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;title&#8217;</span> &nbsp; &nbsp; &nbsp; =&gt; <span class="st0">&#8216;<span class="caps">RSS</span> &#8211; Notícias&#8217;</span>,<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;link&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp;=&gt; <span class="st0">&#8216;http://www.link-do-titulo-do-rss.com.br/&#8217;</span><br />

&nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; &nbsp; <span class="co1">// selecionando os artigos de 5 em 5</span><br />

&nbsp; &nbsp; &nbsp; <span class="re0">$c</span> = <span class="kw2">new</span> Criteria;<br />

&nbsp; &nbsp; &nbsp; <span class="re0">$c</span>-&gt;<span class="me1">addDescendingOrderByColumn</span><span class="br0">&#40;</span>ArtigoPeer::<span class="me2">DATA</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; <span class="re0">$c</span>-&gt;<span class="me1">setLimit</span><span class="br0">&#40;</span><span class="nu0">5</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; <span class="re0">$artigos</span> = ArtigoPeer::<span class="me2">doSelect</span><span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$artigos</span> <span class="kw1">as</span> <span class="re0">$artigo</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$item</span> = <span class="kw2">new</span> sfFeedItem<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$item</span>-&gt;<span class="me1">initialize</span><span class="br0">&#40;</span><a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;title&#8217;</span> &nbsp; &nbsp; &nbsp; =&gt; <span class="re0">$artigo</span>-&gt;<span class="me1">getTitulo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;link&#8217;</span> &nbsp; &nbsp; &nbsp; &nbsp;=&gt; <span class="st0">&#8216;@noticiaver?id=&#8217;</span>.<span class="re0">$artigo</span>-&gt;<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, &nbsp; &nbsp; &nbsp; &nbsp; <br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;pubDate&#8217;</span> &nbsp; &nbsp; =&gt; <span class="re0">$artigo</span>-&gt;<span class="me1">getData</span><span class="br0">&#40;</span><span class="st0">&quot;U&quot;</span><span class="br0">&#41;</span>,<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;uniqueId&#8217;</span> &nbsp; &nbsp;=&gt; <span class="re0">$artigo</span>-&gt;<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<br />

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;description&#8217;</span> =&gt; <span class="re0">$artigo</span>-&gt;<span class="me1">getResumo</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$feed</span>-&gt;<span class="me1">addItem</span><span class="br0">&#40;</span><span class="re0">$item</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />

&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">feed</span> = <span class="re0">$feed</span>;<br />

&nbsp; &nbsp; &nbsp; <span class="re0">$this</span>-&gt;<span class="me1">setLayout</span><span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;<br />

&nbsp; <span class="br0">&#125;</span><br />

&nbsp;</div>

	<p>No template <strong>apps/APLICACAO/modules/noticias/templates/rssSuccess.php</strong> precisamos ter somente</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">&lt;?php</span><br />

decorate_with<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;<br />

<a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$feed</span>-&gt;<span class="me1">asXml</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp;</div>

	<p>Pronto. Você terá o <span class="caps">RSS</span> das notícias em um endereço parecido com esse, <strong>www.seusite.com.br/noticias/rss</strong>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/08/gerando-feeds-rss-com-sffeed2plugin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Instalando plugins no symfony 1.1</title>
		<link>http://www.symfonybr.com/2008/07/04/instalando-plugins-no-symfony-11/</link>
		<comments>http://www.symfonybr.com/2008/07/04/instalando-plugins-no-symfony-11/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 15:28:29 +0000</pubDate>
		<dc:creator>Bernardo</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=41</guid>
		<description><![CDATA[	No symfony 1.1, o sistema de plugins foi totalmente reescrito. Isto vai permitir melhoras no modo de trabalho e facilitar o uso no seu projeto.

	Instalando um plugin

	Para instalar plugins de um channel padrão (o oficial do symfony), não é mais necessário usar a URL toda. Basta:

$ php symfony plugin:install sfGuardPlugin

	Isto irá instalar o plugin sfGuardPlugin. [...]]]></description>
			<content:encoded><![CDATA[	<p>No symfony 1.1, o sistema de plugins foi totalmente reescrito. Isto vai permitir melhoras no modo de trabalho e facilitar o uso no seu projeto.</p>

	<p><strong>Instalando um plugin</strong></p>

	<p>Para instalar plugins de um channel padrão (o oficial do symfony), não é mais necessário usar a <span class="caps">URL</span> toda. Basta:</p>

<div class="shell">$ php symfony plugin:install sfGuardPlugin</div>

	<p>Isto irá instalar o plugin sfGuardPlugin. Entretanto, há mais opções disponíveis:</p>

<div class="shell">$ php symfony plugin:install &#8212;stability=beta sfGuardPlugin</div>

	<p>Ele irá instalar a versão beta do plugin no seu projeto, o que é útil se você quiser testar uma versão mais recente, mas não é recomendável pois é uma versão non-stable (instável).</p>

	<p>Você pode também especificar qual versão do plugin quer instalar:</p>

<div class="shell">$ php symfony plugin:install &#8212;release=1.0.0 sfGuardPlugin</div>

	<p>Ele irá instalar a versão 1.0.0 do plugin.</p>

	<p>Vários plugins são dependentes de outros para funcionar completamente. No symfony 1.0, você tinha que instalar uma série de plugins antes de poder instalar o plugin de sua escolha. No symfony 1.1, basta você digitar o comando a seguir, que irá instalar o plugin e suas dependências:</p>

<div class="shell">$ php symfony plugin-install install-deps sfGuardPlugin</div>

	<p>Outra melhoria, graças à utilização de canais <span class="caps">PEAR</span> é a capacidade de utilização de diversos canais (channels) diferentes.<br />
Por padrão, o symfony usa o channel oficial (plugins.symfony-project.org) que vai pelo nome de symfony-plugins (não precisa especificar na instalação do plugin). Para usar outros, primeiro adicione um novo:</p>

<div class="shell">$ php symfony plugin:add-channel custom-channel.example.com</div>

	<p>Agora você pode instalar plugins vindo deste canal especificando na instalação:</p>

<div class="shell">$ php symfony plugin:install &#8212;channel=custom-channel.example.com sfGuardPlugin</div>

	<p>Para saber mais parâmetros utilize o help:</p>

<div class="shell">$ php symfony help plugin:install</div>

	<p>Também é possível fazer uma referência direta ao plugin que quer instalar, tanto usando a <span class="caps">URL</span> completa como um caminho local:</p>

<div class="shell">$ php symfony plugin:install http://www.example.com/sfGuardPlugin-1.0.0.tgz</div>

	<p>ou</p>

<div class="shell">$ php symfony plugin:install /home/stefan/plugins/sfGuardPlugin-1.0.0.tgz</div>

	<p><strong>Desinstalando um plugin</strong></p>

	<p>Para desinstalar um plugin do seu projeto continua fácil. Um simples comando fará o truque:</p>

<div class="shell">$ php symfony plugin:uninstall sfGuardPlugin</div>

	<p>Para desinstalar um plugin vindo de outro canal (channel), você precisa especificá-lo:</p>

<div class="shell">$ php symfony plugin:uninstall &#8212;channel=custom-channel.example.com sfGuardPlugin</div>

	<p>Para saber qual canal o plugin está instalado, use o plugin:list.</p>

	<p><strong>Atualizando um plugin</strong></p>

	<p>Também é muito simples. Basta o comando a seguir, e seu plugin estará com a última versão:</p>

<div class="shell">$ php symfony plugin:upgrade sfGuardPlugin</div>

	<p>Os parâmetros &#8212;stability, &#8212;release e &#8212;channel, também está disponível para esta tarefa e é aplicada do mesmo modo.</p>

	<p><strong>Listando os plugins instalados</strong></p>

	<p>A tarefa mais fácil de todas é listar os plugins instalados. Para isso, basta o comando:</p>

<div class="shell">$ php symfony plugin:list</div>

	<p>Este comando não tem parâmetros.</p>

	<p>Como você pode ver, a reescrita do sistema de plugins está mais poderosa e permite um gerenciamento mais fácil dos plugins. </p>

	<p>&#8212;</p>

	<p>Tutorial em <a href="http://www.symfony-project.org/blog/2008/06/20/how-to-work-with-plugins-in-symfony-1-1">inglês</a></p>

	<p>Até mais.</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/04/instalando-plugins-no-symfony-11/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Enviando uma newsletter com Swift e Symfony</title>
		<link>http://www.symfonybr.com/2008/07/02/enviando-uma-newsletter-com-swift-e-symfony/</link>
		<comments>http://www.symfonybr.com/2008/07/02/enviando-uma-newsletter-com-swift-e-symfony/#comments</comments>
		<pubDate>Wed, 02 Jul 2008 18:26:14 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[swift]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=28</guid>
		<description><![CDATA[	Olá! Nesse post vou mostrar uma maneira que utilizei para disparar uma newsletter com o Symfony utilizando o Swift . Atualmente esse processo funciona comigo para uma listagem de aprox. 10.000 emails.

	Primeiramente, é preciso ter o Swift instalado. Eu utilizei o plugin sfSwiftPlugin

	symfony plugin-install http://plugins.symfony-project.com/sfSwiftPlugin 
Acesse a página do plugin para fazer os ajustes necessários

	Com [...]]]></description>
			<content:encoded><![CDATA[	<p>Olá! Nesse post vou mostrar uma maneira que utilizei para disparar uma newsletter com o Symfony utilizando o <a href="http://swiftmailer.org">Swift</a> . Atualmente esse processo funciona comigo para uma listagem de aprox. 10.000 emails.</p>

	<p>Primeiramente, é preciso ter o Swift instalado. Eu utilizei o plugin <a href="http://trac.symfony-project.com/wiki/sfSwiftPlugin">sfSwiftPlugin</a></p>

	<p><div class="shell">symfony plugin-install http://plugins.symfony-project.com/sfSwiftPlugin </div><br />
Acesse a página do plugin para fazer os ajustes necessários</p>

	<p>Com base num <strong>schema.yml</strong>:<br />
<div class="dean_ch" style="white-space: wrap;"><br />

propel:<br />

&nbsp; newsletter:<br />

&nbsp; &nbsp; _attributes: &nbsp;<span class="br0">&#123;</span> phpName: Newsletter <span class="br0">&#125;</span><br />

&nbsp; &nbsp; id:<br />

&nbsp; &nbsp; nome: &nbsp; &nbsp; &nbsp; &nbsp; varchar<span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; email: &nbsp; &nbsp; &nbsp; &nbsp;varchar<span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span><br />

&nbsp; &nbsp; ativo: &nbsp; &nbsp; &nbsp; &nbsp;boolean<br />

&nbsp; &nbsp; created_at:<br />

&nbsp;</div></p>

	<p>Geramos os modelos:<br />
<div class="shell">$ symfony propel-build-all</div></p>

	<p>Vamos criar um <em>batch</em> que irá enviar nossa newsletter. Esse comando gera o arquivo <strong>`batch/newsletter.php`</strong><br />
<div class="shell">$ symfony init-batch default newsletter frontend</div></p>

	<p>Vamos editar o <strong>`batch/newsletter.php`</strong><br />
<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">&lt;?php</span><br />

<br />

<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&#8216;SF_ROOT_DIR&#8217;</span>, &nbsp; &nbsp;<a href="http://www.php.net/realpath"><span class="kw3">realpath</span></a><span class="br0">&#40;</span><a href="http://www.php.net/dirname"><span class="kw3">dirname</span></a><span class="br0">&#40;</span><span class="kw2"><i>file</i></span><span class="br0">&#41;</span>.<span class="st0">&#8216;/..&#8217;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&#8216;SF_APP&#8217;</span>, &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;frontend&#8217;</span><span class="br0">&#41;</span>;<br />

<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&#8216;SF_ENVIRONMENT&#8217;</span>, <span class="st0">&#8216;prod&#8217;</span><span class="br0">&#41;</span>; <span class="co1">// eu uso em prod.. por default vem dev</span><br />

<a href="http://www.php.net/define"><span class="kw3">define</span></a><span class="br0">&#40;</span><span class="st0">&#8216;SF_DEBUG&#8217;</span>, &nbsp; &nbsp; &nbsp; <span class="nu0">1</span><span class="br0">&#41;</span>;<br />

<br />

<span class="kw1">require_once</span><span class="br0">&#40;</span>SF_ROOT_DIR.DIRECTORY_SEPARATOR.<span class="st0">&#8216;apps&#8217;</span>.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.<span class="st0">&#8216;config&#8217;</span>.DIRECTORY_SEPARATOR.<span class="st0">&#8216;config.php&#8217;</span><span class="br0">&#41;</span>;<br />

<br />

<span class="co1">// initialize database manager</span><br />

<span class="re0">$databaseManager</span> = <span class="kw2">new</span> sfDatabaseManager<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$databaseManager</span>-&gt;<span class="me1">initialize</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<br />

<span class="co1">// batch process here</span><br />

<br />

<span class="re0">$body</span> = <span class="st0">&quot;Conteúdo do email&#8230;&quot;</span>;<br />

<br />

<span class="re0">$smtp</span> = <span class="kw2">new</span> Swift_Connection_SMTP<span class="br0">&#40;</span><span class="st0">&quot;mail.servidor.com&quot;</span>, <span class="nu0">25</span><span class="br0">&#41;</span>;<br />

<span class="re0">$smtp</span>-&gt;<span class="me1">setUsername</span><span class="br0">&#40;</span><span class="st0">&quot;email@servidor.com&quot;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$smtp</span>-&gt;<span class="me1">setpassword</span><span class="br0">&#40;</span><span class="st0">&quot;senha&quot;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$smtp</span>-&gt;<span class="me1">setTimeout</span><span class="br0">&#40;</span><span class="nu0">60</span><span class="br0">&#41;</span>;<br />

<span class="re0">$swift</span> = <span class="kw2">new</span> Swift<span class="br0">&#40;</span><span class="re0">$smtp</span><span class="br0">&#41;</span>;<br />

<br />

<span class="re0">$message</span> = <span class="kw2">new</span> Swift_Message<span class="br0">&#40;</span><span class="st0">&quot;Título da Newsletter&quot;</span>, <span class="re0">$body</span> , <span class="st0">&quot;text/html&quot;</span> , <span class="st0">&quot;utf-8&quot;</span><span class="br0">&#41;</span>; &nbsp; &nbsp; &nbsp; &nbsp;<br />

<span class="re0">$message</span>-&gt;<span class="me1">setReturnPath</span><span class="br0">&#40;</span><span class="st0">&quot;bounces@servidor.com&quot;</span><span class="br0">&#41;</span>; <span class="co1">// o return-path é bom para pegar os bounces</span><br />

<br />

<span class="co1">// criamos a lista de emails que receberão a newsletter</span><br />

<span class="re0">$recipients</span> = <span class="kw2">new</span> Swift_RecipientList<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<br />

<span class="co1">// selecionando todos os assinantes ativos</span><br />

<span class="re0">$c</span> = <span class="kw2">new</span> Criteria<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<span class="re0">$c</span>-&gt;<span class="me1">add</span><span class="br0">&#40;</span>NewsletterPeer::<span class="me2">ATIVO</span> , <span class="kw2">true</span><span class="br0">&#41;</span>;<br />

<span class="re0">$assinantes</span> = NewsletterPeer::<span class="me2">doSelect</span><span class="br0">&#40;</span><span class="re0">$c</span><span class="br0">&#41;</span>;<br />

<br />

<span class="co1">// preenchendo a lista de recipientes</span><br />

<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$assinantes</span> <span class="kw1">as</span> <span class="re0">$assinante</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; <span class="re0">$recipients</span>&#45;&gt;<span class="me1">addTo</span><span class="br0">&#40;</span><span class="re0">$assinante</span>&#45;&gt;<span class="me1">getEmail</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

<span class="br0">&#125;</span><br />

<br />

<span class="co1">// esse plugin do Swift é muito util</span><br />

<span class="re0">$swift</span>-&gt;<span class="me1">attachPlugin</span><span class="br0">&#40;</span><span class="kw2">new</span> Swift_Plugin_AntiFlood<span class="br0">&#40;</span><span class="nu0">200</span><span class="br0">&#41;</span>, <span class="st0">&quot;anti-flood&quot;</span><span class="br0">&#41;</span>; <br />

<br />

<span class="re0">$batch</span> = <span class="kw2">new</span> Swift_BatchMailer<span class="br0">&#40;</span><span class="re0">$swift</span><span class="br0">&#41;</span>;<br />

<span class="re0">$batch</span>-&gt;<span class="me1">setMaxTries</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>; <span class="co1">// nmro max de tentativas</span><br />

<span class="re0">$batch</span>-&gt;<span class="me1">setMaxSuccessiveFailures</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>; <span class="co1">// nmro max de falhas</span><br />

<br />

<span class="re0">$batch</span>-&gt;<span class="me1">send</span><span class="br0">&#40;</span><span class="re0">$message</span>, <span class="re0">$recipients</span>, <span class="kw2">new</span> Swift_Address<span class="br0">&#40;</span><span class="st0">&quot;email_from@servidor.com&quot;</span> , <span class="st0">&quot;Título Newsletter&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; &nbsp; <br />

<br />

<span class="re0">$swift</span>-&gt;<span class="me1">disconnect</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></p>

	<p>Para fazer o envio execute o arquivo dentro da pasta `batch/`<br />
<div class="shell">$ php newsletter.php</div></p>

	<p>Se você for fazer um disparo que leve muito tempo, é aconselhável colocar o script para ser executado em background com <a href="http://www.oreillynet.com/linux/cmd/cmd.csp?path=b/batch">batch</a> ou <a href="http://www.oreillynet.com/linux/cmd/cmd.csp?path=a/at">at</a><br />
<div class="shell">$ at -f php newsletter.php now</div></p>

	<p>Em um post futuro eu mostro como fazer tudo isso sem utilizar linha de comando, ou seja executar uma action via web para executar o script e/ou colocar em background <strong>at</strong>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/07/02/enviando-uma-newsletter-com-swift-e-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>As 20 funções mais utilizadas no Symfony</title>
		<link>http://www.symfonybr.com/2008/06/27/as-20-funcoes-mais-utilizadas-no-symfony/</link>
		<comments>http://www.symfonybr.com/2008/06/27/as-20-funcoes-mais-utilizadas-no-symfony/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 12:38:46 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=35</guid>
		<description><![CDATA[	Um site japonês elaborou uma estatística interessante sobre as funções mais utilizadas no código fonte dos frameworks para PHP.

	No caso do Symfony, as 20 funções PHP mais utilizadas são:

	
		array (3.534 vezes)
		isset (1.083 vezes)
		sprintf (729 vezes)
		count (515 vezes)
		substr (372 vezes)
		strlen (256 vezes)
		is_null (230 vezes)
		is_array (229 vezes)
		dirname (218 vezes)
		empty (213 vezes)
		strpos (204 vezes)
		unset (201 vezes)
		array_merge (198 vezes)
		in_array [...]]]></description>
			<content:encoded><![CDATA[	<p>Um site japonês elaborou uma estatística interessante sobre as funções mais utilizadas no código fonte dos frameworks para <span class="caps">PHP</span>.</p>

	<p>No caso do <strong>Symfony</strong>, as 20 funções <span class="caps">PHP</span> mais utilizadas são:</p>

	<ul>
		<li>array (3.534 vezes)</li>
		<li>isset (1.083 vezes)</li>
		<li>sprintf (729 vezes)</li>
		<li>count (515 vezes)</li>
		<li>substr (372 vezes)</li>
		<li>strlen (256 vezes)</li>
		<li>is_null (230 vezes)</li>
		<li>is_array (229 vezes)</li>
		<li>dirname (218 vezes)</li>
		<li>empty (213 vezes)</li>
		<li>strpos (204 vezes)</li>
		<li>unset (201 vezes)</li>
		<li>array_merge (198 vezes)</li>
		<li>in_array (164 vezes)</li>
		<li>str_replace (156 vezes)</li>
		<li>strtolower (155 vezes)</li>
		<li>preg_match (150 vezes)</li>
		<li>date (134 vezes)</li>
		<li>implode (133 vezes)</li>
	</ul>
	<ul>
		<li>preg_replace (124 vezes)</li>
	</ul>

	<p>No caso do <strong>CakePHP</strong> as 5 mais utilizadas são:</p>

	<ul>
		<li>array (16.645 vezes)</li>
		<li>in_array (1.519 vezes)</li>
		<li>isset (1.151 vezes)</li>
		<li>empty (889 vezes)</li>
	</ul>
	<ul>
		<li>is_array (486 vezes)</li>
	</ul>

	<p>A cinco mais utilizadas pelo <strong>Zend Framework</strong> são:</p>

	<ul>
		<li>array (8.686 vezes)</li>
		<li>isset (1.528 vezes)</li>
		<li>couny (1.407 vezes)</li>
		<li>dirname (999 vezes)</li>
	</ul>
	<ul>
		<li>is_array (789 vezes)</li>
	</ul>

	<p>Esses resultados devem ter vindo a partir de alguns grep`s nas pastas <em>core</em> dos frameworks&#8230;</p>

	<p>Tendo em vista os resultados, se nas próximas versões do <span class="caps">PHP</span> tivermos rendimentos nas funções array() e isset(), consequentemente a performance desses frameworks e aplicações tendem a melhorar.</p>

	<p>Ref: <a href="http://www.symfony.es/2008/06/18/las-20-funciones-php-mas-utilizadas-por-symfony">http://www.symfony.es/2008/06/18/las-20-funciones-php-mas-utilizadas-por-symfony</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/06/27/as-20-funcoes-mais-utilizadas-no-symfony/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gerenciando aplicações em produção (Profiling production)</title>
		<link>http://www.symfonybr.com/2008/06/20/gerenciando-aplicacoes-em-producao-profiling-production/</link>
		<comments>http://www.symfonybr.com/2008/06/20/gerenciando-aplicacoes-em-producao-profiling-production/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 23:41:54 +0000</pubDate>
		<dc:creator>pedro</dc:creator>
		
		<category><![CDATA[log]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[producao]]></category>

		<category><![CDATA[symfony]]></category>

		<category><![CDATA[yml]]></category>

		<guid isPermaLink="false">http://www.symfonybr.com/?p=27</guid>
		<description><![CDATA[	Neste post irei mostrar como fazer para ter um feedback automático das aplicações quando elas já estiverem em produção. A intenção é detectar anormalidades na execução de um script e/ou saber um pouco mais do andamento da aplicação. Neste caso é estabelecido um tempo máximo para a execução de uma action, caso ela demore mais [...]]]></description>
			<content:encoded><![CDATA[	<p>Neste post irei mostrar como fazer para ter um feedback automático das aplicações quando elas já estiverem em produção. A intenção é detectar anormalidades na execução de um script e/ou saber um pouco mais do andamento da aplicação. Neste caso é estabelecido um tempo máximo para a execução de uma action, caso ela demore mais que esse tempo, um email é enviado para o administrador e um arquivo de log específico é criado.</p>

	<p>Para executar essa tarefa vamos utilizar os <strong>filters</strong> do symfony.<br />
Por padrão o tempo de execução é de 200ms, mas isso pode ser configurado no arquivo <strong>app.yml</strong></p>

	<p>Vamos criar o arquivo <strong>app.yml</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

all:<br />

&nbsp; log_slow_requests:<br />

&nbsp; &nbsp; status: on<br />

&nbsp; &nbsp; tempo: <span class="nu0">200</span> <br />

&nbsp;</div>

	<p>Vamos criar o arquivo <strong>logSlowRequestsFilter.php</strong> na pasta <strong>lib/</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

<span class="kw2">&lt;?php</span><br />

<span class="kw2">class</span> myFilter <span class="kw2">extends</span> sfFilter<br />

<span class="br0">&#123;</span><br />

&nbsp; <span class="kw2">public</span> <span class="kw2">function</span> execute <span class="br0">&#40;</span><span class="re0">$filterChain</span><span class="br0">&#41;</span><br />

&nbsp; <span class="br0">&#123;</span><br />

&nbsp; &nbsp; <span class="re0">$timer</span> = sfTimerManager::<span class="me2">getTimer</span><span class="br0">&#40;</span><span class="st0">&#8216;slow_request&#8217;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="re0">$filterChain</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; <span class="co1">// pegamos o tempo de execucao</span><br />

&nbsp; &nbsp; <span class="re0">$elapsedTimeMs</span> = <span class="re0">$timer</span>-&gt;<span class="me1">getElapsedTime</span><span class="br0">&#40;</span><span class="br0">&#41;</span> * <span class="nu0">1000</span>;<br />

<br />

&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$elapsedTimeMs</span> &gt;= sfConfig::<span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#8216;app_log_slow_requests_tempo&#8217;</span>, <span class="nu0">200</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &amp;&amp; <span class="br0">&#40;</span>sfConfig::<span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#8216;app_log_slow_requests_status&#8217;</span><span class="br0">&#41;</span> == <span class="st0">&quot;on&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$logfile</span> = sfConfig::<span class="me2">get</span><span class="br0">&#40;</span><span class="st0">&#8216;sf_log_dir&#8217;</span><span class="br0">&#41;</span> . <span class="st0">&#8216;/slow_requests.log&#8217;</span>;<br />

&nbsp; &nbsp;<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// vamos logar a <span class="caps">URL</span> e o tempo de execucao</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$text</span> = <a href="http://www.php.net/sprintf"><span class="kw3">sprintf</span></a><span class="br0">&#40;</span><span class="st0">&quot;[%s Tempo: %.2f ms] %s &#8211; %s&quot;</span>, <a href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">&#8216;Y-m-d H:m&#8217;</span><span class="br0">&#41;</span> , <span class="re0">$elapsedTimeMs</span>, sfRouting::<span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getCurrentInternalUri</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>, sfRouting::<span class="me2">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span>&#45;&gt;<span class="me1">getCurrentInternalUri</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp;<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// escrevendo no log</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; file_put_contents<span class="br0">&#40;</span><span class="re0">$logfile</span>, <span class="re0">$text</span> . <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>, FILE_APPEND<span class="br0">&#41;</span>;<br />

<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// essa é uma classe de email personalizada.. use seu metodo para o envio do email</span><br />

&nbsp; &nbsp; &nbsp; &nbsp; Email::<span class="me2">enviar</span><span class="br0">&#40;</span><span class="st0">&quot;[slowRequest] Cliente&quot;</span> , <span class="st0">&quot;Um script demorou mais que o tempo de execucao estipulado. &lt;br/ &gt;O log foi gravado.&quot;</span> , <span class="st0">&quot;to@email.com&quot;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// cuidado ao utilizar a linha acima porque pode sobrecarregar o servidor</span><br />

&nbsp; &nbsp; <span class="br0">&#125;</span><br />

&nbsp; &nbsp; <span class="kw1">else</span><br />

&nbsp; &nbsp; <span class="br0">&#123;</span><br />

&nbsp; &nbsp; &nbsp; <span class="re0">$filterChain</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />

&nbsp; &nbsp; <span class="br0">&#125;</span><br />

&nbsp; <span class="br0">&#125;</span><br />

<span class="br0">&#125;</span><br />

&nbsp;</div>

	<p>Vamos adicionar o novo filtro no <strong>myapp/config/filters.yml</strong>:</p>

<div class="dean_ch" style="white-space: wrap;"><br />

rendering: ~<br />

web_debug: ~<br />

security: &nbsp;~<br />

<br />

slow_requests:<br />

&nbsp; <span class="kw2">class</span>: myFilter<br />

<br />

cache: &nbsp; &nbsp; ~<br />

common: &nbsp; &nbsp;~<br />

flash: &nbsp; &nbsp; ~<br />

execution: ~<br />

&nbsp;</div>

	<p>Limpe o cache!</p>

<div class="shell"> $ symfony cc </div>

	<p>Pronto! O arquivo <strong>`log/slow_requests.log`</strong> será atualizado sempre que um script passar do tempo estipulado. Faça uns testes diminuindo o valor no yml (200).</p>

	<p>Você terá um arquivo mais ou menos assim&#8230;</p>

<div class="shell">$ more log/slow_requests.log <br />

[2008-06-20 Tempo: 292.67 ms] @default_index &#8211; modulo/index <br />

$
 </div>

	<p>Atualmente estou com a linha que envia email comentada e um script na crontab que faz o envio do log para meu email toda semana.. Isso foi bom para reduziu um pouco a carga no servidor.. </p>

	<p>Esse é o meu script..</p>

<div class="shell">$ more slow_request.sh <br />

#!/bin/bash <br />

mail -s &#8220;[Cliente] slow_request.log&#8221; to@email.com < ../../log/slow_requests.log <br />

$
</div>

	<p><a href="http://www.devin.com.br/eitch/crontab">Saiba como utilizar a crontab&#8230;</a></p>

	<p>Adaptado de <a href="http://groups.google.com/group/symfony-users/browse_thread/thread/535b264eb31cf4ac">http://groups.google.com/group/symfony-users/browse_thread/thread/535b264eb31cf4ac</a></p>]]></content:encoded>
			<wfw:commentRss>http://www.symfonybr.com/2008/06/20/gerenciando-aplicacoes-em-producao-profiling-production/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
