# Magento2语法讲解 M2不是一个标准的MVC架构。 ![](https://box.kancloud.cn/0388fdc35b6131ecaad47b434ae4c0f8_324x834.png) 这是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里才是真正的逻辑功能代码。 ![](https://box.kancloud.cn/07e24f060407c112a09939cf7c4ba21a_1638x1110.png) 到处都是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的产品价格修改为50 public 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里的声明的需要的类。 比如 1. `\Magento\Catalog\Model\ProductFactory`是产品模型类,通过这个类你可以得到单个产品的任何信息(比如属性)。 2. ` \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory`是产品数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤产品 3. `\Magento\Catalog\Model\CategoryFactory`是分类模型类,通过这个类你可以得到单个分类的任何信息(比如属性)。 4. ` \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory`是分类数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤分类 5. `\Magento\Customer\Model\CustomerFactory $customerFactory`是客户联系人模型类,通过这个类你可以得到单个Customer的任何信息(比如属性)。 6. `\Magento\Customer\Model\ResourceModel\Customer\CollectionFactory`是联系人数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤联系人 7. `\Magento\Sales\Model\OrderFactory`是订单模型类,通过这个类你可以得到单个订单的任何信息(比如属性)。 8. `\Magento\Sales\Model\ResourceModel\Order\CollectionFactory`是订单数据集,通过这个类,你可以任意按条件(比如属性)搜索过滤订单 通过上面这个简易的php代码,你就学会了增删改查,是不是非常简单粗暴? 通过M2提供的模型数据资源类,就可以从容优雅的进行增删改查。 先卖个关子,具体的我们在第四章做插件的时候 会细讲。