前段时间,ThinkPHP 的整体设计思路,包括 各个模块的实现。
TP官方为了测试该框架,写了一个ONEThink,是可以学习下的
不太推荐使用这个,感觉就是测试性质。但是你可以体会下他的设计思路,继续深化思考,就可以重新写一个适合自己的。
比如:测试各种环境,用数组组合一下数据信息
$items = array( 'os' => array('操作系统', '不限制', '类Unix', PHP_OS, 'success'),
'php' => array('PHP版本', '5.3', '5.3+', PHP_VERSION, 'success'),
'upload' => array('附件上传', '不限制', '2M+', '未知', 'success'),
'gd' => array('GD库', '2.0', '2.0+', '未知', 'success'),
'disk' => array('磁盘空间', '5M', '不限制', '未知', 'success'),
);
然后可以利用引用来实现数据的实时更改
foreach ($items as &$val)
再比如:自动化的一些思路,写好一部分配置文件或者SQL语句或者输出文件的模板,然后替换一部分信息
conf.tpl
// +----------------------------------------------------------------------/** * 系统配文件 * 所有系统级别的配置 */return array( /* 模块相关配置 */ 'AUTOLOAD_NAMESPACE' => array('Addons' => ONETHINK_ADDON_PATH), //扩展模块列表 'DEFAULT_MODULE' => 'Home', 'MODULE_DENY_LIST' => array('Common','User','Admin','Install'), //'MODULE_ALLOW_LIST' => array('Home','Admin'), /* 系统数据加密设置 */ 'DATA_AUTH_KEY' => '[AUTH_KEY]', //默认数据加密KEY /* 用户相关设置 */ 'USER_MAX_CACHE' => 1000, //最大缓存用户数 'USER_ADMINISTRATOR' => 1, //管理员用户ID /* URL配置 */ 'URL_CASE_INSENSITIVE' => true, //默认false 表示URL区分大小写 true则表示不区分大小写 'URL_MODEL' => 3, //URL模式 'VAR_URL_PARAMS' => '', // PATHINFO URL参数变量 'URL_PATHINFO_DEPR' => '/', //PATHINFO URL分割符 /* 全局过滤配置 */ 'DEFAULT_FILTER' => '', //全局过滤函数 /* 数据库配置 */ 'DB_TYPE' => '[DB_TYPE]', // 数据库类型 'DB_HOST' => '[DB_HOST]', // 服务器地址 'DB_NAME' => '[DB_NAME]', // 数据库名 'DB_USER' => '[DB_USER]', // 用户名 'DB_PWD' => '[DB_PWD]', // 密码 'DB_PORT' => '[DB_PORT]', // 端口 'DB_PREFIX' => '[DB_PREFIX]', // 数据库表前缀 /* 文档模型配置 (文档模型核心配置,请勿更改) */ 'DOCUMENT_MODEL_TYPE' => array(2 => '主题', 1 => '目录', 3 => '段落'),);
然后写一部分替换
$conf = str_replace('[AUTH_KEY]',$auth,$conf);$user = str_replace('[AUTH_KEY]',$auth,$conf);
或者说起来的替换或者读取执行
//读取SQL文件 $sql = file_get_contents(MODULE_PATH . 'Data/install.sql'); $sql = str_replace("\r", "\n", $sql); $sql = explode(";\n", $sql); //替换表前缀 $orginal = C('ORIGINAL_TABLE_PREFIX'); $sql = str_replace(" `{$orginal}", " `{$prefix}", $sql);
再比如:TP的扩展最核心的就是Behavior
写一个tags.php
return array('app_init'=>array('Common\Behavior\InitHookBehavior'));
这样就可以使用你想用的组件来进行模板解析,各种权限管理,路由控制,应用的前置后置处理,一些横向切面的工具
这样就可以动态加进来很多组件,也就实现了扩展,你的框架的核心不在于组件,而是你如何让数据流动,组合,以及讲故事。这是程序最值得称赞地方
附录下他的InithookBehavior
class InitHookBehavior extends Behavior{public function run(&$content){if(defined('BIND_MODULE') && BIND_MODULE === 'Install') return ;$data = S('hooks');if(!$data){$hooks = M('Hooks')->getField('name,addons');foreach ($hooks as $key => $value) {# code...if($value){$map['status'] = 1;$names = explode(',',$value);$map['name'] = array('in',$names);$data = M('Addons')->where($map)->getField('id,name');if($data){$addons = array_intersect($names, $data);Hook::add($key,array_map('get_addon_class',$addons));}}}S('hooks',Hook::get());}else{Hook::import($data,false);}}}//附加组件addons//由钩子去附件里面去找相应的组件
这就涉及到自动化运维的感觉,这就让人想起来python。
就写这么多吧,技术是属于每个人的,每个人的潜力不同,我们身边有很多人的兴趣点也是不一样的。照顾好自己的生活身体之后,前往顶峰。
愿法界众生,皆得安乐
本文出自 “一站式解决方案” 博客,请务必保留此出处http://10725691.blog.51cto.com/10715691/1963481