DFG Framework for PHP
Apresentamos o Framework DFG para desenvolvimento ágil em PHP. Os principais objetivos desse framework são:
- Desenvolvimento simplificado no padrão MVC
- Roteamento facilitado dos recursos
- Utilização simplificada do framework Doctrine no acesso a dados
O framework utiliza a licença LGPL v2.1. Seu código-fonte é aberto e disponível no GitHub sendo de livre utilização e modificação. Sugestões são sempre bem vindas :)
Adição de métodos de transformação de strings em date e datetime
Adição da classe ImageResize para redimensionamento de imagens
Adição de Symfony Serializer nas dependências
Escolha do template no envio dos e-mails
Suporte a operações RestFul com configuração via routing.php
Adição da opção para envio de anexos no utilitário de e-mails
Adição da função YEAR (MySQL)
Atualizações na classe Util
Carregamento de entidades e serviços externos
Primeira versão estável do framework
DFG_FW está disponível no Composer/Packgist, bastando adicionar a seguinte instrução ao arquivo composer.json
de seu projeto:
"dfgstudio/dfg_fw": "1.*"
ou no terminal
composer require dfgstudio/dfg_fw
A estrutura de arquivos deve ser a seguinte:
- Raiz do projeto
- [D] app
- [D] controllers: diretório dos controladores (controllers MVC)
- [D] models: entidades do banco de dados (models MVC)
- [D] services: classes de serviço das entidades (acesso e gerenciamento dos dados por meio das entidades)
- [D] templates: templates das páginas
- [D] views: páginas para exibição do conteúdo gerado (views MVC)
- [D] config
- [F] config.php: configuraçõo do projeto
- [F] routing.php: roteamento do projeto
- [D] resources: arquivos gerais (arquivos .txt, templates para envio de e-mails, etc.)
- [D] tmp*: arquivos temporários
- [D] cache*: arquivos de cache
- [D] webapp: arquivos web (acesso livre)
- [D] app
[D] Diretórios
[F] Arquivos
* Diretórios criados automaticamente
Em seguida, deve ser criado o arquivo .htaccess
na raiz do projeto como:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ webapp/ [L]
RewriteRule (.*)/$ webapp/$1 [L]
RewriteRule (.*) webapp/$1 [L]
</IfModule>
Caso necessite, adições podem ser feitas no .htaccess
, desde que se mantenha o redirecionamento básico informado acima.
Também deve ser criado o arquivo .htaccess
em webapp:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [PT,L,QSA]
ErrorDocument 400 error.html?err=404
ErrorDocument 401 error.html?err=401
ErrorDocument 403 error.html?err=403
ErrorDocument 404 error.html?err=404
ErrorDocument 500 error.html?err=500
ErrorDocument 503 error.html?err=503
</IfModule>
Como pode ser visto, a regra acima faz o redirecionamento para dois arquivos: webapp/index.php
e webapp/error.php
. O primeiro contém a instrução inicial do framework, que deve ser:
<?php
define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(dirname(__FILE__)));
require_once(ROOT . DS . 'vendor' . DS . 'dfgstudio' . DS . 'dfg_fw' . DS . 'src' . DS . 'init.php');
Já o segundo arquivo contém a página de erro do projeto, podendo ser criado livremente utilizando o parâmetro enviado err
para identificar o erro encontrado.
O arquivo config/config.php
contém as configurações do projeto, conforme o exemplo:
<?php
//Ambiente de desenvolvimento (ativa ou não a exibição de erros)
define('DEVELOPMENT_ENVIRONMENT', true);
//Timezone
date_default_timezone_set("America/Sao_Paulo");
//Configurações do banco de dados
define('DB_DRIVER', 'pdo_mysql');
define('DB_HOST', '127.0.0.1');
define('DB_NAME', 'meudb');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_CHARSET', 'latin1');
define('DB_OPTIONS', serialize(array(
1002 => 'SET NAMES utf8'
)));
//É possível definir a utilização de entidades e serviços externos por meio das seguintes constantes
define('ENTITY_DIR', ROOT . DS . '../<MINHA BIBLIOTECA>/app/models/');
define('SERVICE_DIR', ROOT . DS . '../<MINHA BIBLIOTECA>/app/services/');
//Configurações do serviço de e-mail
define('EMAIL_HOST', 'meuservidorsmtp.com.br');
define('EMAIL_PORT', '587');
define('EMAIL_USER', 'meuemail@teste.com.br');
define('EMAIL_PASSWD', 'minhasenha');
define('EMAIL_NOREPLY', 'meuemail@teste.com.br');
//Chave de criptografia (16 caracteres)
define('SECURITY_KEY', '1234567890ABCDFG');
//Context path
define('CONTEXT_PATH', 'http://meuprojeto.com.br/');
//Paginação
define('PAGINATE_LIMIT', '20');
define('PAGINATE_MAX_LNKS', '5');
//Header charset
header('Content-Type: text/html; charset=UTF-8');
setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese');
Feitas as configurações, é necessário definir as regras de roteamento no arquivo config/routing.php
:
<?php
$routing = array(
/**
** Padrão das regras:
** '<REGRA>' => '<CONTROLADOR>/<ACAO>/<PARAMETRO 1>/<PARAMETRO 2>/<PARAMETRO N>'
** ou
** '[<METODO>, <REGRA>]' => '<CONTROLADOR>/<ACAO>/<PARAMETRO 1>/<PARAMETRO 2>/<PARAMETRO N>'
** - Os parâmetros são escritos utilizando PHP regex
** - O nome do controlador corresponde ao nome da classe com o primeiro caractere minúsculo e sem o sufixo "Controller"
** - O nome da ação corresponde ao nome do método do controlador com o primeiro caractere minúsculo
**/
//HOME
'/^$/' => 'home/main', //Corresponde a URL "<ENDEREÇO DO SITE'>/"
'/^home$/' => 'home/main', //Corresponde a URL "<ENDEREÇO DO SITE'>/home"
//Exemplo de listagem
'/^produtos$/' => ['GET' => 'produto/main'], //Corresponde a URL "<ENDEREÇO DO SITE'>/produtos"
'/^produtos\/([0-9]+)$/' => ['GET' => 'produto/main/\1''] //Corresponde a URL "<ENDEREÇO DO SITE'>/produtos/2", onde 2 é o número da página atual
);
$default['controller'] = 'home'; //controller principal
$default['action'] = 'main'; //ação principal
Obs: Requisições que não informem nenhum controlador serão direcionadas ao controlador principal. Do mesmo modo, quando não for informada ação, será chamada a ação principal.
Feito o redirecionamento, deve ser criado um controlador, extendendo a classe DefaultController do DFG_FW:
<?php
/**
** Controller de gerenciamento da página principal
** @author DFG Studio
**/
class HomeController extends DefaultController {
//Define o arquivo de template utilizado. No exemplo: templates/index.php
//Se o valor de $template_file for vazio, nenhum template será utilizado
protected $template_file = 'index';
/**
** O método main é automaticamente redirecionado para views/home/main.php, seguindo o padrão views/<CONTROLADOR>/<AÇÃO>
**/
function main() {
//O redirecionamento pode ser evitado alterando a flag de renderização para 0 (o padrão é 1)
$this->render = 0;
//Abaixo estão exemplos de métodos dos controladores
//Obtém o Doctrine Entity Manager
$em = $this->getEntityManager();
//Obtém a flag de renderização
$render = $this->getRender();
//Envia uma variável para a view
$this->set('variavel', $valor);
//Obtém o valor de uma variável
$valor = $this->get('variavel');
//Obtém o valor de um parâmetro (GET ou POST)
$param = $this->getParameter('parametro');
//Altera a ação atual (somente a página de destino)
$this->redirect($action);
//Altera a ação atual (chamando nova execução do método no controlador)
$this->redirectAction($action);
//Altera momentaneamente o arquivo de template
$this->setTemplate($template_file);
//Altera momentaneamente a flag de renderização
$this->setRender($render);
}
}
Um exemplo do template templates/index.php
pode ser dado por:
<!DOCTYPE html>
<html>
<head>
<title>DFG Studio</title>
<?
//Inclui o arquivo compartilhado do template templates/shared/head.php
$template->requiref('shared' . DS . 'head.php');
?>
</head>
<body>
<?
//Renderiza o código gerado pelo controlador e pela página correspondentes
$template->render();
?>
</body>
<?
//Inclui o arquivo compartilhado do template templates/shared/js.php
$template->requiref('shared' . DS . 'js.php')
?>
<?
//Imprime o código javascript coletado nas páginas a fim de organizá-lo no fim da página
$html->printCollectedJs();
?>
</html>
Um exemplo da página views/home/index.php
poderia ser:
<?
//Atalho para <link rel="stylesheet" type="text/css" href="<CONTEXT_PATH>res/css/meucss.css" media="screen" />
$html->includeCss('meucss', 'screen');
?>
<main>
<div class="container">
Meu conteúdo
</div>
</main>
<?
//Inicia a coleta do javascript para organização
$html->startCollectJs();
//Atalho para <script src="<CONTEXT_PATH>/res/js/meujs.js"></script>
$html->includeJs('meujs');
//Finaliza a coleta do javascript para organização
$html->stopCollectJs();
?>
Mais informações sobre os métodos podem ser obtidos na documentação que acompanha o projeto.
- Métodos nativos de autenticação (HTTP Basic / Via banco de dados)
- Métodos nativos de validação
- Envio nativo de mensagens
- Controle nativo de "Access-Control-Allow-Origin"
- Métodos nativos de impressão para JSON e imagens
- Testes com PHPUnit
Por meio de doações clicando aqui ou sendo um revisor/editor do projeto (entre em contato para integrar nosso time de editores).
Facebook: https://www.facebook.com/dfgstudio
Mande-nos seu feedback: talk@dfgstudio.com.br