dfgstudio / dfg_fw
Requires
- php: >=5.6.0
- doctrine/annotations: 1.4.*
- doctrine/dbal: 2.5.4
- doctrine/orm: 2.5.6
- phpmailer/phpmailer: ~5.2
- symfony/serializer: 3.*
- symfony/yaml: 2.*
README
PHP DFG 框架
我们推出了用于 PHP 快速开发的 DFG 框架。此框架的主要目标是
- 在 MVC 标准下简化开发
- 简化资源路由
- 简化使用 Doctrine 框架访问数据
该框架使用 LGPL v2.1 许可。其源代码是开源的,可在 GitHub 上免费使用和修改。欢迎提出建议 :)
版本
v1.9 [最新]
添加了字符串转换为日期和日期时间的转换方法
v1.8
添加了 ImageResize 类以进行图像缩放
v1.7
添加了 Symfony Serializer 作为依赖项
v1.6
在发送电子邮件时选择模板
v1.5
支持通过 routing.php 进行配置的 RestFul 操作
v1.4
在电子邮件实用工具中添加了发送附件的选项
v1.3
添加了 YEAR (MySQL) 函数
v1.2
更新了 Util 类
v1.1
加载实体和外部服务
v1.0
框架的第一个稳定版本
安装
DFG_FW 在 Composer/Packgist 上可用,只需将其添加到项目的 composer.json
文件中即可
"dfgstudio/dfg_fw": "1.*"
或是在终端中
composer require dfgstudio/dfg_fw
文件结构应该是这样的
- 项目根目录
- [D] app
- [D] controllers: 控制器目录 (MVC 控制器)
- [D] models: 数据库实体 (MVC 模型)
- [D] services: 实体服务类 (通过实体进行数据访问和管理)
- [D] templates: 页面 模板
- [D] views: 用于显示生成内容的页面 (MVC 视图)
- [D] config
- [F] config.php: 项目配置
- [F] routing.php: 项目路由
- [D] resources: 通用文件 (文本文件、电子邮件发送模板等)
- [D] tmp*: 临时文件
- [D] cache*: 缓存文件
- [D] webapp: 网页文件 (公开访问)
- [D] app
[D] 目录
[F] 文件
* 自动创建的目录
接下来,需要在项目根目录下创建 .htaccess
文件,如下所示:
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ webapp/ [L] RewriteRule (.*)/$ webapp/$1 [L] RewriteRule (.*) webapp/$1 [L] </IfModule>
如果需要,可以在 .htaccess
文件中添加内容,只要保持上述基本重定向信息即可。
还应该在 webapp 中创建 .htaccess
文件。
<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>
如所见,上述规则将重定向到两个文件:webapp/index.php
和 webapp/error.php
。第一个文件包含框架的初始指令,应该是:
<?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');
第二个文件包含项目的错误页面,可以自由创建,使用发送的参数 err
来识别错误。
config/config.php
文件包含项目的配置,如下例所示:
<?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');
配置完成后,需要在 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
注意:未指定任何控制器的请求将被重定向到主控制器。同样,未指定动作时,将调用主动作。
完成重定向后,需要创建一个控制器,扩展 DFG_FW 的 DefaultController 类。
<?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); } }
templates/index.php
模板的示例可能如下所示:
<!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>
views/home/index.php
页面的示例可能如下所示:
<? //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(); ?>
有关方法的更多信息,可以在项目附带的文档中找到。
计划更新
- 原生认证方法(HTTP Basic / 数据库)
- 原生验证方法
- 原生消息发送
- 原生 "Access-Control-Allow-Origin" 控制
- 原生 JSON 和图像打印方法
- PHPUnit 测试
如何为项目做出贡献?
通过捐赠 点击这里 或成为项目的审稿人/编辑(联系我们加入编辑团队)。
关于我们和联系方式
Facebook: https://#/dfgstudio
给我们反馈: talk@dfgstudio.com.br