开发基本的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 \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框架的更多相关文章
- ASP.NET MVC5 网站开发实践(一) - 项目框架
前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...
- plain framework 1(简约框架)一款主要用于网络(游戏)开发的C/C++框架 即将开源发布
在我们的日常开发中,我们往往会遇到这种情况,当我们换了一个开发环境时很可能会重新利用一套新的框架进行开发.由于不同框架有着不同的接口,所以我们不得不花时间再次熟悉这些接口,这将造成开发时间上的重复,而 ...
- Asp.net Mvc模块化开发之分区扩展框架
对于一个企业级项目开发,模块化是非常重要的. 默认Mvc框架的AreaRegistration对模块化开发真的支持很好吗?真的有很多复杂系统在使用默认的分区开发的吗?我相信大部分asp.net的技术团 ...
- ASP.NET MVC5 网站开发实践(一) - 项目框架(转)
前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过“摸着石头过河”吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依 ...
- Windows上python开发--2安装django框架
Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...
- 10个用于Web开发的最好 Python 框架
Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...
- iOS开发之常用第三方框架(下载地址,使用方法,总结)
iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. ...
- Android开发中用到的框架、库介绍
Android开发中用到的框架介绍,主要记录一些比较生僻的不常用的框架,不断更新中...... 网路资源:http://www.kuqin.com/shuoit/20140907/341967.htm ...
- 开发自己PHP MVC框架(一)
本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials 这 ...
- Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架
Phaser是一款专门用于桌面及移动HTML5 2D游戏开发的开源免费框架,提供JavaScript和TypeScript双重支持,内置游戏对象的物理属性,采用Pixi.js引擎以加快Canvas和W ...
随机推荐
- 你想要的sublime、webstorm、vi/vim不得不用的快捷键【简报】【实用】
你想要的sublime.webstorm.vi/vim不得不用的快捷键[简报][实用] 话不多说,马上走起: Sublime Text: ctrl+d alt+f3全选 ctrl+shift+’ ...
- 用GitHub来展示前端页面
github是一个很好的代码管理与协同开发平台,在程序界又被称为最大的“同性交友网站”.如果你不懂git,没有自己的github账户,那你就丢失了一把能够很好的展示自我,储存知识的利器. 当然知道gi ...
- linux 安装和远程连接
准备工作: 1.请安装好vmware 软件 2.linux 镜像包 3.putty 远程连接工具 任务: 设置好root 账号和普通账号 及设置网络 连接最简单使用桥接 只能ping 通 本机 nat ...
- [App Store Connect帮助]七、在 App Store 上发行(3.3)提交至“App 审核”:解决 App 拒绝问题
如果“App 审核”或“Beta 版 App 审核”拒绝了您的 App,您可以与 Apple 沟通并在解决方案中心中解决问题. 来自 Apple 的通讯信息包含有关 App 拒绝的信息,其中包括该 A ...
- ES高级查询
Query Content 在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件的匹配有多好 # POST 192.168.100.1 ...
- 打开CAD时出现“acvmtools.arx ARX命令中发生异常
打开CAD时出现“acvmtools.arx ARX命令中发生异常 解决办法1: 试试进入CAD安装的目录,删掉它acvmtools.arx,重新打开cad.(注:acvmtools.arx一 ...
- CF1140G Double Tree
题解 首先如果我们要确定出每个\(dis_{i \to i+1 , i \in odd}\) 这个可以用两遍树形\(DP\)来解决 一遍是考虑走子树子树绕过来的 一遍是考虑从走祖先绕过来的 然后就可以 ...
- NDK(18)eclipse 使用C++ STL
1.引用库 在Application.mk 中使用 APP_STL := stlport_static 等. APP_ABI := x86 armeabi APP_PLATFORM := androi ...
- MyEclipse开启Jquery智能提示
myeclipse 增加javascript提示和jquery提示等不用安装插件自带功能 (对着需要提示的项目右键,点击properties) 不行的话就得安装插件: http://www.spket ...
- js内置对象总结
在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变量(如var i="aaa"),所有变量都有对象的性质. 注意:通过字面量创建的对象在调用属性 ...