Zend Framework – Introdução (pt 1)
Opa!
Hoje irei iniciar uma série de posts com o intuito de explicar o funcionamento do Zend Framework, que na minha opinião é o melhor framework atual para PHP.
Primeiramente, você deve saber o porque utilizar um framework, o que já expliquei (pelo menos tentei) em um post passado.
O Zend Framework é na minha humilde opinião o melhor pois se trata de um framework com baixa dependencia entre componentes e que pode ser usado tanto como biblioteca funcional como um robusto sistema no padrão MVC, além de integrar toda a infra-estrutura de serviços da Zend como Zend Studio, Zend Server e outros produtos.
A versatilidade do ZF é incrivel, atualmente existem várias bibliotecas prontas que trazem uma gama enorme de opções para agilizar o desenvolvimento, por exemplo, é possível dar um update no seu Twitter com apenas 2 linhas de código.
A Zend, empresa que cuida da manutenção do PHP e seus projetos, criou várias parcerias para os mais variados fins, dentre eles com a Adobe para criar os componentes AMF, que seriam como servidores para trabalhar de forma completa com o Flash, Flex e AIR ou seja, não é necessário ficar remoendo XML pra lá e pra cá afim de integrar um sistema complexo, o ZF faz isso por você.
Além de tudo isso, temos webservices prontos desde Amazon Cloud, toda estrutura do GData (para Youtube, Google Calendar etc etc [para se ter noção é possivel publicar um vídeo remotamente no Youtube sem mto esforço]) passando por Nirvanix (CDN), Yahoo, Flicker etc, se já não bastasse, é atualizado constantemente.
Bom, chega de lero lero, vamos ao que interessa.
Particularmente, utilizo toda a infra-estrutura que o ambiente MVC do Zend Framework oferece, o que me facilita a vida em vários aspectos. Considerando que você já conhece bastante de OOP e um pouco de Design Patterns, vamos lá!
Primeiramente, precisamos baixar o ZF, site oficial é http://framework.zend.com e para o download http://framework.zend.com/download/latest.
Como você deve estar pensando, “Full ou Minimal?” te responderei, Minimal e o porquê é bem simples, o Full vem com uma série de exemplos e o pacote completo do Dojo Toolkit um framework javascript, ou seja, nativamente já vem com integração para Ajax e outros recursos bem legais do Dojo mas prefiro trabalhar com jQuery que é mais leve, vai da sua escolha.
Inicialmente vamos descompactar o arquivo para uma pasta, recomendo ter um local especial, pois existe muita atualização.
Como a maioria dos frameworks, o ZF possui uma ferramenta que cria a estrutura básica de um projeto, chamado de Zend_Tool que não deixa de ser uma classe que pode ser customizada para sua necessidade ao criar seus projetos.
Esta ferramenta é bem simples, ela possui a capacidade de criar a estrutura para 1 novo projeto, de controller/model/view/action para 1 projeto e até módulos para projetos.
Iniciaremos o Prompt, através do Iniciar->Executar “cmd” ou simplismente WIN+R “cmd”.
Agora, vamos até “bin” que está na pasta onde descompactamos o ZF e pedimos para criar um novo projeto em uma pasta, como na imagem abaixo.
ps. sempre descompacto na minha pasta especifica dentro da minha estrutura de webserver pois atualizo com frequência.
Neste exemplo, usei a pasta D:\WebServer\www\projetoexemplo para criar meu projeto, agora vamos ver a estrutura inicial criada pelo Zend_Tool.
Bom, como visto ele cria a pasta application, public, library e tests na raiz. A pasta application é onde vai conter os arquivos do MVC, como visto, existem as pastas ‘controller’, ‘models’ e ‘views’. Inicialmente você não consegue trabalhar com módulos na estrutura padrão, é necessário alterar algumas coisas, o que veremos em um próximo post. Por hora, estaria tudo ok, se não fosse pelo seguinte fato, nos hosts brasileiros, a maioria não permite a pasta public_html(www) ou httpdocs acessar pastas anteriores, por questões de segurança. Então nosso “public” seria equivalente a 1 dessas pastas “public_html” ou “httpdocs” dependendo da sua estrutura de servidor (httpdos geralmente é usado em estruturas que usam Plesk, e public_html Cpanel), como você reparou, o public está no mesmo nível de “application” e “library” o que dificultaria as coisas quando nosso script fosse acessar arquivos nessas pastas.
obs: na pasta “public” existe um arquivo .htaccess para rewrite rules usado para url amigavel no qual a IDE que utilizo não está configurada pra mostrar.
Além disso, a pasta library vem vazia, pois é onde você vai colocar as bibliotecas que vai usar e também porque o ZF estima que seu php ta com um include_path dedicado ao ZF o que não é uma realidade comum.
O que costumo fazer é, copiar os arquivos da pasta public (index.php e .htaccess) para a pasta raiz do projeto, criar .htaccess para proteger as pastas application e library que uma vez estando na raiz, ficam vulneráveis, além de remover a tests e copiar toda a library para o library do projeto. Vejamos?
Bom, agora vamos começar a entender como o Zend Framework funciona.
Primeiramente, precisamos ajustar nosso index.php que tiramos da pasta public, para que os caminhos fiquem corretos, após isso vamos ajustar também o application.ini que é o coração do framework onde estão todas as informações de configuração, como paths, senha de banco de dados, configuração do php e outras variáveis.
index.php original
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(APPLICATION_PATH . '/../library'), get_include_path(), ))); /** Zend_Application */ require_once 'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run(); |
agora irei alterar algumas linhas, na verdade também adiciono outra, que é a ROOT_PATH, também poderia usar a $_SERVER['DOCUMENT_ROOT'] mas prefiro criar, também troco o APPLICATION_ENV padrão de “production” para “development” pois o Zend Framework permite você carregar configurações dinamicamente, ou seja, ter configurações especificas para ambiente de testes, desenvolvimento e produção ou criar um, veremos mais adiante.
Então, fica assim.
index.php alterado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php // Define path to root directory defined('ROOT_PATH') || define('ROOT_PATH', realpath(dirname(__FILE__))); // Define path to application directory define('APPLICATION_PATH', ROOT_PATH . '/application'); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); // Ensure library/ is on include_path set_include_path(implode(PATH_SEPARATOR, array( realpath(ROOT_PATH . '/library'), get_include_path(), ))); /** Zend_Application */ require_once 'Zend/Application.php'; // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run(); |
Bom, agora vamos proteger as pastas library e application colocando um arquivo .htaccess dentro delas.
Arquivo .htaccess
1 2 | Order allow,deny Deny from all |
Simples não? Agora só copiar para as pastas library e application.
Agora, faça o upload para um servidor ou rode localmente, acesse e deverá aparecer algo como abaixo:
Pronto! você acaba de “instalar” o Zend Framework. Nos próximos posts ensinarei o básico sobre Action/Views e Models além da estrutura modular.
Caso já queira ir tentando, na pasta views constam os arquivos de layout dos actions. Confira no IndexController.php dentro de controllers, crie uma função pública chamada testeAction, igual a indexAction. Vá em views e crie teste.phtml, coloque qualquer coisa e digite http://localhost/projetoexemplo/index/teste onde index é o controller e teste é o action.
Espero ter ajudado, até!


