M2不是一个标准的MVC架构。
这是m2的app/code/Magento/Catalog插件代码。
可以看到,它有Controller,也有Model,也有view.
奇怪的是,在Controller找不到调用模版的代码。
这是因为我们之前讲过,m2的页面都是用xml写的,xml里是由若干个block组成的。block里调用的template就是view下面的template。
所以,这个Controller加载的是该页面的xml文件。xml再解析输出成html。
细心的你会发现,这个插件里也有一个Block目录,没错,就是它。
xml里的就是这个block,这个block里才是真正的逻辑功能代码。
到处都是block。
M2有自己的语法,封装了很多类。
增删改查
一个标准的php类如下:
<?php
namespace Zou\Test\Block;
class Demo extends \Magento\Framework\View\Element\Template{protected $_storeManager;protected $_scopeConfig;protected $_productFactory;protected $_productCollectionFactory;protected $_categoryFactory;protected $_categoryCollectionFactory;protected $_customerFactory;protected $_customerCollectionFactory;protected $_orderFactory;protected $_orderCollectionFactory;public function __construct(\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,\Magento\Store\Model\StoreManagerInterface $storeManager,\Magento\Catalog\Model\ProductFactory $productFactory,\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,\Magento\Catalog\Model\CategoryFactory $categoryFactory,\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory $categoryCollectionFactory,\Magento\Customer\Model\CustomerFactory $customerFactory,\Magento\Customer\Model\ResourceModel\Customer\CollectionFactory $customerCollectionFactory,\Magento\Sales\Model\OrderFactory $orderFactory,\Magento\Sales\Model\ResourceModel\Order\CollectionFactory $orderCollectionFactory) {$this->_scopeConfig = $scopeConfig;$this->_storeManager = $storeManager;$this->_productFactory = $productFactory;$this->_productCollectionFactory = $productCollectionFactory;$this->_categoryFactory = $categoryFactory;$this->_categoryCollectionFactory = $categoryCollectionFactory;$this->_customerFactory = $customerFactory;$this->_customerCollectionFactory = $customerCollectionFactory;}//通过产品id,获取产品的name(属性)public function getProductName($pid=1){$product = $this->_productFactory->create()->load($pid);return $product->getName();}//获取价格大于100的产品public function getProductsByPrice($price=100){$productCollection = $this->_productCollectionFactory->create();$productCollection->addAttributeToSelect('price');$productCollection->addAttributeToFilter('price', array('gt'=>$price));foreach ($productCollection as $product) {echo $product->getPrice();}return $productCollection;}//把id为10的产品价格修改为50public function setProduct(){$price = 50;$pid = 10;$product = $this->_productFactory->create()->load($pid);$product->setPrice(50);$product->save();}//删掉id为1的产品public function deleteProduct($pid=1){$product = $this->_productFactory->create()->load($pid);$product->delete();}}
?>
namespace对phper应该不陌生了,现在php7新框架基本上都是用的命名空间。
在__construct里的声明的需要的类。
比如
\Magento\Catalog\Model\ProductFactory
是产品模型类,通过这个类你可以得到单个产品的任何信息(比如属性)。\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
是产品数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤产品\Magento\Catalog\Model\CategoryFactory
是分类模型类,通过这个类你可以得到单个分类的任何信息(比如属性)。\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
是分类数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤分类\Magento\Customer\Model\CustomerFactory $customerFactory
是客户联系人模型类,通过这个类你可以得到单个Customer的任何信息(比如属性)。\Magento\Customer\Model\ResourceModel\Customer\CollectionFactory
是联系人数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤联系人\Magento\Sales\Model\OrderFactory
是订单模型类,通过这个类你可以得到单个订单的任何信息(比如属性)。\Magento\Sales\Model\ResourceModel\Order\CollectionFactory
是订单数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤订单
通过上面这个简易的php代码,你就学会了增删改查,是不是非常简单粗暴?
通过M2提供的模型数据资源类,就可以从容优雅的进行增删改查。
先卖个关子,具体的我们在第四章做插件的时候 会细讲。