前提:假设你已经懂了构建模块与路由
{module}/Api/Data下新建对象interface,定义字段和getset方法,要加具体注释
/*
@param $id
@return int
/
<?phpnamespace Training5\VendorRepository\Api\Data;interface VendorInterface{const VENDOR_ID = 'vendor_id';const NAME = 'name';/*** @return int*/public function getId();/*** @param $id* @return int*/public function setId($id);/*** @return string*/public function getName();/*** @param $name* @return string*/public function setName($name);}
{module}/Api/Data 新建对象SearchResultInterface,继承Magento\Framework\Api\SearchResultsInterface
<?php
namespace Training5\VendorRepository\Api\Data;
use Magento\Framework\Api\SearchResultsInterface;
interface VendorSearchResultInterface extends SearchResultsInterface
{
/**
* @return \Training5\VendorRepository\Api\Data\VendorInterface[]
*/
public function getItems();
/**
* @param \Training5\VendorRepository\Api\Data\VendorInterface[] $items
* @return void
*/
public function setItems(array $items);
}
{module}/Api 下新建RepositoryInterface
定义需要的方法,要写注释
/*
@param int $id
@return \Training5\VendorRepository\Api\Data\VendorInterface
/
<?php
namespace Training5\VendorRepository\Api;
use Magento\Framework\Api\SearchCriteriaInterface;
use Training5\VendorRepository\Api\Data\VendorSearchResultInterface;
/**
* @api
*/
interface VendorRepositoryInterface
{
/**
* @param int $id
* @return \Training5\VendorRepository\Api\Data\VendorInterface
*/
public function load($id);
/**
* @param \Training5\VendorRepository\Api\Data\VendorInterface $vendor
* @return \Training5\VendorRepository\Api\Data\VendorInterface
*/
public function save(\Training5\VendorRepository\Api\Data\VendorInterface $vendor);
/**
* @param SearchCriteriaInterface $searchCriteria
* @return VendorSearchResultInterface
*/
public function getList(SearchCriteriaInterface $searchCriteria);
/**
* @param $id
* @return array
*/
public function getAssociatedProducts($id);
}
在{module}/Model下新建对象实体类,实现Api/Data下的对象接口,继承Magento\Framework\Model\AbstractModel或Magento\Framework\Model\AbstractExtensibleModel;
<?php
namespace Training5\VendorRepository\Model;
use Training4\Vendor\Model\TrainingVendor;
use Training5\VendorRepository\Api\Data\VendorInterface;
class Vendor extends TrainingVendor implements VendorInterface
{
public function getId()
{
return parent::getData(self::VENDOR_ID);
}
public function setId($id)
{
return $this->setData(self::VENDOR_ID, $id);
}
public function getName()
{
return parent::getData(self::NAME);
}
public function setName($name)
{
return $this->setData(self::NAME, $name);
}
}
<?php
namespace Training4\Vendor\Model;
use Magento\Framework\Model\AbstractModel;
class TrainingVendor extends AbstractModel
{
protected $_idFieldName = 'vendor_id';
protected function _construct()
{
$this->_init('Training4\Vendor\Model\ResourceModel\TrainingVendor');
}
}
{module}/Model下新建对象RepositoryInterface的实现类
<?php
namespace Training5\VendorRepository\Model;
use Training5\VendorRepository\Api\Data;
use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
class VendorRepository implements \Training5\VendorRepository\Api\VendorRepositoryInterface
{
private $vendorResource;
private $vnedorFactory;
private $collectionProcessor;
private $vendorCollectionFactory;
private $vendorSearchResultInterfaceFactory;
public function __construct
(
\Training5\VendorRepository\Model\ResourceModel\Vendor $vendorResource,
\Training5\VendorRepository\Model\VendorFactory $vendorFactory,
CollectionProcessorInterface $collectionProcessor,
\Training5\VendorRepository\Model\ResourceModel\Vendor\CollectionFactory $collectionFactory,
\Training5\VendorRepository\Api\Data\VendorSearchResultInterfaceFactory $vendorSearchResultInterfaceFactory
)
{
$this->vnedorFactory=$vendorFactory;
$this->vendorResource = $vendorResource;
$this->collectionProcessor=$collectionProcessor;
$this->vendorCollectionFactory=$collectionFactory;
$this->vendorSearchResultInterfaceFactory=$vendorSearchResultInterfaceFactory;
}
/**
* @inheritDoc
*/
public function load($id)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$vendor = $objectManager->get('\Training5\VendorRepository\Model\Vendor');
$this->vendorResource->load($vendor, $id);
return $vendor;
}
/**
* @inheritDoc
*/
public function save(Data\VendorInterface $vendor)
{
$this->vendorResource->save($vendor);
return $vendor;
}
/**
* @inheritDoc
*/
public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)
{
$collection = $this->vendorCollectionFactory->create();
$this->collectionProcessor->process($searchCriteria, $collection);
$searchResults = $this->vendorSearchResultInterfaceFactory->create();
$searchResults->setSearchCriteria($searchCriteria);
$searchResults->setItems($collection->getItems());
echo "</br>";
echo $collection->getSelect()->__toString();
echo "</br>";
return $searchResults;
}
/**
* @inheritDoc
*/
public function getAssociatedProducts($id)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$vendor = $objectManager->get('\Training5\VendorRepository\Model\ResourceModel\Vendor');
$connection = $vendor->getConnection();
$select = $connection->select()->from(
['vendor' => 'training_vendor'],
['v2p.entity_id', 'v2p.vendor_id']
)->join(['v2p' => 'training4_vendor2product'], 'v2p.vendor_id=vendor.vendor_id')
->where('vendor.vendor_id=?', $id);
echo '<br>';
echo $select->__toString();
echo '</br>';
$data = $connection->fetchAll($select);
return $data;
}
}
{Module}/Model下新建对象SearchResult实现对象SearchResultInterface接口,继承Magento\Framework\Api\SearchResults;
<?php
namespace Training5\VendorRepository\Model;
use Magento\Framework\Api\SearchResults;
use Training5\VendorRepository\Api\Data\VendorSearchResultInterface;
class VendorSearchResult extends SearchResults implements VendorSearchResultInterface
{
}
{module}/Model/ResourceModel下新建
Model的ResourceModel,继承Magento\Framework\Model\ResourceModel\Db\AbstractDb;
实现构造方法
$this->_init(‘training_vendor’, ‘vendor_id’);//分别是表名和主键
<?php
namespace Training5\VendorRepository\Model\ResourceModel;
use Training4\Vendor\Model\ResourceModel\TrainingVendor;
class Vendor extends TrainingVendor
{
}
<?php
namespace Training4\Vendor\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class TrainingVendor extends AbstractDb
{
protected function _construct()
{
$this->_init('training_vendor', 'vendor_id');
}
}
{Module}/Model/ResourceModel/对象/Collection
<?php
namespace Training5\VendorRepository\Model\ResourceModel\Vendor;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Training5\VendorRepository\Model\ResourceModel\Vendor;
class Collection extends AbstractCollection
{
protected function _construct()
{
$this->_init(\Training5\VendorRepository\Model\Vendor::class,
Vendor::class);
}
}
指定Model和ResourceModel
{module}下etc下新建di.xml
声明接口与映射
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Training5\VendorRepository\Api\Data\VendorInterface" type="Training5\VendorRepository\Model\Vendor" />
<preference for="Training5\VendorRepository\Api\VendorRepositoryInterface" type="Training5\VendorRepository\Model\VendorRepository" />
<preference for="Training5\VendorRepository\Api\Data\VendorSearchResultInterface" type="\Training5\VendorRepository\Model\VendorSearchResult" />
</config>
额外内容
将Repository构建为restApi
etc下新建webapi.xml
<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/TrainingApi/getVendor" method="GET">
<service class="Training5\VendorRepository\Api\VendorRepositoryInterface" method="load"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
<route url="/V1/TrainingApi/save" method="POST">
<service class="Training5\VendorRepository\Api\VendorRepositoryInterface" method="save"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
</routes>
执行php bin/magento setup:upgrade安装模块
执行php bin/magento setup:di:compile
简写php bin/magento s:d:c
