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 \Whoops\Run;
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$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('\core\core::load'); \core\core::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 core\lib\log; class core
{
public $assign = [];
static public function run()
{
log::init();
$route = new \core\lib\route(); $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 core\lib;
use \core\lib\conf; 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 core\lib;
use \core\lib\conf; 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 core\lib; 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 core\lib;
use \core\lib\conf; class log
{
static public $class;
/**
* 1、确定日志存储方式
* 2、写日志
*/
static public function init()
{
// 确定存储方式
$drive = conf::getConf('DRIVE', 'log');
$class = '\core\lib\log\\'.$drive;
self::$class = new $class;
} static public function log($message, $file = 'log')
{
self::$class->log($message, $file);
}
}

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

<?php
namespace core\lib\log; use core\lib\conf; 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": "*"
}
}

开发基本的php框架的更多相关文章

  1. ASP.NET MVC5 网站开发实践(一) - 项目框架

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...

  2. plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布

    在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而 ...

  3. Asp.net Mvc模块化开发之分区扩展框架

    对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...

  4. ASP.NET MVC5 网站开发实践(一) - 项目框架(转)

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过“摸着石头过河”吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依 ...

  5. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

  6. 10个用于Web开发的最好 Python 框架

    Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...

  7. iOS开发之常用第三方框架(下载地址,使用方法,总结)

    iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. ...

  8. Android开发中用到的框架、库介绍

    Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...

  9. 开发自己PHP MVC框架(一)

    本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials 这 ...

  10. Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架

    Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...

随机推荐

  1. bzoj 2152: 聪聪可可【点分治】

    裸的点分治,运算在模3下进行然后统计答案的时候统计余1的*余2的*2+余0的^2 #include<iostream> #include<cstdio> using names ...

  2. [AHOI2007]密码箱

    Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可 ...

  3. get和post中文乱码原理相关博客

    博客一:  http://blog.csdn.net/saygoodbyetoyou/article/details/16834395 博客二: http://www.jb51.net/article ...

  4. 使用mysql实现mybatis的分页效果

    1.mybatis.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configur ...

  5. Android系统的启动流程

    手机启动后首先会通过执行BootLoader来启动Linux内核,BootLoader是所有嵌入式设备开机启动执行的第一行代码,linux内核在启动过程中会加载各种设备的驱动同时初始化数据结构,并且开 ...

  6. Asp.Net识别手机访问

    在VS创建WEB应用程序时会有一个微软开发的典型web应用程序 在根目录有个用户控件用来实现切换手机和电脑 其中有个微软开发的类和方法用来专门判断移动设备和桌面设备 在Microsoft.AspNet ...

  7. AJPFX关于abstract的总结

    抽象类: abstract抽象:不具体,看不明白.抽象类表象体现.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所 ...

  8. 腾讯云COS对象存储的简单使用

    叮当哥之前买了一年的腾讯云服务器,昨日偶然发现腾讯云送了叮当哥半年的cos对象存储服务器,于是就撸起袖子传了几张珍藏的高清大图上去,现将其上传的简单使用步骤总结一波(其它操作参加官方SDK文档API) ...

  9. (五)Mybatis总结之一对多、一对一

    一对多 业务场景:张三既是java开发师又是大学老师又是LOL代练,张三拥有多个角色. 1.创建实体类UserInfo和RoleInfo package com.qf.mybatisdemo.pojo ...

  10. UnixTime的时间戳的转换

    public static string XConvertDateTime(double unixTime) { System.DateTime time = System.DateTime.MinV ...