切换风格

Wizard Sky California Sunset glow Black Cloud Beige Dragon Lavender NewYear City Snow Flowers London
收藏本站XSS平台字符串转换jsfuck
一些关于PHP的设计以及扩展的问题~[复制链接]
发表于 2015-5-16 17:42:01 | 显示全部楼层 |!read_mode!
本帖最后由 Goodwinner 于 2015-5-18 21:21 编辑

很久没上来了,菊花的论坛还是那么渣,好像回到了80年代的机械键盘,老土的画面~~~



吐槽一下而已




OK ,开始最近的一些经验分享


刚好最近做完一个轻量型的单点登录~~

:  ) waht is 单(傻)点(逼)登(用)录(户)


自己谷歌去吧~~


最近加入一个新的团队
老大是腾讯出来的某大牛



这是原话~~

受到影响,特来说说最近的一些设计感谢

这次就拿thinkphp 来说事吧~~

  • www  WEB部署目录(或者子目录)
  • ├─index.php       入口文件
  • ├─README.md       README文件
  • ├─Application     应用目录
  • ├─Public          资源文件目录
  • └─ThinkPHP        框架目录


这是thinkphp 的 目录结构



当然讲设计思维和thinkphp没什么关系。but thinkphp简单一些,如果我要说Yii的话,大部分人都会崩溃的~~

开始正题

基于现有的框架文档, what can i do ~~

假设你是一个项目的执行者,你的思维是怎么设计系统的~


目前所有产品基本上是基于两种客户端~   移动端,PC  

设计的时候就要预留好接口,不能说移动端的另外写一份这口 这种~~浪费人力时间,以及冗余代码后续不好维护等等恶劣的情况
以下需要有thinkphp基本了解才能往下看~~:
了解thinkphp的都知道,thinkphp 可以有多个项目,但是,but ,怎么去实现 我说的两个端的数据,由一个接口提供?


thinkphp 下 有一种功能叫common 公共的文件,函数,控制器,模型,等等org  tool 都可以在common目录下建立,重用性很高的东西,基本上需求确定搭建框架的时候,我们需要 重用的一些功能函数都可以先确定定义

贴代码了~~:
function is_app() {
        return get_device_type() == 'app' || strtolower($_SERVER['HTTP_CLIENT_ID']) == 'example-app' || I('get.is_app',0,'intval') == 1;
}

function is_mobile(){
        return get_device_type() == 'ios' || get_device_type() == 'android';
}
function get_device_type() {
        $agent = strtolower($_SERVER['HTTP_USER_AGENT']);
        $type = 'other';
        if (strpos($agent, 'iphone') !== false){//} || strpos($agent, 'ipad') !== false) {
                $type = 'ios';
        }
        if (strpos($agent, 'android') !== false) {
                $type = 'android';
        }
        // if (strpos($agent, 'micromessenger') !== false) {
        //         $type = 'weixin';
        // }
        if (strpos($agent, 'example-app') !== false) {
                $type = 'app';
        }
        return $type;
}




判断来源是否是app 或者网页版本等等等等



这个和我们的接口重用性有毛线关系?


好吧,下面来重点了,不得不说,我认真起来的时候,还是帅帅的~~


function api_return($status=0,$info='',$data=null){
        if (is_array($status)) {
                return array(
                        'status' => $status['status'],
                        'info' => $status['info'],
                        'data' => is_numeric($status['data']) ? floatval($status['data']) : $status['data'],
                );
        }else{
                return array(
                        'status' => $status,
                        'info' => $info,
                        'data' => is_numeric($data) ? floatval($data) : $data,
                );
        }
}


这是一个小的函数定义,我们首先确定数据,都装载在一个我们已知 的数据结构

这样就可以开始我们的下一步宏伟的计划了
function API($model=''){
    return A('Common/' . $model, 'Api');
}



see ,就是这么简单,我们不管是pc端,还是移动端,都是同一个api('user') 返回的一个数据

当然,这时候你会说,这有什么用,pc端,我要和移动端,返回不一样的结果,那你就看你api里的函数写的好不好了
还有,pc和 移动端,必然会有不一样,别忘了你还有控制器,还可以另外查出一份数据,但是 这样重用至少会减少很多代码
核心块也分开了

O了~,我也没什么讲的了~~
这只是说的是一种思维,不要疯狂的去写代码,应该安静的思考,扩展性,重用性,接续性等等等 因素
这样写的代码,才能是好代码~

希望你们懂~~~



附件: 你需要登录才可以下载或查看附件。没有帐号?加入Team
已有 1 人评分威望 金币 贡献 收起 理由
店小二01 + 1 + 10 + 1 赞一个!

总评分: 威望 + 1  金币 + 10  贡献 + 1   查看全部评分

发表于 2015-5-17 00:02:03 | 显示全部楼层
我大概明白了你的意思,我觉得你说的这个思路就是discuz x 系列 pc端和 wap端的逻辑,也是很主流的基本上算最优的方式,不错 赞一个!
至于APP端的api,我个人习惯还是分开(当然基本的common函数和sql class还是要公用的),原因有两点:
第一:app端的数据很注重精简和效率,一般相同的view在APP端需要的字段和数据量是web端的1/3以下;
第二:app端的数据结构和web端需要的数据有时候会有很大的区别;
所以个人认为单独出来写api的逻辑会省去 糅合众多function的时间,另外这样还有另外一个好处就是需要把app 的api独立为一个服务器来运营的时候会很省事不用在分离程序了;
是个人喜好吧,不喜勿喷~~
发表于 2015-5-18 21:19:48 | 显示全部楼层
店小二01 发表于 2015-5-17 00:02
我大概明白了你的意思,我觉得你说的这个思路就是discuz x 系列 pc端和 wap端的逻辑,也是很主流的基本上算 ...

app 端,有很多数据也是重用的,至于你说的结构不同,你可以另外调用的时候 再foreach 处理数据,
我说的是这样的目录结构



See  
后台admin的调用common里的api
手机客户端的调用common里的api
前端 调用common里的api
公用的数据模型
公用的方法
公用的插件

要调用的时候 admin 做一个数据的循环剔除等等
前台也一样
如果到时候并发的话,就要在api 里多分几个东东,把一些app专属的一些东西写在一个里面
其它的可以公用,因为毕竟这些数据的循环,肯定是会做limit的,不太用担心性能的问题

附件: 你需要登录才可以下载或查看附件。没有帐号?加入Team
发表于 2015-6-8 16:43:51 | 显示全部楼层

发表于 2015-7-25 21:21:09 | 显示全部楼层
3Xjad 发表于 2015-6-8 16:43


代码区

GMT+8, 2019-11-23 08:01

Powered by Discuz! X2

© 2001-2018 Comsenz Inc.

回顶部