<?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>UZED &#187; Zend Framework</title>
	<atom:link href="http://uzed.com.br/category/informatica/php/zend-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://uzed.com.br</link>
	<description>Informação Livre!</description>
	<lastBuildDate>Wed, 14 Jul 2010 06:03:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SOAP com Zend Framework</title>
		<link>http://uzed.com.br/soap-com-zend-framework/</link>
		<comments>http://uzed.com.br/soap-com-zend-framework/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 21:04:04 +0000</pubDate>
		<dc:creator>zedmaster</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Zend_Soap]]></category>

		<guid isPermaLink="false">http://uzed.com.br/?p=226</guid>
		<description><![CDATA[Objetivo O objetivo deste tutorial é ensinar a criar um Servidor SOAP, utilizando a biblioteca do Zend Framework. Pedi para o meu amigo Artista Frustrado, elaborar uma introdução a webservice, e fazer exemplos em outras linguagens, confira. Material Componentes do Zend Framework: Zend_Loader Zend_Soap Zend_Soap_Client Zend_Soap_AutoDiscover Arquivos soap.tar.bz2: /index.php /client.php /Client /Calculadora.php /Server /Calculadora.php /ServerSoap.php [...]]]></description>
			<content:encoded><![CDATA[<h4>Objetivo</h4>
<p>    O objetivo deste tutorial é ensinar a criar um Servidor SOAP, utilizando<br />
a biblioteca do Zend Framework.<br />
    Pedi para o meu amigo <a href="http://www.frustrado.com.br/main/index.php?title=Web_Services"> Artista Frustrado</a>, elaborar uma introdução a webservice, e fazer exemplos em outras linguagens, confira.<br />
</p>
<h4>Material</h4>
<p><strong>Componentes do Zend Framework:</strong></p>
<ul>
<li>Zend_Loader</li>
<li>Zend_Soap</li>
<li>Zend_Soap_Client</li>
<li>Zend_Soap_AutoDiscover</li>
</ul>
<p><strong>Arquivos <a href='http://uzed.com.br/wp-content/uploads/2009/02/soap.tar.bz2'>soap.tar.bz2</a>:</strong></p>
<pre lang="Bash">
/index.php
/client.php
/Client
    /Calculadora.php
/Server
    /Calculadora.php
    /ServerSoap.php
/README
</pre>
<p><strong>Testado no seguinte  ambiente:</strong></p>
<ul>
<li>Versão do Zend Framework testada: 1.7.5</li>
<li>Sistema Operacional: Linux</li>
<li>Distribuição: Debian Lenny</li>
<li>Versão do PHP:  PHP 5.2.6-1+lenny2</li>
<li>Versão do Apache: Apache/2.2.9 (Debian)</li>
</ul>
<p><strong>Material recomendado para leitura:</strong></p>
<ul>
<li><a href="http://br.php.net/manual/pt_BR/language.oop5.php">Orientação a Objeto no PHP5</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.soap.html">Zend_Soap</a></li>
<li><a href="http://br.php.net/manual/pt_BR/function.serialize.php">Serialize</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169676">Web Services Essentials</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169836">Programming Web Services with SOAP</a></li>
</ul>
<h3>SOAP</h3>
<p>    O SOAP é um protocolo de comunicação entre o web service e o cliente. Suas especificações não são simplesmente uma transferência de XML basica, são envolvidas diversas regras para aplicações em diveras plataformas e formatos de XML.<br />
</p>
<p><strong>Quando utilizar SOAP?</strong></p>
<p>    Quando você não quer disponibilizar a apresentação da camada so seu aplicativo, e sim, apenas algumas funcionalidades, evitando abrir conexões com bancos.</p>
<p>    Quando você tem que iteragir com outros sistemas homogeneos. Exemplo, o seu fornecedor tem uma aplicação em .NET e precisa acessar uncionalidades do seu sistema que é feito em PHP. Assim, temos linguagens, sistemas operacionais e banco de dados diferentes podendo se comunicar.</p>
<p>    Quando você quer centralizar as regras de negócios no servidor. Usando clientes que acessam o servidor, sendo eles qualquer dispositivo (PDA, Terminal, celular etc.)<br />
</p>
<h3>Configurando o Ambiente</h3>
<p><strong>Temos a seguinte estrutura de pastas:</strong></p>
<pre lang="Bash">
/soap
    /index.php
    /client.php
   /Client
        /Calculadora.php
    /Server
        /Calculadora.php
        /ServerSoap.php
    /README
/zf
</pre>
<p>Na pasta soap é aonde ficam os arquivos e na pasta zf a biblioteca do Zend Framework.</p>
<p>- Descompacte o arquivo <a href='http://uzed.com.br/wp-content/uploads/2009/02/soap.tar.bz2'>soap.tar.bz2</a> na sua pasta web (no meu caso foi na pasta /var/www)</p>
<p>- Configure o apache para apontar para a pasta do soap<br />
No Linux:</p>
<pre lang="Bash">
<virtualhost *:80>
    ServerName soap.localhost
    DocumentRoot /mnt/dados/www/soap
</virtualhost>
</pre>
<p>- Adicione no arquivo hosts: 127.0.0.1  soap.localhost<br />
No Linux: adicione a linha no arquivo /etc/hosts</p>
<p>- Reinicie o apache</p>
<p>- Teste no browser os endereços:<br />
 &#8211; http://soap.localhost<br />
 &#8211; http://soap.localhost?wsdl</p>
<p>- Finalmente execute o cliente:<br />
No Linux:</p>
<pre lang="Bash">
:# php cliente.php

Deve aparecer a seguinte resposta:
##############################

Lista das funções disponíveis:
array(3) {
  [0]=>
  string(12) "string ola()"
  [1]=>
  string(25) "int somar(int $a, int $b)"
  [2]=>
  string(45) "string objeto(string $objeto, string $metodo)"
}

ola() -> Oi

somar(2,2) -> 4

calculadora->somar(3,3) -> 6

calculadora->naoexiste() -> O método: naoexiste() não foi implementado.

##############################
</pre>
<p>Pronto você já esta usando SOAP.</p>
<h4>Exemplo</h4>
<p>    O nosso exemplo consiste em um servidor web rodando um web service em PHP com Zend_Soap_Client Zend Framework, e um cliente também em PHP que acessa a mesma máquina através do console, no endereço http://soap.localhost.</p>
<p>    O cliente deve solicitar ao servidor algumas funções, e obter suas respostas.</p>
<p>O arquivo index.php contém o código para a criação do arquivo WSDL e do servidor SOAP.<br />
O Zend_Soap_AutoDiscover cria o arquivo WSDL para o servidor SOAP.<br />
O Zend_Soap que executa as funções cadastradas no WSDL, por isso que é passado por parâmetro a url http://soap.localhost/index.php?wsdl .</p>
<p>arquivo index.php</p>
<pre lang="PHP">
set_include_path(
    '../zf/ZendFramework-1.7.5/library/'
    . PATH_SEPARATOR . get_include_path()
);

require_once "Server/Calculadora.php";
require_once "Server/Soap.php";
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

ini_set("soap.wsdl_cache_enabled", 0); //** Limpa o cache

if(isset($_GET['wsdl'])) {
    //** Cria o arquivo WSDL automaticamente
    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('ServerSoap');
    $autodiscover->handle();
} else {
    //** Executa o servidor SOAP
    $soap = new Zend_Soap_Server("http://soap.localhost/index.php?wsdl");
    $soap->setClass('ServerSoap');
    $soap->handle();
}
</pre>
<p><strong>IMPORTANTE: </strong>Deve-se colocar o tipo de dados que os métodos recebem e retornam usando os tipos de dados do <a href="http://manual.phpdoc.org/HTMLframesConverter/default/">PHPDOC</a>. Veja nos comentários do exemplo.</p>
<p>arquivo Server/Soap.php</p>
<pre lang="PHP">
class ServerSoap
{
    /**
     *  @return string
     */
    public function ola()
    {
        return "Oi";
    }

    /**
     * @param int $a
     * @param int $b
     * @return int
     */
    public function somar($a,$b)
    {
        return $a + $b;
    }

    /**
     * Executa uma classe vinda do cliente.
     *
     * @param string $objeto
     * @param string $metodo
     * @return string
     */
    public function objeto($objeto, $metodo)
    {
        $tmp = unserialize($objeto);

        //** Verifica se o método existe para o $objeto
        $class_methods = get_class_methods($tmp);
        foreach ($class_methods as $method_name) {
            if($method_name == $metodo)
            {
                $tmp->$metodo();
                return serialize($tmp);
            }
        }

        $tmp->msg = "O método: {$metodo}() não foi implementado.";
        return serialize($tmp);
    }
}
</pre>
<p>O Zend_Soap_Client conecta no servidor SOAP, passando a url do WSDL. Para acessar as funções cadastradas basta a variável instanciada e o nome da função.</p>
<p>arquivo client.php:</p>
<pre lang="PHP">
set_include_path(
    '../zf/ZendFramework-1.7.5/library/'
    . PATH_SEPARATOR . get_include_path()
);

require_once "Client/Calculadora.php";
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

ini_set("soap.wsdl_cache_enabled", 0); //** Limpa o cache

//** Inicia a conexão com o cliente
$client = new Zend_Soap_Client("http://soap.localhost/index.php?wsdl");

echo "\n##############################\n\n";

echo "Lista das funções disponíveis:\n";
var_dump($client->getFunctions());

//** Chama a função ola()
echo "\nola() -> ".$client->ola() ."\n\n";

//** Chama a função somar(a,b)
echo "somar(2,2) -> ".$client->somar(2,2) ."\n\n";

//** Cria o objeto Calculadora e passa para o SOAP executar a soma
$calculadora = new Calculadora(3,3);

$soapCalculadora =  $client->objeto(serialize($calculadora), "somar"); //* A Calculadora tem que ser serializada antes de passar para o SOAP.
$unserializeCalculadora = unserialize($soapCalculadora); //* A Calculadora tem que ser deserializada antes de chamar o metodo resposta().
echo "calculadora->somar(3,3) -> ".$unserializeCalculadora->resposta()."\n\n"; 

$erroCalculadora = $client->objeto(serialize($calculadora), "naoexiste");//** Tentando executar um método inexistente.
$erroCalculadora = unserialize($erroCalculadora);
echo "calculadora->naoexiste() -> ".$erroCalculadora->msg."\n";

echo "\n##############################\n\n";
</pre>
<h3>A classe Calculadora</h3>
<p>Temos duas instâncias do objeto Calculadora, uma para o servidor , aonde contém  o método calcular() e a do cliente aonde temos o método resposta().<br />
Para passar o objeto Calculadora do cliente para o servidor, e depois do servidor para o cliente, usamos uma técnica chamada <a href="http://br.php.net/manual/pt_BR/function.serialize.php">serialização</a>.</p>
<p>Server/Calculadora.php</p>
<pre lang="PHP">
/**
 * Classe calculadora do servidor
 *
 */
class Calculadora
{
    public $a;
    public $b;
    public $resposta;

    /**
     * Executa a soma
     *
     */
    public function somar()
    {
        $this->resposta = $this->a + $this->b;
    }
}
</pre>
<p>Client/Calculadora.php</p>
<pre lang="PHP">
/**
 * Classe calculadora do cliente
 *
 */
class Calculadora
{
    public $a;
    public $b;
    public $resposta;

    /**
     * Construtor da classe
     *
     * @param int $a
     * @param int $b
     * @return void
     */
    public function __construct($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
    }

    /**
     * Retorna a resposta da soma
     *
     * @return int
     */
    public function resposta()
    {
        return $this->resposta;
    }
}
</pre>
<p>Para dúvidas ou críticas construtivas entre em contato.</p>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/soap-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tradução do Zend_Auth</title>
		<link>http://uzed.com.br/traducao-do-zend_auth/</link>
		<comments>http://uzed.com.br/traducao-do-zend_auth/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 18:07:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://uzed.com.br/zed/?p=27</guid>
		<description><![CDATA[Tradução encontra-se no blog do Klein: http://blog.klein.inf.br/?p=6]]></description>
			<content:encoded><![CDATA[<p>Tradução encontra-se no blog do Klein:</p>
<p><a href="http://blog.klein.inf.br/?p=6">http://blog.klein.inf.br/?p=6</a></p>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/traducao-do-zend_auth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EX001 &#8211; Como usar Zend_Db_Table Relationships</title>
		<link>http://uzed.com.br/ex001-como-usar-zend_db_table-relationships/</link>
		<comments>http://uzed.com.br/ex001-como-usar-zend_db_table-relationships/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 00:54:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ZEDDEMO]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Zend_Db_Table]]></category>

		<guid isPermaLink="false">http://uzed.com.br/zed/?p=20</guid>
		<description><![CDATA[Introdução O conceito básico do relacionamento entre os objetos de dados (objetos extendidos de Zend_Db_Table_Abstract) é o cascateamento de operações como SELECT, UPDATE e DELETE . Consulte: Zend_Db_Table Zend_Db_Table Relationships Objetivo Criar um setor de uma empresa, que possa ter vários funcionários relacionados com ele (um para muitos). Condições Quando selecionar o setor, mostrar os [...]]]></description>
			<content:encoded><![CDATA[<h3>Introdução</h3>
<p>
O conceito básico do relacionamento entre os objetos de dados (objetos extendidos de Zend_Db_Table_Abstract)<br />
é o cascateamento de operações como SELECT, UPDATE e DELETE .
</p>
<p><strong>Consulte:</strong></p>
<ul>
<li><a href="http://framework.zend.com/manual/en/zend.db.table.html">Zend_Db_Table</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.db.table.relationships.html">Zend_Db_Table Relationships</a></li>
</ul>
<p></p>
<h3>Objetivo</h3>
<p>
Criar um setor de uma empresa, que possa ter vários funcionários relacionados com ele (um para muitos).
</p>
<p></p>
<h3>Condições</h3>
<p>
Quando selecionar o setor, mostrar os seus funcionários, sem usar SELECT em tb_funcionarios, tentar usar o relacionamento para apresenta-los.<br />
Quando um setor for apagado, fazer com que o sistema apague todos os funcionários ralacionados.
</p>
<p></p>
<h3>Solução</h3>
<h4>Relacionamento</h4>
<p>Primeiro iremos criar as referências entre as objetos de dados chamados DoSetor e DoFuncionario.
</p>
<p>
Na classe DoSetor inserimos a sua dependencia com o DoFuncionario, usando o parametro $_dependentTables.
</p>
<pre lang="PHP" line="1" >
class DoSetor extends Zend_Db_Table_Abstract
{
	protected $_name = "tb_setor";

	protected $_primary = "cd_setor";

	protected $_dependentTables = array('DoFuncionario');
}
</pre>
<h4>arquivo: DoSetor.php</h4>
<p></p>
<p>
Na classe DoFuncionario use o parametro $_referenceMap, passando um array com o nome da referencia as colunas(no caso cd_setor)  e as operações permitidas (onDelete e onUpdate como self::CASCADE).
</p>
<pre lang="PHP" line="1"  >
class DoFuncionario extends Zend_Db_Table_Abstract
{
	protected $_name = "tb_funcionario";

	protected $_primary = "cd_funcionario";

	protected $_referenceMap    = array(
			'DoSetor' => array(
				'columns'           => array('cd_setor'),
				'refTableClass'     => 'DoSetor',
				'refColumns'        => array('cd_setor'),
				'onDelete'          => self::CASCADE,
				'onUpdate'          => self::CASCADE
				)
			);
}
</pre>
<h4>arquivo: DoFuncionario.php</h4>
<p></p>
<h4>Exibição dos Dados</h4>
<p>
Quando a consulta é pelo o objeto dependente usa-se <em>doObjeto->FindParentRow(&#8220;nome_obj_relacao&#8221;)</em>, no nosso caso seleciona-se o<br />
Funcionário e depois procura-se o seu Setor.<br />
Quando é o objeto que possue dependentes usa-se <em>doObjeto->findDoObjeto_Dependente</em>, no nosso caso coloa-se o Funcionário<br />
como parametro na chamada do método.
</p>
<pre lang="PHP" line="1" >
echo "Listando por Cliente:";
$funcionario = $doFuncionario->fetchAll();
foreach($funcionario as $currentFuncionario)
{
    $setor = $currentFuncionario->FindParentRow("DoSetor");

    echo "{$currentFuncionario->nm_funcionario} - {$setor->nm_setor}\n";
}

echo "Listando por Setor:";
$setor= $doSetor->fetchAll();
foreach($setor as $currentSetor)
{
    $funcionario = $currentSetor->findDoFuncionario();

    foreach($funcionario as $currentFuncionario)
    {
        echo "{$currentSetor->nm_setor} - {$currentFuncionario->nm_funcionario}\n";
    }
}
</pre>
<h4>arquivo Ex0001Controller.php</h4>
<h3>Excluindo Registro</h3>
<p>
Ao apagar um setor, apaga-se todos os funcionários relacionados.
</p>
<pre lang="PHP" line="1" >
echo "Apagando setor: Financeiro.";
$setor = $doSetor->find($cd_setor);
$setor = $setor->current();
$setor->delete();
</pre>
<h4>arquivo Ex0001Controller.php</h4>
<h3>Conclusão</h3>
<p>
A vantagem de usar este tipo de dependência é o fato de não se preocupar com a integridade dos dados, e dexando a responsabilidade para o ZF.<br />
Quando ocorrerem relacionamentos mais complexos, estas referências facilitam a implementação das regras de negócio.</p>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/ex001-como-usar-zend_db_table-relationships/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalação do ZEDDEMO v0.1</title>
		<link>http://uzed.com.br/instalacao-do-zeddemo-v01/</link>
		<comments>http://uzed.com.br/instalacao-do-zeddemo-v01/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 00:10:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ZEDDEMO]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://uzed.com.br/zed/?p=19</guid>
		<description><![CDATA[Estes exemplos visam a demosntrações práticas de objetos e metodologias usados no Zend Framework (de acordo com meus estudos). Ã‰ exigido um nÃ­vel intermediário em PHP e iniciante em Zend Framework e uma boa noção de programação Orientada a Objeto. Caso você não tenha tais conhecimentos, use ferramentas de busca, tutorias, fórums listas etc, para [...]]]></description>
			<content:encoded><![CDATA[<p>Estes exemplos visam a demosntrações práticas de objetos e metodologias usados no Zend Framework (de acordo com meus estudos).</p>
<p>Ã‰ exigido um nÃ­vel intermediário em PHP e iniciante em Zend Framework e uma boa noção de programação Orientada a Objeto. Caso você não tenha tais conhecimentos, use ferramentas de busca, tutorias, fórums listas etc, para manter-se atualizado.</p>
<p>Exemplos:</p>
<ul>
<li><a href="http://uzed.com.br/zed/?p=20">Exemplo 0001</a> (Como usar Zend_Db_Table Relationships)</li>
</ul>
<p></p>
<h3>Arquivo</h3>
<p><a href="http://www.uzed.com.br/zeddemo/zeddemo_v0.1.tar.bz2">zeddemo_v0.1.tar.bz2</a></p>
<p>Desconpacte o arquivo zeddemo_vXXX.tar.bzip2 na sua pasta de hosts (para windows use o <a href="http://sourceforge.net/projects/sevenzip/">7Zip</a>)</p>
<p>ex. /var/www/zeddemo/www (no Linux).</p>
<p></p>
<h3>CONFIGURANDO APACHE</h3>
<p>Verifique se o mod_rewrite esta habilitado no seu APACHE, caso nao esteja, procure na sua ferramenta de pesquisa como que instala.<br />
Primeiramente crie o host no seu APACHE.</p>
<pre>
&lt;VirtualHost *>
    ServerName zeddemo.meudominio.com
    DocumentRoot /var/www/zeddemo/html
&lt;/VirtualHost>
</pre>
<p>Edite o arquivo hosts (/etc/hosts no Linux) adicionando:</p>
<p>127.0.0.1       zeddemo.meudominio.com</p>
<p></p>
<h3>CONFIGURANDO MYSQL</h3>
<p>Crie um usuário e senha no seu banco de dados:<br />
usuário: zeddemo<br />
senha: zeddemo</p>
<p>No diretório suport temos o arquivo db_demo.sql que é a base de dados aonde irei colocar os exemplos que mexem com base de dados.</p>
<p>Use o seguinte comando para importar diretamente a base:</p>
<pre style="overflow: auto;">
linux:/var/www/zeddemo/www/suport# mysql -u zeddemo --password=zeddemo < db_demo.sql
</pre>
<p>Ou use a ferramenta que achar conveniente para importar o arquivo db_demo.sql.</p>
<p></p>
<h3>Baixando o ZF</h3>
<p>Acesse a página http://framework.zend.com/download .<br />
E baixe a última versão do ZendFramework</p>
<p>Descompacte o arquivo e copie a pasta ZendFrameworkXXXX/library/Zend<br />
para a sua estrutura /var/www/zeddemo/library .</p>
<p></p>
<h3>DIVIRTA-SE</h3>
<p>Espero estar contribuindo para o aumento do seu conhecimento e quem sabe trocar algumas idéias.<br />
Que você seja promovido a Diretor e lembre de mim quando abrir uma oportunidade ^^ .</p>
<p>Qualquer dúvida entre em contato com o mantedor deste código.</p>
<p>Alexandre F. Martins - uzedmaster@gmail.com<br />
<a href="http://www.uzed.com.br/zed">http://www.uzed.com.br/zed</a>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/instalacao-do-zeddemo-v01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
