dfgstudio/dfg_fw

此包已被弃用且不再维护。作者建议使用 dfgstudio/dfg_fw 包。

PHP 框架 DFG

1.9.6 2018-08-23 17:35 UTC

README

PHP DFG 框架

DFG Studio

我们推出了用于 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] 目录

[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.phpwebapp/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 测试

如何为项目做出贡献?

通过捐赠 点击这里 或成为项目的审稿人/编辑(联系我们加入编辑团队)。

关于我们和联系方式

网站: http://dfgstudio.com.br

Facebook: https://#/dfgstudio

给我们反馈: talk@dfgstudio.com.br

许可证

GNU Lesser General Public License,版本 2.1