<?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>Marcelo Rodrigues &#187; Url</title>
	<atom:link href="http://www.marcelomx.com/tag/url/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcelomx.com</link>
	<description>Web Developer</description>
	<lastBuildDate>Tue, 03 Aug 2010 02:26:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
		<item>
		<title>Escrevendo URLs no Zend Framework</title>
		<link>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/#utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=escrevendo-urls-no-zend-framework</link>
		<comments>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 18:40:07 +0000</pubDate>
		<dc:creator>Marcelo Rodrigues</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Php]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Helper]]></category>
		<category><![CDATA[Url]]></category>
		<category><![CDATA[View]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.marcelomx.com/?p=36</guid>
		<description><![CDATA[O Zend Framework, assim com os demais frameworks que utilizam o padrão MVC, possui uma estrutura de roteamento para mapear e direcionar corretamente os seus controles e ações de acordo com determinada url requisitada pela aplicação. Também como os demais, possibilita a escrita de urls para estes controles na camada de visualização quando necessário, através [...]]]></description>
			<content:encoded><![CDATA[<p>O Zend Framework, assim com os demais frameworks que utilizam o padrão MVC, possui uma estrutura de roteamento para mapear e direcionar corretamente os seus controles e ações de acordo com determinada url requisitada pela aplicação. Também como os demais, possibilita a escrita de urls para estes controles na camada de visualização quando necessário, através dos &#8220;helpers&#8221;.</p>
<p>Infelizmente, o helper responsável pela escrita dessas urls ainda é bastante imaturo. A forma como deve ser feita esta tarefa é trabalhosa, chata e principalmente, improdutiva. Só o fato de ter de indicar &#8220;TODOS&#8221; os parâmetros para a escrita da URL em uma estrutura de array associativa soa como um paradoxo, já que o próprio framework possui mecanismos que fazem o parser na url requisitada, identificando os parâmetros necessários e passando-os ao roteador. Ou seja, é um retrabalho e não um reúso. Exemplo de uma url escrita da forma padrão em um arquivo de template.</p>
<pre>&lt;?php</pre>
<pre>echo $this-&gt;url(array(
 	'controller' =&gt; 'users',
 	'action'     =&gt; 'edit',
 	'id'         =&gt; 25
 	));</pre>
<pre>?&gt;</pre>
<p>A saída do exemplo será: /users/edit/id/25. Analisando a url, seria mais fácil simplesmente escrever da seguinte forma:</p>
<pre>&lt;?php</pre>
<pre>echo "/users/edit/id/25";</pre>
<pre>?&gt;</pre>
<p>Desta forma o resultado é mais rápido, porém, você perde em termos controle, já que a escrita é manual e se você alterar o nome do controle ou da ação, a url passará a ser inválida (a não ser que você use roteadores customizados).</p>
<p>A maioria dos frameworks, como Symfony, Cake etc, implementam tanto a forma de escrita com os parâmetros em um array, quanto uma string contendo a url desejada, fazendo a conversão automática dos mesmos para o formato padrão do framework ou da aplicação. O Symfony, por exemplo, implementa a escrita da seguinte forma:</p>
<pre>&lt;?php echo url_for('users/edit?id='. 25); ?&gt;</pre>
<p>O Symfony automaticamente converterá isso para o formato /users/edit/id/25. Considero essa forma muito mais elegante e produtiva, pois está mais próximo da realidade das urls &#8220;dinâmicas&#8221;. No entanto, se houver mais parâmetros, a coisa já começa a complicar.</p>
<p>Voltando a forma como o Zend Framework implementa este recurso, já se sabe que ele não é tão flexível assim, então é necessário criar um helper na camada de visualização para esta tarefa. Podemos inclusive, aproveitar o que já foi desenvolvido e é padrão do framework e encontra-se na pasta: Zend/View/Helper/Url.php.</p>
<pre>#Zend/View/Helper/Url.php</pre>
<pre>class Zend_View_Helper_Url extends Zend_View_Helper_Abstract
 {
 	public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
 	{
 	$router = Zend_Controller_Front::getInstance()-&gt;getRouter();
 	return $router-&gt;assemble($urlOptions, $name, $reset, $encode);
 	}
 }</pre>
<p>Crie um arquivo de helper com o nome que você quiser e o coloque no diretório de helpers da sua aplicação. O meu eu chamei de MyUrl.php. Crie neste arquivo a classe Zend_View_Helper_MyUrl. Dentro da classe, crie o método myUrl. É importante ressaltar que o nome do helper deve estar no nome do arquivo, como sufixo do nome da classe e como método principal, que é avaliado e chamado pelo objeto Zend_View ao ser requisitado no template.</p>
<p>O método myUrl terá os mesmos parâmetros do helper Url, com exceção que o primeiro parametro poderá tanto ser uma string quanto um array, então não é necessário tipá-la.</p>
<p>A classe então terá a seguinte estrutura.</p>
<pre>&lt;?php</pre>
<pre>require_once 'Zend/View/Helper/Abstract.php';</pre>
<pre>class Zend_View_Helper_MyUrl extends Zend_View_Helper_Abstract
 	{</pre>
<pre> /**
 	* Return the URL
 	*
 	* @param string|array $urlOptions
 	* @param string       $name
 	* @param bool         $reset
 	* @param bool         $encode
 	* @return string
 	*/
 	public function myUrl($urlOptions, $name = null, $reset = false, $encode = true)
 	{
 	$front  = Zend_Controller_Front::getInstance();
 	$router = $front-&gt;getRouter();</pre>
<pre> if (is_string($urlOptions)) {
 	$urlOptions = '/'. ltrim($urlOptions, '/'); // Case the first character is a '?
 	$request = new Zend_Controller_Request_Http(); // Creates a cleaned instance of request http
 	$request-&gt;setBaseUrl($front-&gt;getBaseUrl());
 	$request-&gt;setRequestUri($urlOptions);
 	$route = $router-&gt;route($request); // Return the request route with params modifieds
 	$urlOptions = $route-&gt;getParams();
 	}
 	return  $router-&gt;assemble((array) $urlOptions, $name, $reset, $encode);
 	}
 	}</pre>
<p>Salvo o helper, é só utilizá-lo. Agora ele suporta todos os formatos:</p>
<pre>&lt;?php echo $this-&gt;myUrl(array(
 	'controller'=&gt; 'users,
 	'action'    =&gt; 'edit,
 	'id'        =&gt; 25
 	)); ?&gt;</pre>
<p>ou</p>
<pre>&lt;?php echo $this-&gt;myUrl('users/edit?id=25'); ?&gt;</pre>
<p>ou</p>
<pre>&lt;?php echo $this-&gt;myUrl('users/edit/id/25'); ?&gt;</pre>
<p>Muito mais simples, elegante e bem produtivo!</p>
<p>É possível ainda utilizar os outros parâmetros do helper padrão, como o nome do roteador a ser utilizado para formatar a url, se o mesmo vai ou não utilizar a url base ou somente a partir da atual e se a url será codificada ou não &#8211; bastante útil para utilizar como valor de outros parametros. <img src='http://www.marcelomx.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Até a próxima.</p>

	Tags: <a href="http://www.marcelomx.com/category/framework/" title="Framework" rel="tag nofollow">Framework</a>, <a href="http://www.marcelomx.com/tag/framework/" title="Framework" rel="tag nofollow">Framework</a>, <a href="http://www.marcelomx.com/tag/helper/" title="Helper" rel="tag nofollow">Helper</a>, <a href="http://www.marcelomx.com/category/php/" title="Php" rel="tag nofollow">Php</a>, <a href="http://www.marcelomx.com/tag/php/" title="Php" rel="tag nofollow">Php</a>, <a href="http://www.marcelomx.com/category/tecnologia/" title="Tecnologia" rel="tag nofollow">Tecnologia</a>, <a href="http://www.marcelomx.com/tag/url/" title="Url" rel="tag nofollow">Url</a>, <a href="http://www.marcelomx.com/tag/view/" title="View" rel="tag nofollow">View</a>, <a href="http://www.marcelomx.com/tag/zend/" title="Zend" rel="tag nofollow">Zend</a>, <a href="http://www.marcelomx.com/tag/zend-framework/" title="Zend Framework" rel="tag nofollow">Zend Framework</a><br />

	<h4>Posts relacionados</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.marcelomx.com/2010/08/02/phphederal-desenvolvimento-orientado-a-testes-com-php/" title="PHPHEDERAL &#8211; Desenvolvimento Orientado a Testes com PHP (2 August 2010)">PHPHEDERAL &#8211; Desenvolvimento Orientado a Testes com PHP</a> (0)</li>
	<li><a href="http://www.marcelomx.com/2009/12/28/iniciando-com-desenvolvimento-orientado-a-testes-com-php/" title="Iniciando com desenvolvimento orientado a testes com PHP (28 December 2009)">Iniciando com desenvolvimento orientado a testes com PHP</a> (1)</li>
	<li><a href="http://www.marcelomx.com/2009/11/02/frameworks-padroes-de-projetos-e-testes/" title="Frameworks, padrões de projetos e testes. (2 November 2009)">Frameworks, padrões de projetos e testes.</a> (3)</li>
	<li><a href="http://www.marcelomx.com/2008/11/20/zend-framework-17/" title="Zend Framework 1.7 (20 November 2008)">Zend Framework 1.7</a> (1)</li>
	<li><a href="http://www.marcelomx.com/2008/09/05/zead-project/" title="Zead Project (5 September 2008)">Zead Project</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.marcelomx.com/2008/12/30/escrevendo-urls-no-zend-framework/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
