Search Results for "SPL"

Dezembro 1st 2008

Palestra no PHPConference 2008

Neste último sábado dia 29/11, estive em São Paulo dando minha palestra sobre Integração Contínua no PHPConference 2008. Deixo aqui meu muito obrigado pelo convite, e dizer que também que fico muito grato aos que com pareceram a minha palestra.
Abaixo os slides da palestra:

Aos que quiserem fazer o download do material em PDF, basta ir até o slideshare.

[]s

No Comments yet »

Novembro 29th 2008

Injeção de dependência com Zend Framework

É comum ver por ai, as pessoas fazendo o setup da aplicação sempre no arquivo de bootstrap do Zend, algo do tipo:

arquivo: index.php

PHP:
  1. require_once 'Initializer.php';
  2. require_once 'Zend/Loader.php';
  3.  
  4. Zend_Loader::registerAutoload();
  5.  
  6. $frontController = Zend_Controller_Front::getInstance();
  7.  
  8. //inicializando configuração do banco de dados
  9. $db = new Zend_Db_Adapter_Oracle(array(
  10.     'username' => 'xxxxxx',
  11.     'password' => 'xxxxxx',
  12.     'dbname'   => 'xe'
  13. ));
  14.  
  15. Zend_Db_Table_Abstract::setDefaultAdapter($db);
  16.  
  17. //inicializando configuração de routes
  18. //...
  19.  
  20. // inicializando layout
  21. Zend_Layout::startMvc();
  22.  
  23. // inicializando componente tal ....
  24.  
  25. $frontController->addControllerDirectory(dirname(__FILE__) . '/application/default/controllers', 'default');
  26. $frontController->dispatch();

Porém, existem maneiras mais fáceis (e mais elegantes) de fazer isso. Injeção de Dependência é uma delas. Com o Zend Framework existem alguns pontos onde podemos aplicar este tipo de abordagem, utilizando Action Helpers, View Helpers e Plugins. Já expliquei aqui no blog como utilizar plugins, no post Não estenda. Plugue!.

O exemplo abaixo é uma alternativa para setup utilizando plugins, para os usuários do Zend Studio for Eclipse isso é talvez seja familiar, já que a IDE gera o projeto mais ou menos desta mesma forma.

Primeiro nosso plugin:

PHP:
  1. <?php
  2.  
  3. require_once 'Zend/Controller/Plugin/Abstract.php';
  4. require_once 'Zend/Controller/Front.php';
  5. require_once 'Zend/Controller/Request/Abstract.php';
  6. require_once 'Zend/Controller/Action/HelperBroker.php';
  7.  
  8. /**
  9.  * plugin de inicialização da aplicação
  10.  *
  11.  */
  12. class Initializer extends Zend_Controller_Plugin_Abstract
  13. {
  14.    
  15.     protected static $_config;
  16.  
  17.     protected $_env;
  18.  
  19.     protected $_front;
  20.  
  21.     protected $_root;
  22.  
  23.     /**
  24.      * Constructor
  25.      *
  26.      * inicializa configurações
  27.      *
  28.      * @param  string $env (development, test, production)
  29.      * @param  string|null $root
  30.      * @return void
  31.      */
  32.     public function __construct($env, $root = null)
  33.     {
  34.         $this->_setEnv($env);
  35.         if (null === $root) {
  36.             $root = realpath(dirname(__FILE__) . '/../');
  37.         }
  38.         $this->_root = $root;
  39.  
  40.         $this->_front = Zend_Controller_Front::getInstance();
  41.        
  42.         $this->initPhpConfig();
  43.     }
  44.  
  45.     /**
  46.      * seta ambiente
  47.      *
  48.      * @param  string $env
  49.      * @return void
  50.      */
  51.     protected function _setEnv($env)
  52.     {
  53.         $this->_env = $env;     
  54.     }
  55.    
  56.  
  57.     /**
  58.      * inicializa configurações do php
  59.      *
  60.      * @return void
  61.      */
  62.     public function initPhpConfig()
  63.     {
  64.         // seta parametros para ambiente de teste
  65.         if ($this->_env == 'test') {
  66.             // habilita todos os erros do php 
  67.             error_reporting(E_ALL | E_STRICT); 
  68.             ini_set('display_startup_errors', 1); 
  69.             ini_set('display_errors', 1);
  70.  
  71.             $this->_front->throwExceptions(true); 
  72.         }
  73.     }
  74.    
  75.     /**
  76.      * faz todas as inicializações antes do inicio do roteamento para os controllers
  77.      *
  78.      * @return void
  79.      */
  80.     public function routeStartup(Zend_Controller_Request_Abstract $request)
  81.     {
  82.         $this->initDb();
  83.         $this->initHelpers();
  84.         $this->initView();
  85.         $this->initPlugins();
  86.         $this->initRoutes();
  87.         $this->initControllers();
  88.     }
  89.    
  90.     /**
  91.      * inicializa banco de dados
  92.      *
  93.      * @return void
  94.      */
  95.     public function initDb()
  96.     {
  97.         $db = new Zend_Db_Adapter_Oracle(array(
  98.             'username' => 'xxxxx',
  99.             'password' => 'xxxxx',
  100.             'dbname'   => 'xe'
  101.         ));
  102.        
  103.         Zend_Db_Table_Abstract::setDefaultAdapter($db);
  104.     }
  105.  
  106.     /**
  107.      * inicializa os action helpers
  108.      *
  109.      * @return void
  110.      */
  111.     public function initHelpers()
  112.     {
  113.         Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper');
  114.     }
  115.    
  116.     /**
  117.      * inicializa o view
  118.      *
  119.      * @return void
  120.      */
  121.     public function initView()
  122.     {
  123.         Zend_Layout::startMvc(array(
  124.             'layoutPath' => $this->_root .  '/application/default/layouts',
  125.             'layout' => 'main'
  126.         ));
  127.        
  128.     }
  129.    
  130.     /**
  131.      * inicializa plugins
  132.      *
  133.      * @return void
  134.      */
  135.     public function initPlugins()
  136.     {
  137.     }
  138.    
  139.     /**
  140.      * inicializa routes
  141.      *
  142.      * @return void
  143.      */
  144.     public function initRoutes()
  145.     {
  146.     }
  147.  
  148.     /**
  149.      * inicializa os controllers
  150.      *
  151.      * @return void
  152.      */
  153.     public function initControllers()
  154.     {
  155.         $this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default');
  156.     }
  157. }

Após isso, nosso arquivo de bootstrap:

PHP:
  1. require_once 'Initializer.php';
  2. require_once 'Zend/Loader.php';
  3.  
  4. Zend_Loader::registerAutoload();
  5.  
  6. $frontController = Zend_Controller_Front::getInstance();
  7. $frontController->registerPlugin(new Initializer('development'));
  8. $frontController->dispatch();

Dessa forma criamos as rotinas de setup e deixamos que o próprio Zend inicialize as coisas para nós.

[]s

2 Comments »

Novembro 1st 2008

Latinoware 2008 - Slides das palestras

Aos que solicitaram os slides das palestras que apresentei no Latinoware 2008, seguem abaixo:

Integração Contínua com CruiseControl e phpUnderControl

Qualidade no desenvolvimento de software com PHPUnit

1 Comment »

Outubro 22nd 2008

Palestra sobre Integração Contínua - CONAPHP 2008

No último domingo dia 19/10/2008, estive em São Paulo no CONAPHP, evento realizado pelo ProPHP juntamente com a organização do Conisli. No evento falei sobre Integração Contínua aplicada a equipes PHP.
Aos que se interessarem, abaixo estão os slides da palestra.

[]s

1 Comment »

Outubro 21st 2008

Palestra sobre Smarty Template

Na última sexta-feira dia 17/10/2008, estive apresentando uma palestra para uma turma do curso técnico da escola Santo Inácio aqui em Porto Alegre.

Na escola, todos os anos são apresentadas palestras durante o período da feira de ciências da escola. Bem, pelo que pude perceber a escola já tem alguma tradição na educação de cursos voltados para eletroeletrônica, porém agora está investindo também em cursos de informática. Como não entendo bolhufas de eletrônica, acabei ficando um pouco por fora, mas o evento contou com palestras de grandes empresas da área eletroeletrônica, como uma palestra que assisti da Siemens.

Pelo que sei não houveram outras palestras na área de informática com exceção da minha.

Os materias utilizados como exemplo se encontram disponíveis no link abaixo:
santoinacio.zip

Smarty Template Engine
View SlideShare presentation or Upload your own. (tags: php smarty)

2 Comments »

Dezembro 5th 2007

array X ArrayIterator == cópia X referência

A questão é a seguinte, imagine que você precise imprimmir todos os elementos de um array, qual a solução para isso? use um foreach, óbvio.

Agora vamo imaginar que dentro deste foreach onde você esta imprimindo os elementos de seu array, tenha alguma lógica que pode adicionar ou não mais elementos ao array que você esta iterando no momento. Ex.:

PHP:
  1. $a = array('PHP', 'Java', 'Ruby');
  2.  
  3. foreach ($a as $value) {
  4.   if ($value == 'PHP') {
  5.     $a[] = 'PHP-GTK';
  6.   }
  7.  
  8.   echo $value . "\r\n";
  9. }

Reparem que no exemplo acima a saida final seria:

PHP
Java
Ruby

E o PHP-GTK por que não imprimiu?
Isto acontece porque o PHP faz com que o foreach trabalhe com um 'cópia' do array que você passou como parametro assim quando você adiciona um elemento para o seus array, não irá influenciar na cópia que esta sendo usada pelo foreach.

Esta situação é facilmente resolvida se você utilizar um objeto que implemente a interface Iterator, como o ArrayIterator por exemplo.

Se você passar um objeto do tipo Iterator como parametro para o comando foreach ele não irá criar uma cópia de seu objeto, irá utilizar a referência. Desta maneira é possível garantir que todos os elementos de seu array serão iterados. Ex.:

PHP:
  1. $a = array('PHP', 'Java', 'Ruby');
  2. $a = new ArrayIterator($a);
  3.  
  4. foreach ($a as $value) {
  5.   if ($value == 'PHP') {
  6.     $a[] = 'PHP-GTK';
  7.   }
  8.  
  9.   echo $value . "\r\n";
  10. }

Espero que a informação tenha sido util, infelizmente na documentação do
PHP este tipo de situação não esta "bem documentada". :P

Abraço a todos.

2 Comments »

Outubro 22nd 2007

[Testado] Zend Studio for eclipse

Durante aproximadamente duas semanas trabalhei utilizando o novo Zend Studio for eclipse, e neste post irei dar algumas ficas e falar sobre as novidades da IDE.

Não irei abordar todas funcionalidades da IDE neste post, isso seria inviável devido a todas as funcionalidades já herdadas do eclipse, então darei um foco exclusivo a algumas das funcionalidades implementadas pela Zend para o desenvolvimento PHP.

Continue Reading »

Páginas: 1 2 3

2 Comments »

Setembro 3rd 2007

RSS pra lá de fácil com Zend Framework

O módulo Zend_Feed fornece uma grande abstração e uma sintaxe simples para a manipulação de feeds e entries. Irei demostrar aqui duas formas simples para o uso deste módulo.

Continue Reading »

2 Comments »

Julho 26th 2007

Criando Listener para o PHPUnit

o PHPUnit pode ser estendido de várias maneiras, vou apresentar neste post uma forma simples de manipular os resultados dos testes, criando um listener para escutar os resultados obtidos através da execução dos testes unitários.

Você não necessita necessariamente escrever uma subclasse da classe PHPUnit_Framework_TestResult a fim customizar seus resultados de execução. Na maioria das vezes, bastará implementar a interface PHPUnit_Framework_TestListener e uni-lo ao objeto de PHPUnit_Framework_TestResult, antes de executar os testes.

Continue Reading »

Páginas: 1 2 3

No Comments yet »

Julho 11th 2007

Testando seus códigos com PHPUnit

Muito similar ao JUnit, o PHPUnit é um framework que auxilia a criação e execução de testes unitários sobre classes PHP. O desenvolvimento orientado a testes é uma ótima prática largamente utilizada por equipes Extreme Programming. Não vou abordar aqui, o valor de utilizar ou não está prática, mas sim, como de fato utiliza-la, quem se interesar mais pelo assunto ai vão alguns links:

Continue Reading »

Páginas: 1 2 3 4

29 Comments »

Next »