monc-php
php 框架,借鉴了大量 yii 的设计,甚至部分类还是从那边拷贝过来(validator),囫囵吞枣,有待改进
实例:monc-php ; 杭州宠物志愿者
特点:
分层设计,路由,mvc,ActiveRecord,widgets
风格基本沿袭 yii,但是比起yii 要简单很多,所以文件数量之类的对于做些小网站,会比较好把控
结合了 bootstrap, bower, grunt
阿里云(aliyun) ace 的cache 和 storage,能够快速开发 ace 应用
程序运行比较简单,只需要部署在 nginx 里,并指向 public 文件夹就好,svn commit 到阿里云的 ace 目录即可。
env
本模块参考的是 laravel 的做法,在global.func.php 里提供 getEnvAS 方法 根据不同的环境获取不同配置文件夹里的配置monc/config/dev
monc/config/online
默认为 online,以防止用户线上错误配置
配置如下 monc/config/env.php,key 为hostname(terminal 下输入命令 hostname 即可获得,value 为对应的环境配置文件夹)
<?php
return array(
'appletekiMacBook-Pro.local' => 'dev',
'appletekiMBP.lan' => 'dev',
);
controller
系统路由功能 app()->controller 可以获取 支持的路由规则为固定的 [module]/[controller]/[action]/[param1-name]/[param1-value]/[param2-name]/[param2-value].... 考虑过是否要用 laravel 的规则,但是,实际使用的时候,觉得 laravel 的方式太灵活,但是每个都要设置一下,虽然可以设置通用规则,但是小型网站还不如直接 module/controller/action 的方式,简单直接view
支持 3 种读取模板方法 render:用于返回包含layouts 的界面 renderPartial:用于在 view 中导入别的模板文件 wrap:用于layout 里嵌套外层 layouts layouts 中内容的变量为 $content 根据我做这么多网站来看,这 3 种嵌套方式基本满足所有需求 所有render 方法支持2个参数,第二个参数为数组,用于模板中输出需要的变量 render('/....'),即表示,view 的根目录 monc/view/ render('.../...') 即表示,当前 controller 的相对目录model
采用 pdo,支持单db,如果需要支持多db,则需要扩展 MDbModel.getDB 方法 采用 ActiveRecord 的方式,利用 pdo 读取数据库的表信息,字段信息,用于支持 findByPk, find, findAll 等方法,返回的是 MDbModel 对象,可以根据不同的 table 返回自定可以的 Model,使用很方便。 这块读取table 信息的db 查询还没加缓存admin
为 /admin,在 AdminController 里,module 支持不到位,主要是 router 规则没处理完善 默认登陆为 user: admin, pwd: admin,登陆逻辑在 LoginForm 里,session 保存在 ace cache 里,所以不用担心,因为分布的问题,导致的 session 丢失问题,不过没有验证,ace 这块有没有处理正确,如果 ace 本来就做了,那就庸人自扰了。 提供基本的 cms 操作 分类管理(带标签) 文章管理(带标签) 图片上传(上传 ace ) html 编辑 (bootstrap3-wysihtml5)widgets
仿照 yii 中的widget 设计,但是没有考虑各种优化性能的办法,常用的有 4 个
MActiveForm,表单标准化,支持 MModel(MDbModel, MFormModel,前者用于数据库model,后者用于自定义model),label 在 monc/messages/trans.php 里定义
errorSummary:输出表单错误新
activeTextField:输出 input:text 类型
activePasswordField:输出 input:password 类型
activeSwfUpload:输出图片上传组件
$('#fu-image').rsupload({
success: function (data) {
if (data.code != 0) {
alert(data.message);
return;
}
var file = data.file;
var imgUrl = '/storage/down?key=' + file.fileKey;
$('input.data-image').val(imgUrl);
var $wrapper = $('#image-wrapper');
$wrapper.empty();
$wrapper.append('<img src="' + imgUrl + '" width="100"/>');
}
});
activeTextAreaField:输出textarea 类型,需要结合 js 才能使用 bootstrap3-wysihtml5 富文本编辑
$('#editor').wysihtml5({locale: "zh-CN"});
MGridView:后台列表管理类
支持动态排序,更新,
支持搜索
支持生成页码
数据源为 MDataProvider
MPagination,从 get 获取当前页码 fetchData:获取数据列表的方法(在其中调用 pagination 的limit) calculateTotalItemCount:获取数据列表的总行数支持数据类型格式化,format 方法在 MFommater 中,可以调用 app()->fommater->format($type, $value, $options)
array ('image', 'type' => 'image50'), // 格式化输出 50px 宽度的图片
支持自定义按钮,ajax 请求,ajax 更新会在后续增加
'buttons' => array (
'view' => array (
'url' => 'url("/admin/content/view", array("id"=>$data["primaryKey"], "cid"=>$data["cid"]))',
),
'update' => array (
'url' => 'curl("/admin/content/update", array("id"=>$data["primaryKey"], "cid"=>$data["cid"]))',
),
'delete' => array (
'url' => 'curl("/admin/content/delete", array("id"=>$data["primaryKey"], "cid"=>$data["cid"]))',
),
),
MPager,页码
<?php
$pagination = new MPagination(100);
$pager = MPager::getInstance(array (
'pagination' => $pagination
));
echo $pager->render(); ?>
ModelView,MModel 输出所有信息为table,左列为label,右列为数据
$view = new ModelView(array (
'model' => $model,
'columns' => array (
'title',
'alias',
'create_time',
array ('status', 'type' => 'status'),
array ('image', 'type' => 'image50'),
array ('content', 'type' => 'dbhtml'),
)
));
echo $view->render();
支持formater
cms
支持简单的cms 功能,后台可以按需增加 category 和对应 cotent 管理 前台读取,有三个获取方法$list = app()->cms->aliasList('news', null, 6)
:获取分类标签为 news 的所有文章,6篇
$article = app()->cms->aliasContent('manage', 'about')
:获取分类标签为 manage,文章标签为 about 的文章
$cate = app()->cms->aliasCate('manage')
:获取分类标签为 manage 的分类
aliyun
cache:MSession 类中使用,比较简单$this->cache = Alibaba::Cache();
$this->cache->get($id);
$this->cache->set($id, $value);
$this->cache->delete($id);
storage: StorageController 中使用,原理很简单,但是实际使用纠结了比较久,验证的结果也公布下
阿里云ace 是读 file_exists 和 readfile 做了替换的,所以实际使用过程,不能依赖这两个函数,否则可能会报错,测试过程想在本地做缓存,结果发现 file_exists 文件破坏了我的逻辑
每次刷新页面,访问的节点可能不一样,所以不能靠放文件在本地
readfile 会直接从 oss 读取,所以简单的下载逻辑是如此
$storage = Alibaba::Storage();
if (!$storage->fileExists($fileKey)) {
throw new MHttpException(404);
}
$meta = $storage->getMeta($fileKey);
if (!$meta['content-length']) {
throw new MHttpException('file size is 0 or file not found');
}
$tmpFile = MONC . 'tmp' . DS . $fileKey;
// 不存在,锁住下载
if (!$storage->get($fileKey, $tmpFile)) {
throw new Exception('fail to get file from[' . $fileKey . ']
to [' . $tmpFile . ']');
}
header("Content-type: " . $meta['content-type']);
header('Content-Disposition: attachment; filename="' . basename($fileKey) . '"');
header("Content-Length: " . $meta['content-length']);
echo readfile($tmpFile);
markdown
这块在 plugin/php_markdown_lib_1_4_0 里,支持到 markdown 的 table 等,原来版本使用的是 github2.css,等我整理下流程再放出 我用这块做博客,随时写 .md 文件,觉得不错了,就利用 git commit 上去,根据文件的 inode 时间作为文章的创建时间,很方便前端
默认使用 bootstrap 模块
需要对资源包进行安装,就是 bower 和 grunt 的使用
如果没有 npm,需要新安装 http://nodejs.org/
npm install bower -g
npm 是node.js 的包管理工具,而bower 是一个npm 包
提供两个 npm 的国内源,放置在 ~/.npmrc 文件里,否则下载文件很很慢
#registry = http://registry.npm.taobao.org
registry = http://registry.cnpmjs.org
bower: twitter 提供的资源包管理工具,可以方便的按照版本雨来下载你需要的资源文件
在 webroot/public 目录下运行bower install
,将读取 bower.json 文件中已经配置的依赖
在 webroot/public 目录下运行 npm install
,将安装 package.json 里的默认配置
grunt: js 的maven,用于编译less 文件为 css,压缩js,css文件,并打包
在 webroot/public 目录下运行grunt install
,讲读取 Gruntfile.js 文件,并安装需要的模块
grunt less 主动编译 Gruntfile.js less 任务对应的文件
grunt watch,监控 Gruantfile.js 里定义的 less/**/*.less
文件,有变化的时候自动编译成 css,方便调试
线下开发的时候,阿里云的 cache 和 storage 模块要处理下,根据官网文档,需要在 php.ini 增加注册 auto_prepend_file = <ace.php的路径>
ace 中使用 storage
下载 php 的对应sdk 线下开发的时候,阿里云的 cache 和 storage 模块要处理下,根据官网文档,需要在 php.ini 增加注册auto_prepend_file = <ace.php的路径>
吐槽一下,论坛对 markdown 格式输出的界面不甚友好
bower 使用指南
如果没有 npm,需要新安装 http://nodejs.org/
npm install bower -g
npm 是node.js 的包管理工具,而bower 是一个npm 包
提供两个 npm 的国内源,放置在 ~/.npmrc 文件里,否则下载文件很很慢
#registry = http://registry.npm.taobao.org
registry = http://registry.cnpmjs.org
bower: twitter 提供的资源包管理工具,可以方便的按照版本雨来下载你需要的资源文件
bower init: 生成 bower.json
bower install: 在资源目录下运行 bower install
,将读取 bower.json 文件中已经配置的依赖
bower search [包名]:搜索包
bower install [包名],安装指定包
--save,讲安装包信息保存到 bower.json 中,以后只要共享这个文件出去给项目组的人就行了 包名 可以是github 上的地址,如bower install 'https://github.com/idiot/unslider.git' --save
bowr remove [包名],移除
grunt 使用指南
npm install grunt -g
npm install grunt-cli -g
npm init:生成 package.json 文件,npm 的项目初始化
npm install:安装package.json 里的插件,grunt-contrib-watch:用于监控,grunt-contrib-less:用于编译less 为css
grunt-init gunfile,grunt 的项目初始化
修改 gunfile 如下,基本功能 less, watch
{
"name": "monc-php",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-watch": "~0.6.1",
"grunt-contrib-less": "~0.12.0"
}
}
//Gruntfile
module.exports = function (grunt) {
//Initializing the configuration object
grunt.initConfig({
less: {
development: {
options: {
compress: false //minifying the result
},
files: {
"./css/main.css": "./less/main.less",
"./css/admin.css": "./less/admin/admin.less"
}
}
},
watch: {
less: {
files: [
'./less/**/*.less'
], //watched files
tasks: ['less'] //tasks to run
}
}
});
// Plugin loading
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-less');
// Task definition
grunt.registerTask('default', ['watch']);
};
版权声明:
1、该文章(资料)来源于互联网公开信息,我方只是对该内容做点评,所分享的下载地址为原作者公开地址。2、网站不提供资料下载,如需下载请到原作者页面进行下载。
3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考学习用!
4、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。