
ãã®èšäºã§ã¯ãMagento 2ã®
ãµãŒãã¹ã¬ã€ã€ãŒãšããšã³ãã£ãã£ã管çããããã®ãµãŒãã¹ïŒAPIïŒã«ã€ããŠèª¬æããŸãããããã¯ãå庫管çã·ã¹ãã ïŒã€ã³ãã³ããªïŒã®ãã¡ã€ã³ãšã³ãã£ãã£ã®èšèšãšå²ãåœãŠã«é¢ãã
以åã®èšäºã§èª¬æããŸããã
ãµãŒãã¹å±€
Magento 2ãã©ãããã©ãŒã ã§å庫管çã·ã¹ãã ãèšè¿°ããŠãããããããã«å¿ããŠããã®ãã©ãããã©ãŒã ã®æ©èœãèæ
®ããŠã玹ä»ãããµãŒãã¹ã«ã€ããŠèª¬æããŸãã
Magento 2ã§ã¯ãã¢ãžã¥ãŒã«ã¬ãã«ïŒããŠã³ãã³ã³ããã¹ãå
ïŒã§åŒ±ãæ¥ç¶ã®ååãå®è£
ããããã«ããµãŒãã¹ã¬ã€ã€ãŒãå°å
¥ãããŸãããããã¯ãã¯ã©ã€ã¢ã³ããšä»ã®ã·ã¹ãã ã¢ãžã¥ãŒã«ã®çžäºäœçšã«é¢ããŠåã¢ãžã¥ãŒã«ã§å©çšå¯èœãªæäœã®ã»ãããå®çŸ©ããŸãã
Magentoã®ãµãŒãã¹ã¬ã€ã€ãŒïŒãŸãã¯ãµãŒãã¹ã³ã³ãã©ã¯ãïŒã¯ ãã¢ãžã¥ãŒã«ã«å¯ŸããŠå®çŸ©ããããã®ã¢ãžã¥ãŒã«ã®Apiãã©ã«ããŒã«ããPHPã€ã³ã¿ãŒãã§ã€ã¹ã®ã»ããã§ãã ãµãŒãã¹ã³ã³ãã©ã¯ãã¯ãããŒã¿ã€ã³ã¿ãŒãã§ãŒã¹-ãã¡ã€ã³ãšã³ãã£ãã£ããŒã¿ãè¡šãDTOã€ã³ã¿ãŒãã§ãŒã¹ã§æ§æãããŠããŸãã ããã³ãµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹-ã¯ã©ã€ã¢ã³ãïŒã³ã³ãããŒã©ãŒãREST / SOAP WebãµãŒãã¹ãä»ã®ã¢ãžã¥ãŒã«ã®PHPã³ãŒãïŒããåŒã³åºãããšãã§ããããžãã¹ããžãã¯ãžã®ã¢ã¯ã»ã¹ãæäŸããã€ã³ã¿ãŒãã§ã€ã¹ã
ã¢ãžã¥ãŒã«ã®ãã¹ãŠã®å€éšã¯ã©ã€ã¢ã³ãã¯ããµãŒãã¹å±€ã§èšè¿°ãããå¥çŽã®äžã§åäœãããšæ³å®ãããŠããããããµãŒãã¹å±€ã¯å®éã«ã¯
FacadeãšããŠè¡šãããšãã§ããå®è£
ã®è©³çŽ°ãšããžãã¹ããžãã¯ã®è€éããé ããŸãã
ã客æ§ã¯ãæ確ã«å®çŸ©ãããAPIã«äŸåããããšã§ãã¢ãžã¥ãŒã«ãã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ã«åŸããããã·ã¹ãã ã®æ¬¡ã®ããŒãžã§ã³ãžã®ã¢ããã°ã¬ãŒãã容æã«ãªããŸãã
ã¢ãžã¥ãŒã«æ§ãšåé¢ãæ¹åããããã«ããµãŒãã¹ã³ã³ãã©ã¯ãããµãŒãã¹ããå¥ã®ã¢ãžã¥ãŒã«ã«å²ãåœãŠãããå ŽåããããŸãã ããšãã°ãInventoryã®å Žåã2ã€ã®ã¢ãžã¥ãŒã«ããããŸãã1ã€ã¯
InventoryAPIãµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹ã®ã»ããã宣èšãã2ã€ç®ã¯ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãæäŸããŸã
-Inventoryã§ãã ãããã£ãŠãåºæ¬å®è£
ã眮ãæããããµãŒãããŒãã£ã®éçºè
ã¯ãã³ãŒãå
ã§ãã®å®è£
ã«çžãããªããªããŸãã ã·ã¹ãã å
ã®ä»ã®ã¢ãžã¥ãŒã«ãäŸåããã€ã³ã¿ãŒãã§ã€ã¹ã§ããããã圌ãå¿
èŠãšããã®ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ãã

ãªããžããªã€ã³ã¿ãŒãã§ã€ã¹-ãªããžããª
ãªããžããªã¯ããšã³ãã£ãã£ã«äžé£ã®CRUDæäœãæäŸããã€ã³ã¿ãŒãã§ã€ã¹ã§ãã
å
žåçãªãªããžããªã€ã³ã¿ãŒãã§ã€ã¹ã¯ã次ã®ã¡ãœããã®ã»ããã§æ§æãããŠããŸãã
public function save(\Magento\Module\Api\Data\DataInterface $entityData); public function get($entityId); public function delete(\Magento\Module\Api\Data\DataInterface $entityData); public function deleteById($entityId); public function getList(SearchCriteriaInterface $searchCriteria);
ã¡ãœããã®ã»ããã¯ãå®çŸ©æžã¿ã®ã»ãããšã¯ç°ãªãã»ãã³ãã£ã¯ã¹ãæã€ã¡ãœãããè¿œå ããããšã¯æšå¥šãããªããããããçãå ŽåããããŸãïŒç¹å®ã®æäœããã¡ã€ã³ãšã³ãã£ãã£ã«äžè¬çã§ãªãå Žåãåé€ãªã©ïŒã ãã®ãããªæ¹æ³ã¯ãå¥ã®ãµãŒãã¹ã«é
眮ããããšããå§ãããŸãã
ãªããžããªã¯ããšã³ãã£ãã£ã管çããããã®äžé£ã®ã¡ãœãããçµã¿åããããã¡ãµãŒããšèããããšãã§ããŸãã
Inventoryã¢ãžã¥ãŒã«ã®ã³ã³ããã¹ãã§ã¯ã
Sourceãšã³ãã£ãã£ïŒè£œåãããç©ççãªå庫ãè¡šã責任ãè² ããšã³ãã£ãã£ïŒããã³
SourceItem ïŒãšã³ãã£ãã£ãã³ãã«ãç¹å®ã®ç©çã¹ãã¬ãŒãžäžã®ç¹å®ã®è£œåïŒSKUïŒã®éãè¡šãïŒã®
ãªããžããªã衚瀺ãããŸãã
interface SourceRepositoryInterface { public function save(SourceInterface $source); public function get($sourceId); public function getList(SearchCriteriaInterface $searchCriteria = null); }
SourceRepositoryã®å Žåãdeleteã¡ãœããã¯ãããŸãããSourceãšã³ãã£ãã£ã«å¯Ÿããããžãã¹ãªãã¬ãŒã·ã§ã³ã¯ååšããªãããã§ãããªããªããçºæ³šããã泚æïŒååã®é
éå
ãå«ãïŒã«é¢é£ãããã¹ãŠã®æ
å ±ãåžžã«ä¿åããå¿
èŠãããããã§ãã ãããã£ãŠãå°æ¥çã«ãã®ãããªããŒã¿ã倱ãããå¯èœæ§ãé²ãå¿
èŠããããŸãïŒé
ä¿¡ãå®è¡ããããœãŒã¹ãåé€ããããšã«ããïŒã 代ããã«ãæäœã䜿çšãããŸã-ãœãŒã¹ãéã¢ã¯ãã£ãïŒç¡å¹ïŒãšããŠããŒã¯ããŸãã
interface SourceItemRepositoryInterface { public function getList(SearchCriteriaInterface $searchCriteria); public function delete(SourceItemInterface $sourceItem); }
ä¿åæäœã䜿çšããããã®äž»ãªã·ããªãªã¯ããªããžããªå
ã®æšæºçãªä¿åèŠçŽãæ³å®ããŠããããã«ã1ã€ã®ãšã³ãã£ãã£ã§ã¯ãªãSourceItemã®ã»ããã§çºçããããã§ãã
ã·ã³ã¯ã®ã€ã³ããŒããŸãã¯å€éšERPãŸãã¯PIMã·ã¹ãã ãšã®åæäžã«çºçããå¯èœæ§ã®ãã
è€æ°ã®ä¿åã«ã€ããŠã¯ãåå¥ã®
SourceItemSaveInterfaceã³ã³ãã©ã¯ããå°å
¥ãããåäžã®ãµãŒãã¹ã³ãŒã«å
ã§è€æ°ã®SourceItemãã¢ãããã¯ã«ä¿åããæ©èœãæäŸããŸãã ãã®ãããªã³ã³ãã©ã¯ãã«ãããããŒã¿ããŒã¹ãžã®åäžã®ã¯ãšãªã䜿çšããŠæ¿å
¥æäœãåŠçã§ããåŠçã倧å¹
ã«é«éåãããŸãã åäžã®ãšã³ãã£ãã£ã䜿çšããåºæ¬çãªä¿åæäœã¯ãå®éã«ã¯ãã®å ŽåãµãŒãããŒãã£ã®éçºè
ãäž¡æ¹ã®ä¿åæäœïŒåäžããã³è€æ°ïŒããã©ã°ã€ã³ããå¿
èŠãããããããªããžããªã³ã³ãã©ã¯ãã«è¿œå ãããŸããã ãããã£ãŠã1ã€ã®æ¡åŒµãã€ã³ãã®ã«ã¹ã¿ãã€ãºãåžžã«æãŸããããã§ãã
è€æ°ã®ä¿åã³ãã³ãã³ã³ãã©ã¯ãã¯ã
Magento \ InventoryApi \ Api \ SourceItemSaveInterfaceã®ããã«ãªããŸã interface SourceItemSaveInterface { public function execute(array $sourceItems); }
ãã®å®è£
ã§ãã
SourceItemSaveã¯ã
SaveMultipleã¢ãã«
ãªãœãŒã¹ã®ä¿åãå§ä»»ããŸãã
ãŸããSourceItemã¯ãªã³ã¯ããããšã³ãã£ãã£ã§ãããè€åèå¥åïŒSKUãšSourceIdïŒã«ãã£ãŠæ±ºå®ããããããSourceItemRepositoryã«ã¯getïŒïŒã¡ãœããã¯ãããŸããã
StockïŒãœãŒã¹ãšã³ãã£ãã£ã®ä»®æ³éçŽïŒã®ãªããžããªã¯æšæºã«èŠããŸãïŒ
interface StockRepositoryInterface { public function save(StockInterface $stock); public function get($stockId); public function getList(SearchCriteriaInterface $searchCriteria = null); public function deleteById($stockId); }
ãœãŒã¹ãšã¹ããã¯ããããã³ã°ããããã®ãµãŒãã¹
ã¯ã©ã€ã¢ã³ãAPIïŒããžãã¹ããžãã¯ã³ãŒãå
ïŒã®ãã€ã©ãŒãã¬ãŒãã³ãŒãã®æ°ãæžããããã«ãã
ã¯ã©ã€ã¢ã³ãã«ã§ããããšãäœããããªã ããšããã«ãŒã«ã«åŸã£ãŠãããŒã¿ã€ã³ã¿ãŒãã§ãŒã¹SourceStockLinkInterfaceãå°å
¥ã
ãŸãã ã 代ããã«ãSourceãStockã«å²ãåœãŠãããã®äžé£ã®ãã¡ã€ã³ããŒã¹ã®ãµãŒãã¹ã³ãã³ããå°å
¥ããŸãã
ãã®çµæã3ã€ã®ã³ãã³ããååŸãããŸãã
interface AssignSourcesToStockInterface { public function execute(array $sourceIds, $stockId); } interface GetAssignedSourcesForStockInterface { public function execute($stockId); } interface UnassignSourceFromStockInterface { public function execute($sourceId, $stockId); }
API vs SPI
ãã®ãããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯å
ã§ãæ¡åŒµæ©èœãæ¹åããã³ã³ããŒãã³ãã®æ¥ç¶æ§ãæžããããã«ã
ãµãŒãã¹ãããã€ããŒã€ã³ã¿ãŒãã§ã€ã¹ ïŒSPIïŒããAPIïŒã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ïŒãæ瀺çã«åé¢ããããšã決å®ãããŸããã
- ãªããžããªã¯APIãšèŠãªãããšãã§ããããããªããžããªã€ã³ã¿ãŒãã§ãŒã¹ã®ã¡ãœããã¯ããžãã¹ããžãã¯ã®PHPã³ãŒãã§åŒã³åºããããšæ³å®ãããŠããŸãã
- ãªããžããªå®è£
ã¯ã©ã¹ãã¡ãœããããããã·ããåå¥ã®ã³ãã³ãã¯ã©ã¹ïŒGetãSaveãGetListãDeleteãªã©ïŒã¯ãçŸåšã®ã·ã¹ãã åäœãæ¡åŒµãŸãã¯çœ®æããããã«ãµãŒãããŒãã£ã®å®è£
ãæäŸã§ããSPIã€ã³ã¿ãŒãã§ã€ã¹ãšèŠãªãããšãã§ããŸãã
ãããã£ãŠãããšãã°ã
Magento \ Inventory \ Model \ StockRepositoryãªããžããªã®å®è£
ã¯æ¬¡ã®ãšããã§ãã
class StockRepository implements StockRepositoryInterface { private $commandSave; private $commandGet; private $commandDeleteById; private $commandGetList; public function __construct( SaveInterface $commandSave, GetInterface $commandGet, DeleteByIdInterface $commandDeleteById, GetListInterface $commandGetList ) { $this->commandSave = $commandSave; $this->commandGet = $commandGet; $this->commandDeleteById = $commandDeleteById; $this->commandGetList = $commandGetList; } public function save(StockInterface $stock) { $this->commandSave->execute($stock); } public function get($stockId) { return $this->commandGet->execute($stockId); } public function deleteById($stockId) { $this->commandDeleteById->execute($stockId); } public function getList(SearchCriteriaInterface $searchCriteria = null) { return $this->commandGetList->execute($searchCriteria); } }
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãæäŸãããåæäœã«å¯ŸããŠäžé£ã®ã³ãã³ãã€ã³ã¿ãŒãã§ã€ã¹ãåãå
¥ããŸãã ãããŠããªããžããªããã®ãããªãã¯ã¡ãœããã®åŒã³åºãäž-åŒã³åºãã¯é©åãªã³ãã³ãã«ãããã·ãããŸãã
SPIã³ãã³ãã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ãšããã§ãã
interface SaveInterface { public function execute(StockInterface $stock); } interface GetInterface { public function execute($stockId); } interface DeleteByIdInterface { public function execute($stockId); } interface GetListInterface { public function execute(SearchCriteriaInterface $searchCriteria = null); }
ãããã®ã³ãã³ãã¯ãã¢ãžã¥ãŒã«ã®SPIã€ã³ã¿ãŒãã§ãŒã¹ãè¡šããåå空éã®äžã«ãããŸãã
Magento\Inventory\Model\Stock\Command\*
ããŒã ã®å®è£
ã¯æ¬¡ã®ãšããã§ãïŒ
Magento \ Inventory \ Model \ Stock \ Command \ * ïŒã ããšãã°ãã¹ããã¯ãä¿åããã³ãã³ãïŒ
class Save implements SaveInterface { private $stockResource; private $logger; public function __construct( StockResourceModel $stockResource, LoggerInterface $logger ) { $this->stockResource = $stockResource; $this->logger = $logger; } public function execute(StockInterface $stock) { try { $this->stockResource->save($stock); return $stock->getStockId(); } catch (\Exception $e) { $this->logger->error($e->getMessage()); throw new CouldNotSaveException(__('Could not save Stock'), $e); } } }
補åäºçŽã¡ã«ããºã
äºçŽãªããžã§ã¯ãã¯ã泚æã®äœæãšç¹å®ã®ç©ççãªå庫ã§ã®ååæ°ã®æžå°ã®éã«ã販売ããååã®çŸåšã®ã¬ãã«ãä¿æããããã«äœæãããŸãã
åã®ããŒãã§è©³ãã説æãããçºæ³šã®ããžãã¹ã·ããªãªã®å®è£
ã
åé·æ§ã®ããã®ããŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ãå°å
¥
interface ReservationInterface extends ExtensibleDataInterface { const RESERVATION_ID = 'reservation_id'; const STOCK_ID = 'stock_id'; const SKU = 'sku'; const QUANTITY = 'quantity'; const STATUS = 'status'; const STATUS_OPEN = 1; const STATUS_CLOSED = 2; public function getReservationId(); public function getStockId(); public function getSku(); public function getQuantity(); public function getStatus(); }
äºçŽã¯
Append-Onlyäžå€ã®ãšã³ãã£ãã£ãšããŠèªèããããããReservationInterfaceã«ä¿®é£ŸåïŒã»ãã¿ãŒã¡ãœããïŒã¯å¿
èŠãããŸããã ãããã£ãŠãäºçŽãªããžã§ã¯ããäœæããã«ã¯ãReservationBuilderInterfaceãå¿
èŠã§ãã
$reservationBuilder->setStockId(1); $reservationBuilder->setSku('sku'); $reservationBuilder->setQty(10); $newReservation = $reservationBuilder->build();
ãªããžã§ã¯ãäºçŽãµãŒãã¹
äºçŽïŒäºçŽïŒãè¿œå ãããµãŒãã¹ã¯ã泚æã泚æã®åŠçããŸãã¯æ³šæã®ãã£ã³ã»ã«æã«äœ¿çšãããŸãã è¿åæäœã®äœæãšåŠçã ãã§ãªã ãã®æç¹ã§ãSKUããšã«1ã€ã®äºçŽããã¯ãäœæããããã®ãµãŒãã¹ã䜿çšããŠåŠçã®ããã«è¿œå ãããŸãã
interface ReservationAppend { public function execute(array $reservations); }
次ã®ãµãŒãã¹ã¯ã泚æã®éã«ã·ã¹ãã ãStockItemãšã³ãã£ãã£ïŒä»®æ³éèšïŒãåŠçãããããEvent Stockã®æ§è³ªã«èµ·å ããã¬ã€ãã³ã·ã§Quantity StockItemãæŽæ°ãããããã販売å¯èœãªååã®æ£ç¢ºãªæ°éïŒæ°éïŒãèšç®ããããã«äœ¿çšãããŸãã©ã®ç©çã¹ãã¢ïŒãœãŒã¹ïŒã®å»æ¢æªçœ®ãçºçãããã¯ããããŸããã ãããã£ãŠã泚æã®åŠçãšåŠçã®éã«äžå®ã®æéãçµéããå ŽåããããŸãã
interface GetReservationQuantityForProduct { public function execute($sku, $stockId); }
åäºçŽã¯
ãéããç¶æ
ãŸãã¯
éããç¶æ
ã«
ããããšãã§ããŸãã
äºçŽã¯å€æŽã§ããªãäžå€ãªããžã§ã¯ãã§ããããã äºçŽã®ã¹ããŒã¿ã¹ãå€æŽãã代ããã«ã2çªç®ã®äºçŽãäœæããæåã®äºçŽããã£ã³ã»ã«ããŸãã
äŸãã°
30åã®ååã泚æãããšãäºçŽãäœæãããŸãã
ReservationID-1ãStockId-1ãSKU-SKU-1ãæ°é-ïŒ-
30 ïŒãã¹ããŒã¿ã¹-OPEN
ãã®æ³šæãåŠçããããå¥ã®äºçŽãäœæããŸã
ReservationID-2ãStockId-1ãSKU-SKU-1ãæ°é-ïŒ
+30 ïŒãã¹ããŒã¿ã¹-éåº
åèšã§ãããã2ã€ã®ãªã¶ãŒãïŒ-30ïŒ+ïŒ+30ïŒ= 0ã¯ãStockItemã«æ ŒçŽãããŠããæ°éã«åœ±é¿ããŸããã
ããã§2ã€ã®ããšã«æ³šæããããšãéèŠã§ããäºçŽã¯ä»ã®ããžãã¹ãªãã¬ãŒã·ã§ã³ã«çµã³ä»ããããšãã§ãããããäºçŽãªããžã§ã¯ããšæ³šæïŒæ³šæïŒã®éã«ãã€ã³ãã£ã³ã°ïŒãã€ã³ãã£ã³ã°ïŒãå°å
¥ããŸããã å庫ïŒåšåº«ïŒã®èŠ³ç¹ããèŠããšãååãåºè·ããŠåšåº«ãæžããå¿
èŠããã泚æçªå·ã¯éèŠã§ã¯ãããŸããã
äºçŽã«è² ã®å€ãšæ£ã®å€ã䜿çšãããšãStockItemã«æ ŒçŽãããŠããæ°éããæžç®ããå¿
èŠãããåèšæ°ã®èšç®ãç°¡åã«ãªããŸãã
ããšãã°ã次ã®ã¯ãšãªã䜿çšããŸãã
select SUM(r.qty) as total_reservation_qty from Reservations as r where stockId = {%id%} and sku = {%sku%}
Magento MSIïŒãã«ããœãŒã¹ã€ã³ãã³ããªïŒ
ãã®èšäºã¯ããCQRSãšã€ãã³ããœãŒã·ã³ã°ã䜿çšããå庫管çã·ã¹ãã ãã·ãªãŒãºã®3çªç®ã®èšäºã§ãããMagento 2ã®äŸã䜿çšããå庫管çã·ã¹ãã ã®èŠä»¶ã®åéãèšèšãéçºã«ã€ããŠæ€èšããŸãã
éçºãé²è¡äžã§ãããã³ãã¥ããã£ãšã³ãžãã¢ãé¢äžããŠãããªãŒãã³ãããžã§ã¯ããããã³ãããžã§ã¯ããšããã¥ã¡ã³ãã®çŸåšã®ã¹ããŒã¿ã¹ã«ç²Ÿéããããšãã§ããå Žæã¯ã
ããããå
¥æã§ã
ãŸã ã
詳现ãªããã¥ã¡ã³ã