开发基本的php框架

github路径:https://github.com/zhengchuzhou/easyPhpFramework

一、目录结构及用途

二、相关代码:

1、入口文件(index.php):

<?php
/**
 * 入口文件
 * 1、定义常量
 * 2、加载函数库
 * 3、启动框架
 */
define('ROOT', realpath('./'));
define('CORE', ROOT.'/core');
define('APP', ROOT.'/app');
define('MODULE', 'app');

include "vendor/autoload.php"; // 引入composer加载的类

define('DEBUG', true);
if (DEBUG) {
    $whoops = new WhoopsRun;
    $whoops->pushHandler(new WhoopsHandlerPrettyPageHandler);
    $whoops->register();
    ini_set('display_errors', 'On');
} else
    ini_set('display_errors', 'Off');

include_once CORE.'/common/function.php';
include_once CORE.'/core.php';

spl_autoload_register('corecore::load');

corecore::run();

2、公用函数库(function.php):

<?php
/**
 * 公告函数库
 */

function p($var)
{
    if (is_bool($var))
        var_dump($var);
    elseif (is_null($var))
        var_dump(NULL);
    else {
        echo "<pre style='position:relative; z-inenx: 1000; padding: 10px; border-radius: 5px; background: #F5F5F5; 
        border: 1px solid #aaa; font-size: 14px; line-height: 18px; opacity: 0.9;'>" . print_r($var, true) . "</pre>";
    }
}

 3、核心文件(core.php):

<?php
/**
 * 核心文件
 */
namespace core;

use coreliblog;

class core
{
    public $assign = [];
    static public function run()
    {
        log::init();
        $route = new corelib
oute();

        $controller = $route->controller;
        $action = $route->action;
        $file = APP.'/controller/'.$controller.'Controller.php';
        $class = '\'.MODULE.'\controller\'.$controller.'Controller';
        if (is_file($file)) {
            include_once $file;
            $class = new $class();
            $class->$action();
        } else
            throw new Exception('找不到控制器:'.$controller);
    }

    static public function load($class)
    {
        //  自动加载类库
        $class = str_replace('\', '/', $class);
        $file = ROOT.'/'.$class.'.php';
        if (is_file($file))
            include_once $file;
        else
            return false;
    }

    public function assign($name, $value)
    {
        $this->assign[$name] = $value;
    }

    public function display($file)
    {
        $file = APP.'/view/'.$file.'.php';
        if (is_file($file)) {
            extract($this->assign);
            include $file;
        } else
            throw new Exception('找不到该视图文件');
    }
}

4、路由文件(route.php):

<?php
/**
 * 路由文件
 */
namespace corelib;
use corelibconf;

class route
{
    public $controller;
    public $action;
    public function __construct()
    {
        $uri = $_SERVER['REQUEST_URI'];
        if (isset($uri) && $uri != '/') {
            $uriArr = explode('/', trim($uri, '/'));
            if (isset($uriArr[0])) {
                $this->controller = $uriArr[0];
                unset($uriArr[0]);
            }
            if (isset($uriArr[1])) {
                $this->action = $uriArr[1];
                unset($uriArr[1]);
            }
            else
                $this->action = conf::getConf('ACTION', 'route');
            //  uri多余部分转化成GET
            for ($i = 2; $i < count($uriArr) + 2; $i += 2)
                isset($uriArr[$i + 1]) ? $_GET[$uriArr[$i]] = $uriArr[$i + 1] : '';
        } else {
            $this->controller = conf::getConf('CONTROLLER', 'route');
            $this->action = conf::getConf('ACTION', 'route');
        }
        log::log('controller:'.$this->controller.', action:'.$this->action.', get:'. json_encode($_GET));
    }
}

5、数据库模型类(model.php):

<?php
/**
 * model类
 */
namespace corelib;
use corelibconf;

class model extends PDO
{
    public function __construct()
    {
        try {
            $conf = conf::getAll('db');
            parent::__construct($conf['DSN'], $conf['USERNAME'], $conf['PASSWD']);
        } catch (PDOException $e) {
            p($e->getMessage());
        }
    }
}

6、配置文件类(conf.php):

<?php
/**
 * 配置类
 */
namespace corelib;

class conf
{
    static public $conf = [];
    static public function getConf($name, $file)
    {
        /**
         * 1、判断文件是否存在
         * 2、判断配置是否存在
         * 3、缓存配置
         */
        $conf = self::getAll($file);
        if (isset($conf[$name]))
            return $conf[$name];
        else
            throw new Exception('没有这个配置项'.$name);
    }

    static public function getAll($file)
    {
        /**
         * 1、判断文件是否存在
         * 2、缓存配置
         */
        if (!isset(self::$conf[$file])) {
            $path = ROOT.'/core/config/'.$file.'.php';
            if (!is_file($path)) {
                throw new Exception('找不到配置文件:'.$file);
                die();
            } else {
                self::$conf[$file] = include $path;
            }
        }
        return self::$conf[$file];
    }
}

7、日志类(log.php):

<?php
/**
 * 日志类
 */
namespace corelib;
use corelibconf;

class log
{
    static public $class;
    /**
     * 1、确定日志存储方式
     * 2、写日志
     */
    static public function init()
    {
        //  确定存储方式
        $drive = conf::getConf('DRIVE', 'log');
        $class = 'coreliblog\'.$drive;
        self::$class = new $class;
    }

    static public function log($message, $file = 'log')
    {
        self::$class->log($message, $file);
    }
}

8、文件日志驱动类(file.php):

<?php
namespace coreliblog;

use corelibconf;

class file
{
    public $path;
    public function __construct()
    {
        $this->path = conf::getConf('OPTION', 'log')['PATH'].date('Ymd').'/';
    }

    public function log($message, $file = 'log')
    {
        /**
         * 1、确定日志存储目录是否存在
         *  不存在,新建目录
         * 2、写入日志
         */
        if (!is_dir($this->path))
            mkdir($this->path, '0777', 'true');
        $message = date('Y-m-d H:i:s') . ' ' . json_encode($message) . PHP_EOL;
        file_put_contents($this->path.$file.'.php', $message, FILE_APPEND);
    }
}

9、相关的配置文件:

数据库配置文件(db.php):

<?php
/**
 * 数据库配置文件
 */
return array(
    'DSN' => 'mysql:host=localhost; dbname=test',
    'USERNAME' => 'root',
    'PASSWD' => 'xy123456'
);

日志配置文件(log.php):

<?php
/**
 * 日志配置文件
 */
return array(
    'DRIVE' => 'file',
    'OPTION' => [
        'PATH' => ROOT.'/log/'
    ]
);

路由配置文件(route.php):

<?php
return array(
    'CONTROLLER' => 'index',
    'ACTION' => 'index'
);

 三、nginx配置,优化url路径

if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php/$1 last;
}

四、配置composer,加载php扩展

{
    "name": "TEST PHP",
    "description": "PHP Framework",
    "type": "Framework",
    "keywords": [
        "PHP", "PHP Framework"
    ],
    "require": {
        "php": ">= 5.3.0",
        "filp/whoops": "*",
        "symfony/var-dumper": "*",
        "catfan/medoo": "*"
    }
}

原文地址:https://www.cnblogs.com/zhengchuzhou/p/9762210.html