Getting Started

Postado 24 de abril de 2010 Por Marco A. Braghim

Aprendendo a Usar Codepass Framework

Então vamos dar os primeiros passos com nosso framework, está empolgado? É melhor estar… Pelo caminho você vai notar várias e várias semelhanças entre Codepass Framework e Zend Framework. Isso é proposital e nos proporciona, amantes de Zend, uma agilidade a mais para aprender esse novo framework. O que acontece é que Zend é realmente um framework excelente, o que leva a não utilização dele em muitos casos é o fato dele ser muito pesado (cerca de 25Mb – Perfeito para grandes aplicativos), enquanto Codepass é extremamente leve.

Ressalto o fato de que SEMELHANÇA não significa CÓPIA de código, mas se não confia em minhas humildes palavras, por gentileza abra os códigos Zend e confira by yourself!

Enfim, vamos ao que interessa… Nós realmente queremos facilitar o trabalho para você e para isso criamos o que chamamos de BaseProject que nada mais é do que um aplicativo pronto e sem conteúdo. Clique Aqui para baixar um BaseProject prontinho e com a versão mais nova de Codepass Framework.

Agora, se o que voce quer mesmo é aprender e entender como funciona a estrutura do negócio continue lendo…

Entendendo o Framework

Este post é ENORME, utilize o índice!

Estrutura

Bem, em primeiro lugar vamos organizar nossas pastas para alocar nossos arquivos. Você verá na sequência que pode alterar essa estrutura a sua necessidade, mas aí é seu critério…

Codepass Framework - Estrutura

Perceba na figura que o arquivo index.php se localiza dentro da pasta public, lhe pergunto meu querido amigo, porque? É muito simples, você vai apontar seu DocumentRoot para cá, ou seja, ninguém no mundo inteiro terá acesso a qualquer outro arquivo que não estiver dentro desta pasta. Se algum espertinho usar um comando do tipo wget para baixar pastas e arquivos desprotegidos baixará apenas o que está aqui, nada que comprometa seu aplicativo…

- Ohhhh, é verdade! =O

- Já havia pensado nisso? Pois é, o Zend sim! Boas idéias devem ser mantidas meu caro!

Dentro desta pasta (public) você vai colocar todos os arquivos que são, como o próprio nome diz, públicos. Imagens, arquivos de flash, javascripts, stylesheets, enfim… Perfeito não? ^^


Uma observação interessante a se fazer é que as outras pastas de seu projeto realmente não poderão ser acessadas de forma alguma, mas com um detalhe, se você permitir em qualquer lugar de seu aplicativo o upload de arquivos PHP não há santo que proteja seu aplicativo, a menos que você tenha premeditado isso.

Fique esperto!

htaccess

public/.htaccess
--
# Esta linha permite acesso a qualquer um
allow from all

# Esta linha esta ativando o modo de sobrescrita
# de url (Url’s amigaveis, precisaremos delas)
RewriteEngine On

# Estamos definindo aqui que tudo que nao for
# arquivo deve-se sobrescrever e direcionar para
# o arquivo index.php
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
				

Bem acho que dispensa comentários não é… Qualquer coisa pesquise sobre htaccess ou rewrite mod apache no Papai Google.

O Arquivo index.php

- “Ok, ok… Eu já sei a estrutura que preciso, já sei configurar o arquivo .htaccess, mas meu aplicativo ainda nao funciona!”

É eu sei… =S Então vamos por a mão na massa…


Basicamente, o que você tem que fazer é instanciar a class Codepass_loader, setar as configurações iniciais e rodar seu aplicativo utilizando objeto run

Rápido demais? Tudo bem, eu explico… Comece incluindo o arquivo Loader.php dentro da biblioteca Codepass e instanciando a classe Codepass_Loader no seu arquivo index.php:

public/index.php

	include_once '../library/Codepass/Loader.php';

	$application = new Codepass_Loader();
				

Agora utilize a função get_class_methods() do php para listar os métodos disponíveis na classe Codepass_Loader

public/index.php

	include_once '../library/Codepass/Loader.php';

	$application = new Codepass_Loader();

	echo '<pre>';
	var_dump(get_class_methods($application));
				

O resultado será:

array(12) {
  [0]=> string(10) "setLibrary"
  [1]=> string(10) "getLibrary"
  [2]=> string(10) "setIniFile"
  [3]=> string(10) "getIniFile"
  [4]=> string(14) "setEnvironment"
  [5]=> string(14) "getEnvironment"
  [6]=> string(12) "setDbConfigs"
  [7]=> string(12) "getDbConfigs"
  [8]=> string(11) "startLayout"
  [9]=> string(17) "setSessionConfigs"
  [10]=> string(17) "getSessionConfigs"
  [11]=> string(3) "run"
}
				

Bom, pelo menos na maioria dos casos acima dispensamos comentários neh!? Não? Então vamos dar uma breve explicação…

Para “dizer” ao aplicativo onde estão os arquivos Codepass e/ou outras bibliotecas de classes utilize setLibrary(‘string’), para capturar devolta essa string utilize getLibrary(). Lembre-se que o padrão é ‘../library/’, portanto se você não alterar a estrutura do exemplo não precisará mexer aqui.

Utilize setIniFile(‘string’) e getIniFile() para setar e capturar o arquivo de configurações principais. O padrão é ‘../configs/application.ini’, portanto se você não alterar a estrutura do exemplo não precisará mexer aqui.

setEnvironment(‘string’) e getEnvironment() para setar e recuperar o ambiente de desenvolvimento. Por padrão utilizamos a string ‘production’. Entenderemos melhor esse método quando formos configurar o arquivo application.ini

startLayout(‘string’) é um objeto importantíssimo! É através dele que definimos ao aplicativo qual será o arquivo utilizado para layout geral do sistema… Quando este objeto não é setado o sistema não utiliza nenhum layout padrão. Setando ou não um layout padrão você pode alterá-lo na mão dentro de cada controlador, na ação ou no método init()

Vejamos então o objeto setSessionConfigs(array) – Todos os parâmetros do array são opcionais…

public/index.php

$application->setSessionConfigs(
	array(
		// SEGUNDOS de duração das sessões do sistema
		'session_timelife' => 20,

		// Local onde salvar os arquivos de sessão
		'session_save_path' => '../arquivos/sessions/',

		// SEGUNDOS limite para login do usuário expirar
		'auth_expire' => 5
	)
);
				

Caraca! Ta quase pronto, falta apenas explicar como setar as configurações de banco de dados e o objeto run()… =D

Muito bem, Codepass Framework trabalha com PHP PDO, ou seja, está preparado para interagir com qualquer tipo de base de dados sem problema nenhum

=O

Para configurar o método setDbConfigs(array $params, $driver = ‘PDO_MYSQL’) precisamos passar o array com as configurações (host, dbname, username, password, port) e o tipo de adaptador que queremos usar (PDO_MYSQL, PDO_DBLIB, PDO_FIREBIRD, PDO_IBM, PDO_INFORMIX, PDO_OCI, PDO_ODBC, PDO_PGSQL, PDO_SQLITE ou PDO_4D), por padrão PDO_MYSQL.

A seguir o código NÃO RECOMENDADO das configurações de banco de dados padrão do sistema.

public/index.php

$application->setDbConfigs(
	array(
		'host' =>	'localhost',
		'dbname' =>	'meusite',
		'username' =>	'root',
		'password' =>	'',
		'port' => 3306
	),
	'PDO_MYSQL'
);
				

Porquê esse código não é recomendado?

Em primeiro lugar pq ele vai ficar na pasta public… Senha numa pasta pública? Acho que não neh!?

=/

Em segundo lugar porque você provavelmente vai usar seu aplicativo em outro ambiente (produção, homologação). Assim nesse caso teria que ficar alterando na mão a configuração do banco de dados…

Segue agora então o código RECOMENDADO!

configs/database.ini

[development]
driver = PDO_MYSQL
params.host = localhost
params.username = root
params.password =
params.dbname = mydbname
params.port = 3306

[production]
driver = PDO_MYSQL
params.host = localhost
params.username = root
params.password = mypwd
params.dbname = mydbname
params.port = 3306
				

Note que temos uma chave “development” e uma chave “production”. Isso é o ambiente de execução que você setou acima, lembra? $application->setEnvironment(‘production’) ou $application->setEnvironment(‘development’)…

public/index.php

// Primeiro vamos recuperar a instância da classe Codepass_Configs
// Esta classe tem o poder de armazenar conteudos de arquivos INI
// para serem recuperados em qualquer lugar do aplicativo
$configs = Codepass_Configs::getInstance();

// Adicionamos a ela uma configuração. Para isso basta darmos um nome
// a esta configuração e passarmos o caminho do arquivo onde
// se encontram
$configs->addConfig(
	array('DB' => '../configs/database.ini')
);

// Recuperamos as configurações de banco de dados de acordo com o
// ambiente de desenvolvimento
$db = $configs->getConfigs(
	array('DB', $configs->getEnvironment())
);

// Seta configurações recuperadas no objeto setDbConfigs()
$application->setDbConfigs($db['params'], $db['driver']);
				

Lindo!! Agora é so rodarmos nosso aplicativo utilizando o método run! =D

É isso aí, agradecimentos a equipe técnica… O que? Não funcionou? Mas… Como?… Ahhh é claro, não configuramos os aquivos INI ainda, nem sabemos como fazer isso… ”/ Ok, ok, suspende o lanche…

O arquivo configs/application.ini

Ali em cima você pode notar que utilizamos um arquivo INI para setar as configurações de banco de dados de forma rápida e simples não é mesmo? Pois bem, vamos agora configurar o arquivo application.ini que é o arquivo que comanda a parada…

Nele, vamos setar as configurações de pastas de controladores, models, views e layouts além das configurações de erros do sistema de acordo com o ambiente de execução do aplicativo.

configs/application.ini
--
[paths]
application.controllers = "../application/controllers/"
application.models = "../application/models/"
application.views = "../application/views/scripts/"
layout.path = "../application/views/layouts/"

[development]
errors.reporting = E_ALL
errors.display = 1

[production]
errors.reporting = 0
errors.display = 0
				

O índice “paths” dispensa comentários não é? São os caminhos para as camadas MVC e arquivos de layout.

A parte legal mesmo está um pouquinho mais para baixo, nos índices “development” e “production”. Esses meu caro, são os ambientes de execução de nosso aplicativo, que são setados através do objeto Codepass_Loader::setEnvironment(‘string’) no arquivo public/index.php. Você pode criar quantos índices (ambientes) quiser, por exemplo, você pode ter um índice “homologacao” que será um ambiente o mais parecido possível com “production”, geralmente usado para teste ou para mostrar a um cliente etc…

Quando você estiver desenvolvendo seu aplicativo localmente deixará o environment setado como ‘development’, assim os erros do sistema, como setado no arquivo configs/application.ini, aparecerão na tela quando ocorrerem, mas quando for subir seu aplicativo, você setará como ‘production’ e os erros ficarão invisíveis para o usuário.

Além do mais, como utilizamos um arquivo INI específico para banco de dados e também com índices de ambiente de desenvolvimento, Não precisaremos mudar online cada configuração do database, pois através do índice escolhido o próprio aplicativo usará o banco correto.

Prático não? =D

Ok, vamos agora rodar nosso aplicativo para ver se funciona!

Codepass_Exception' with message 'Wrong class name on file
../application/controllers/ErrorController.php, use ErrorController
				

Ops, não configuramos os controladores ainda… =/

Controladores

O primeiro controlador que precisamos configurar é o ErrorController, pois é ele quem gerenciará os erros do sistema como por exemplo um erro de página não encontrada 404. Esse controlador é padrão do sistema, ou seja, obrigatório! O sistema não funcionará sem ele! Alguém tem que fazer o trabalho sujo não é mesmo? =/

Antes de começarmos a escrever o código vamos entender o que são controladores… Controladores é uma camada MVC que faz a comunicação entre o banco de dados e os dados que serão exibidos na tela, mais ou menos da seguinte forma…

Estrutura MVC

O usuário envia um comando através da view para o controlador que vai tratar a “pergunta” e “pedir” do banco de dados a resposta através da model. Retorna para o controlador que trata esse resultado e então repassa para a view que transforma o dado de linguagem de máquina para algo legível para um ser humano. Simples!

Segue o básico para qualquer controlador

application/controllers/IndexController.php

class IndexController extends Codepass_Controller_Settings
{
	/**
	 *	Este método é executado antes de qualquer ação
	 */
	public function init() {

	}

	/**
	 *	Esta ação é executada ao digitar
	 *	http://seusite.com.br/index/index
	 * 	ou nada porque o padrão é index tanto
	 *	para controladores quanto para ações
	 */
	public function indexAction() {

	}

	/**
	 *	Esta ação é executada ao digitar
	 *	http://seusite.com.br/index/test
	 */
	public function testAction() {

	}
}
				

Quem está acostumado com Zend só precisa se ligar que a classe a quem o controlador extende é Codepass_Controller_Settings

Baixando o BaseProject você vai notar que já disponibilizamos um layout pronto para os erros do sistema.

Models

Não vamos falar sobre elas, afinal para começar não precisamos usar models… =D

As models são para fazer relacionamento com banco de dados, mas para mostrar o framework funcinando não precisamos de banco de dados… ^^

Views

Views… Ta aí um assunto bacana, simples e rápido…

As views são praticamente o html do aplicativo! Ou seja, depois que você tratar os dados no controlador esses têm que ter uma saída para o usuário que é o html. Tudo o que você através do objeto $this->view. Vou explicar de uma forma visual.

application/controllers/IndexController.php

class IndexController extends Codepass_Controller_Settings
{
	public function init() {}

	public function indexAction() {
		$data = array(
			'value' => 'Dado que quero passar para a view'
		);

		$this->view->data = $data;
	}
}
				

Fazendo isso, é só você recuperar na respectiva view (index/index.php)

application/views/scripts/index/index.php

<div>
	<?php echo $this->data['value']; ?>
</div>
				

That’s all folks!

É isso aí pessoal, agora já colocamos o framework para funcionar, usem e abusem, é muito importante para nós, do desenvolvimento, que você nos ajude reportando os bugs… Sácoméné!

Abraço a todos e não se esqueçam! Qualquer coisa é só mandar e-mail para marco@codepass.com.br… Flw! Vlw!

Deixe uma resposta

WP-Highlight