<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    MVC模式中如何區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)? (轉(zhuǎn))

    MVC模式中如何區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?  

    現(xiàn)在的大部分框架都是 MVC 模式,但 MVC 三個(gè)部分怎么配合,這里做了一點(diǎn)總結(jié):
    基本原則:業(yè)務(wù)邏輯代碼應(yīng)該寫(xiě)在 M 里面,而應(yīng)用程序邏輯應(yīng)該寫(xiě)在 C 里面。V 只是單純的展示數(shù)據(jù)。
    舉個(gè)簡(jiǎn)單例子吧:用戶往購(gòu)物車添加一個(gè)商品
    用戶點(diǎn)擊商品的“添加到購(gòu)物車”按鈕,引起一次請(qǐng)求。服務(wù)器開(kāi)始處理該請(qǐng)求,過(guò)程:
    1、檢查當(dāng)前用戶是否有權(quán)限(比如是否已經(jīng)登錄、用戶帳戶狀態(tài)、是否可以購(gòu)物等)
    2、檢查要添加的商品ID是否有效、
    3、檢查要添加的商品庫(kù)存是否足夠
    4、將商品加入購(gòu)物車,并保存購(gòu)物車狀態(tài)
    5、反饋信息
    在上述流程中:
    1: 是應(yīng)用程序邏輯(一般由框架實(shí)現(xiàn)):因?yàn)楹?#8220;添加商品到購(gòu)物車”這個(gè)業(yè)務(wù)沒(méi)有直接關(guān)系
    2: 業(yè)務(wù)邏輯:不能購(gòu)買不存在的商品,這是業(yè)務(wù)進(jìn)行的基本條件
    3: 業(yè)務(wù)邏輯:商品庫(kù)存決定了是否可以購(gòu)買此商品,這是業(yè)務(wù)進(jìn)行的基本條件
    4: 業(yè)務(wù)邏輯
    5: 應(yīng)用程序邏輯
    用代碼表示的,可能像下面這樣: 
    // Cart控制器
    class Controller_Cart
    {
        function actionAddGoods()
        {
            $goods_id = (int)$_GET['goods_id'];
            Cart::instance()->add($goods_id)->save();
            
            echo '添加成功';
        }
    }


    // Cart 模型
    class Cart
    {
        /**
         * 購(gòu)物車中的所有項(xiàng)目
         */
        public $items = array();
       
        /**
         * 單子模式,返回購(gòu)物車對(duì)象的唯一實(shí)例
         */
        static function instance()
        {
            ...
        }
       
        function add($goods_id, $quantity = 1)
        {
            $goods = Goods::find($goods_id)->get();
            // 檢查 id 和庫(kù)存數(shù)
            if ($goods->id && $quantity > $goods->remaining)
            {
                // 添加商品到購(gòu)物車
                $this->items[] = array($goods, $quantity);
            }
            else
            {
                throw new CartExecption('無(wú)效的商品 ID');
            }
            return $this;
        }
    }

    這個(gè)代碼不完整,但是演示了最重要的部分,就是應(yīng)用程序邏輯和業(yè)務(wù)邏輯的分離。
    如果這個(gè)流程走下去,用戶要結(jié)算了,那么代碼如下: 
    class Controller_Cart
    {
        function actionCheckOut()
        {
            Cart::instance()->checkout();
            
            echo '成功';
        }
    }
    class Cart
    {
        function checkout()
        {
            // 開(kāi)啟一個(gè)數(shù)據(jù)庫(kù)事務(wù)
            ....
            
            try
            {
                // 創(chuàng)建一個(gè)新的訂單對(duì)象
                // $this->owner 是當(dāng)前購(gòu)物車的所有者(用戶)
                $order = new Order($this->owner);
                
                // 將購(gòu)物車中的所有商品添加到訂單中
                foreach ($this->items as $item)
                {
                    list($goods, $quantity) = $item;
                    $order->add($goods, $quantity);
                }
                // 保存訂單
                $order->save();
                
                // 清空購(gòu)物車
                $this->items = array();
            }
            catch (Exception $ex)
            {
                // 出錯(cuò)了,回滾事務(wù)
                ....
                   
                // 再重新拋出異常
                throw $ex;
            }
            
            // 返回新建的訂單
            return $order;
        }
    }


    class Order extends Model
    {
        public $items;
       
        function add($goods, $quantity)
        {
            $this->items[] = array($goods, $quantity);
            return $this;
        }
       
        function save()
        {
            foreach ($this->items as $item)
            {
                list($goods, $quantity) = $item;
                // 保存訂單時(shí),減少訂單中每一個(gè)商品的庫(kù)存數(shù)
                $goods->decrRemaining($quantity);
            }
            
            // 調(diào)用父類的保存
            parent::save();
            
            return $this;
        }
    }

    結(jié)算的代碼很容易理解:
    1、調(diào)用購(gòu)物車的 checkout() 方法
    2、開(kāi)啟數(shù)據(jù)庫(kù)事務(wù),這樣當(dāng)保存訂單失敗時(shí)(例如庫(kù)存數(shù)不夠)則回滾,確保數(shù)據(jù)庫(kù)內(nèi)容沒(méi)有受影響
    3、將購(gòu)物車中的所有商品添加到訂單
    4、調(diào)用訂單對(duì)象的 save() 方法
      4.1、遍歷訂單的所有項(xiàng)目,減少商品的庫(kù)存(如果此時(shí)失敗,商品的 decrRemaining() 方法會(huì)拋出異常)
      4.2、調(diào)用模型父類的 save() 方法
    5、清空購(gòu)物車,返回新建的訂單對(duì)象


    整個(gè)流程我們假定創(chuàng)建訂單就等同于客戶確認(rèn)訂單,此時(shí)減少庫(kù)存。也有可能是后臺(tái)確認(rèn)訂單配貨后才減少庫(kù)存,這和賣家的經(jīng)營(yíng)策略有關(guān)。

    這兩個(gè)例子里面,業(yè)務(wù)邏輯都在模型中實(shí)現(xiàn),控制器(也就是封裝應(yīng)用程序邏輯的層)僅僅完成處理輸入數(shù)據(jù)、調(diào)用業(yè)務(wù)方法、反饋結(jié)果等任務(wù)。

    posted on 2013-11-09 11:14 ** 閱讀(280) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊(cè)

    收藏夾

    C#學(xué)習(xí)

    友情鏈接

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费少妇a级毛片人成网| 亚洲码在线中文在线观看| 女人隐私秘视频黄www免费| 亚洲网站在线观看| 大学生高清一级毛片免费| 国产精品偷伦视频免费观看了 | 四虎AV永久在线精品免费观看| 午夜在线亚洲男人午在线| 国产AV无码专区亚洲AV男同| 免费A级毛片无码无遮挡内射| 美女免费视频一区二区三区| 久久久综合亚洲色一区二区三区| 欧美三级在线电影免费| 久99久无码精品视频免费播放| 亚洲欧洲精品视频在线观看| 亚洲毛片网址在线观看中文字幕| 2021国内精品久久久久精免费| 美女视频黄视大全视频免费的| 精品日韩亚洲AV无码一区二区三区| 日本高清免费aaaaa大片视频| 久久久久久久岛国免费播放| 精品亚洲成a人在线观看| 亚洲网址在线观看| 在线观看亚洲天天一三视| 成人免费毛片视频| 91香蕉国产线在线观看免费| 免费国产va视频永久在线观看| 亚洲日本在线观看网址| 久久亚洲国产欧洲精品一| 国产无遮挡裸体免费视频 | 国产精品亚洲产品一区二区三区| 国产免费看JIZZ视频| 久久久99精品免费观看| 色多多A级毛片免费看| 亚洲人成电影网站色| 日产亚洲一区二区三区| 亚洲欭美日韩颜射在线二| 国产免费av片在线无码免费看| 国产人在线成免费视频| 91精品导航在线网址免费| h视频在线免费观看|