Magento 验证 shopping cart price rule 的流程

Magento 1.x 中验证折扣规则并打折的逻辑:

1
2
3
4
5
1. app\code\core\Mage\Checkout\controllers\CartController.php(144) => Mage_Checkout_Model_Cart->save
2. app\code\core\Mage\Checkout\Model\Cart.php(458) => Mage_Sales_Model_Quote->collectTotals
3. app\code\core\Mage\Sales\Model\Quote.php(1331) => Mage_Sales_Model_Quote_Address->collectTotals
4. app\code\core\Mage\Sales\Model\Quote\Address.php(1013) => Mage_SalesRule_Model_Quote_Discount->collect
5. app\code\core\Mage\SalesRule\Model\Quote\Discount.php(106) => Mage_SalesRule_Model_Validator->process

Magento 2.x 中验证折扣规则并打折的逻辑:

1
2
3
4
5
6
7
1. Magento\Quote\Model\Quote->collectTotals()
2. Magento\Quote\Model\Quote\TotalsCollector->collect(Object(Magento\Quote\Model\Quote))
3. Magento\Quote\Model\Quote\TotalsCollector->collectAddressTotals(Object(Magento\Quote\Model\Quote), Object(Magento\Quote\Model\Quote\Address))
4. Magento\SalesRule\Model\Quote\Discount->collect(Object(Magento\Quote\Model\Quote), Object(Magento\Quote\Model\ShippingAssignment), Object(Magento\Quote\Model\Quote\Address\Total))
5. Magento\SalesRule\Model\Validator->process(Object(Magento\Quote\Model\Quote\Item))
6. Magento\SalesRule\Model\RulesApplier->applyRules(Object(Magento\Quote\Model\Quote\Item), Object(Magento\SalesRule\Model\ResourceModel\Rule\Collection\Interceptor), false, 'TEST')
7. Magento\SalesRule\Model\RulesApplier->applyRule(Object(Magento\Quote\Model\Quote\Item), Object(Magento\SalesRule\Model\Rule), Object(Magento\Quote\Model\Quote\Address), 'TEST')

和 Magento 1.x 不一样的地方是,Magento 1.x 在 Mage_SalesRule_Model_Validator->process() 方法中统一验证所有的 action 类型, 而 Magento 2 中 将所有 action 抽象成了 Magento\SalesRule\Model\Rule\Action\Discount\DiscountInterface 接口, 执行 Magento\SalesRule\Model\Rule\Action\Discount\DiscountInterface 实例的 calculate() 方法就可以得到折扣结果

Built with Hugo
主题 StackJimmy 设计