<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#學習

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本特黄a级高清免费大片| 亚洲w码欧洲s码免费| 亚洲中文字幕久久久一区| 久久久久亚洲精品无码网址色欲 | 国产男女性潮高清免费网站 | 永久免费毛片在线播放| 亚洲午夜av影院| 一级毛片a免费播放王色电影| 在线观看肉片AV网站免费| 亚洲成A∨人片在线观看不卡 | 国产免费伦精品一区二区三区| 亚洲欧洲精品成人久久曰影片| 久久国产一片免费观看| 国产亚洲AV夜间福利香蕉149| 亚洲一区二区三区在线网站| 午夜免费福利影院| 日产久久强奸免费的看| 久久不见久久见中文字幕免费| 国产成人亚洲综合色影视| 99久久免费观看| 亚洲欧美日韩中文高清www777| 最近中文字幕完整版免费高清| 亚洲免费观看在线视频| 日本大片在线看黄a∨免费 | 色欲色香天天天综合网站免费| 亚洲男人的天堂在线| 麻豆国产VA免费精品高清在线 | 特级毛片A级毛片免费播放| 免费国产黄线在线观看| 亚洲JLZZJLZZ少妇| 亚洲无av在线中文字幕| 一级片在线免费看| 亚洲XX00视频| 一级毛片免费观看不卡视频| 在线精品亚洲一区二区| 国产午夜亚洲精品国产成人小说| 精品一区二区三区无码免费视频| 亚洲国产乱码最新视频| 野花高清在线观看免费3中文| 青青草97国产精品免费观看| 亚洲处破女AV日韩精品|