当前位置: 代码迷 >> PHP >> WEB编程架构革新初探
  详细解决方案

WEB编程架构革新初探

热度:51   发布时间:2016-04-28 17:49:02.0
WEB编程架构改革初探

长久以来,编程MVC架构深入人心。随着编程语言的不断进步和发展。这种架构始终没有进步, 我们尝试着将MVC模式大胆进化为VC模式。【千万注意】,我用的是进化,是先有MVC,再有VC。而不是直接VC模式。

再次强调,不是说MVC模式不好。其实还可以进化得更好。当MVC模式你还不熟悉的时候,你无法理解VC模式。
表面上省略掉Model,是编程语言进化的结果。而不是退步。为此会带来效率的大幅度提升。。。

一、 省略掉model的前提条件。
二、 省略掉model的实现。
三、 省略掉model后的强大好处。
四、 如何弥补省略掉model所失去的功能?
五、 为此VC架构的php框架实现。
以上功能下面慢慢补充…
在此抛砖引玉,希望大家不吝赐教。。。。
跟贴有分啊。。。。

------解决思路----------------------
引用:
Quote: 引用:

先丢块砖:你这是退化到 MV


【千万注意】,我用的是进化,是先有MVC,再有VC。而不是直接VC模式。
'
只是说了总纲,具体怎么做呢?
------解决思路----------------------
还有这样进化的哇,占个座看楼主继续发表观点。
------解决思路----------------------
MVC中M的主要是处理数据库或者业务逻辑。
更简单的说,其实把C看成商人,V看成顾客,而M则看成生产商。当生产商(M)取消后,那么意味着商人(C)就要承担生产商(M)的责任。虽然看似省略了一步,但其实只是内部消化而已,没了M,那么必然会有另一种产物来替代,来解决所有只在C中处理的业务。当然,也可以都用C,不用M或另一种替代M的方案,这也会使C的负担增大,代码也会更加复杂,代码重用性也会相对降低等等。Thinkphp中封装的一些数据库操作的方法,但未必就不是M的代替口。

个人观点,不喜勿喷~~~
------解决思路----------------------
楼主只考虑数据库,如果是非数据库的业务逻辑操作,这个MODEL要放在那里?
------解决思路----------------------
既然楼主已经有这样的一个框架,那就共享出来大家学习一下吧。
------解决思路----------------------
这个就是写在C里的M吧,我最初碰到前台会员和后台管理员都需要编辑产品的时候也是这样做的(ThinkPHP)

\Admin\Controller\ProductController.class.php:


namespace Admin\Controller;
use Api\Controller\ProductController as ApiProduct;
class ProductController extends AdminController {
    public function edit() {
        if (I('submit')) {
            $res = ApiProduct::setInfo(I());
            if ($res === true) {
                $alert = I('id') ? '编辑成功' : '发布成功';
                $this->success($alert, '/admin/product');
                exit;
            } else {
                $this->error($res);
            }
        }

        I('id') && $this->data = ApiProduct::getInfo(I('id'));
        $this->cate = ApiProduct::getCate();
        $this->paramdata = ApiProduct::getParam();
        $this->param = C('YH_PARAM');
        $this->title = I('id') ? '商品编辑' : '商品发布';
        $this->display('product/edit');
    }
}


\Api\Controller\ProductController.class.php:


    public function getInfo($id) {
        $id = intval($id);
        $data = M('product')->where("id = $id")->find();
        $stripfield = array('name', 'name_en', 'content', 'content_en');
        foreach ($stripfield as $field) {
            $data[$field] = stripslashes($data[$field]);
        }
        $data['adddate'] = date('Y-m-d', $data['addtime']);
        $data['pathArr'] = explode('-', $data['path']);
        $data['img'] = ImageController::getAll(1, $id);
        return $data;
    }

    public function setInfo($post) {
        $id = intval($post['id']);
        $data = array();
        $data['logo'] = $post['logo'];
        $data['name'] = $post['name'];
        $data['name_en'] = $post['name_en'];
        $cid = intval($post['cid']);
        $data['path'] = self::getCatePath($cid);
        list($top) = explode('-', $data['path']);
        $param = C('YH_PARAM');
        foreach ($param as $key => $val) {
            $data[$val['field']] = $post[$val['field']][$top];
        }
        $data['content'] = $post['content'];
        $data['content_en'] = $post['content_en'];
        $data['urltb'] = format_url($post['urltb']);
        $data['urlone'] = format_url($post['urlone']);
        $data['urljd'] = format_url($post['urljd']);

        if (empty($data['name']) 
------解决思路----------------------
 empty($data['name_en'])) {
            return '商品名称不能为空';
        }
        if (empty($data['path'])) {
            return '请选择分类';
        }

        if ($id) {
            $data['id'] = $id;
            M('product')->save($data);
        } else {
            $data['addtime'] = time();
            $id = M('product')->add($data);
        }

        ImageController::addImg($post['newimg'], 1, $id);
        ImageController::delImg($post['delimg']);
        if (empty($data['logo'])) {
            $logo = ImageController::getOne(1, $id);
            M('product')->where("id = $id")->setField('logo', $logo);
        }

        return true;
    }



我把这些通用接口都写在C里面了,但觉得实际上就是M...
比如登陆操作,有个login接口,若干个参数。传入用户名密码然后返回true或是失败原因。这个过程中要写session或是向session服务器提交。是否需要记住密码自动登陆?这个参数会影响到写cookie。是否把登陆id记录到共享内存中实现一些其他功能?我觉得这些操作都算在用户登陆的M里
------解决思路----------------------
那你干脆打混战,还讨论什么架构干什么?
快 70 了精力有限,偶尔接个小项目做做。泡论坛是为了不落伍,不动动脑筋不就痴呆了?
------解决思路----------------------

Laravel的作者写了一本书叫《From Apprentice To Artisan》,里面有个章节叫<MVC Is Killing You>、<Bye Bye Models>。好像楼主已经到了跟大神同样的境界了。楼主可以去看看这本书。。。

具体没看懂,作者开发的框架里面有非常明确的MVC文件夹。但是写的书却推翻的了这个观点。楼主有兴趣研究那个吧。thinkphp已经不属于你研究的范畴了。


------解决思路----------------------
框架没有完全的好坏之分,只有适合不适合而已。。
楼主的这个小改革,是没有遇到复杂的业务吧。。
我们这边是在M和C之间增加了module,C只是串联各个module而已,module操作model来实现。。对于各个业务模块的耦合度很低,感觉确实很好用。。
------解决思路----------------------
I learnt a word today: Narcissism
------解决思路----------------------
引用:
Quote: 引用:

I learnt a word today: Narcissism

I also learnt a word today: wuzhi&&youzhi.


P.S., ur pinyin and English mashup is so cool! Wait a second, did you just copy & paste what I wrote and then appended your pinyin? That's not cool. That sucks for a former fortune 500 PM!!!
------解决思路----------------------
                $data['company_id']=$_POST['id'];
                $data['kefu_name']=$_POST['kefu_name'];
                $data['passwd']=$_POST['passwd'];
                $data['kefu_type']=$_POST['kefu_type'];
                $data['kefu_name']=$_POST['kefu_name'];
                $data['open_time']=time();

这种已经很复杂了啊, 也许你要说这都是代码生成器生成的, 但是修改数据库表结构的造成的改动呢, 还是得一个字段一个字段的写, 这只是一个缩引, HTML展示页面也要一个一个写么?
  相关解决方案