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

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

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

    Hopes

    Start Here..

     

    MVC模式中如何區分應用程序邏輯(Controller層)和業務邏輯(Model層)? (轉)

    MVC模式中如何區分應用程序邏輯(Controller層)和業務邏輯(Model層)?  

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


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

    這個代碼不完整,但是演示了最重要的部分,就是應用程序邏輯和業務邏輯的分離。
    如果這個流程走下去,用戶要結算了,那么代碼如下: 
    class Controller_Cart
    {
        function actionCheckOut()
        {
            Cart::instance()->checkout();
            
            echo '成功';
        }
    }
    class Cart
    {
        function checkout()
        {
            // 開啟一個數據庫事務
            ....
            
            try
            {
                // 創建一個新的訂單對象
                // $this->owner 是當前購物車的所有者(用戶)
                $order = new Order($this->owner);
                
                // 將購物車中的所有商品添加到訂單中
                foreach ($this->items as $item)
                {
                    list($goods, $quantity) = $item;
                    $order->add($goods, $quantity);
                }
                // 保存訂單
                $order->save();
                
                // 清空購物車
                $this->items = array();
            }
            catch (Exception $ex)
            {
                // 出錯了,回滾事務
                ....
                   
                // 再重新拋出異常
                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;
                // 保存訂單時,減少訂單中每一個商品的庫存數
                $goods->decrRemaining($quantity);
            }
            
            // 調用父類的保存
            parent::save();
            
            return $this;
        }
    }

    結算的代碼很容易理解:
    1、調用購物車的 checkout() 方法
    2、開啟數據庫事務,這樣當保存訂單失敗時(例如庫存數不夠)則回滾,確保數據庫內容沒有受影響
    3、將購物車中的所有商品添加到訂單
    4、調用訂單對象的 save() 方法
      4.1、遍歷訂單的所有項目,減少商品的庫存(如果此時失敗,商品的 decrRemaining() 方法會拋出異常)
      4.2、調用模型父類的 save() 方法
    5、清空購物車,返回新建的訂單對象


    整個流程我們假定創建訂單就等同于客戶確認訂單,此時減少庫存。也有可能是后臺確認訂單配貨后才減少庫存,這和賣家的經營策略有關。

    這兩個例子里面,業務邏輯都在模型中實現,控制器(也就是封裝應用程序邏輯的層)僅僅完成處理輸入數據、調用業務方法、反饋結果等任務。

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    收藏夾

    C#學習

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品乱码久久久久久蜜桃不卡| 拨牐拨牐x8免费| 久久久久无码专区亚洲av| 国产成人亚洲精品电影| 国产精品视频免费一区二区三区 | 亚洲欧洲精品一区二区三区| 99久在线国内在线播放免费观看| 亚洲AV无码久久精品色欲| 日本免费中文字幕| 亚洲国产一区二区a毛片| 最近高清中文字幕免费| 亚洲沟沟美女亚洲沟沟| 好男人www免费高清视频在线| 亚洲精品无码成人| 免费人成视频x8x8入口| 久久99精品免费一区二区| 亚洲不卡中文字幕无码| www视频在线观看免费| 亚洲欧美中文日韩视频| 亚洲А∨精品天堂在线| 免费一级毛片无毒不卡| 亚洲国产成人综合| 免费少妇a级毛片人成网| 国内精品久久久久影院免费| 亚洲福利电影一区二区?| 日产乱码一卡二卡三免费| 久久九九免费高清视频| 亚洲精品国产情侣av在线| 免费视频中文字幕| 最近中文字幕大全免费版在线 | 一级女人18片毛片免费视频| 亚洲精品乱码久久久久久蜜桃不卡| **一级毛片免费完整视| 美女18毛片免费视频| 亚洲成人在线网站| 午夜毛片不卡免费观看视频| 丝袜捆绑调教视频免费区| 国产.亚洲.欧洲在线| 亚洲日韩欧洲乱码AV夜夜摸| 国产免费女女脚奴视频网| 永久免费无码网站在线观看个|