[[Magentoめも]] *Magento2 コアファイルの継承方法 [#f9d8948c] Magento2にすでにある機能を継承して動きを変えたい場合があります。 その場合は、モジュールを作成し、etc/di.xml ファイルにpreferenceを指定すればできるようです。 *Modelの継承 [#v7d9c4ad] vendor\magento\module-catalog\Model\Product.php を継承して商品一覧の商品名に Local を追加する app/code/Yassujp/HelloWorld/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="Magento\Catalog\Model\Product" type="Yassujp\HelloWorld\Model\Product" /> </config> 継承したいメソッドをコピーして書き換えます。 app\code\Yassujp\HelloWorld\Model\Product.php <?php namespace Yassujp\HelloWorld\Model; class Product extends \Magento\Catalog\Model\Product { public function getName() { return $this->_getData(self::NAME).' Local'; } } #ref(model.png) 商品名に Local が付加されていることが確認できます。 *Blockの継承 [#aebc7d30] vendor\magento\module-catalog\Block\Product\View.php を継承する場合 <?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="Magento\Catalog\Block\Product\View" type="Yassujp\HelloWorld\Block\Product\View" /> </config> 継承したいメソッドをコピーして書き換えます app\code\Yassujp\HelloWorld\Block\Product\View.php <?php namespace Yassujp\HelloWorld\Block\Product; class View extends \Magento\Catalog\Block\Product\View { public function getProduct() { echo 'Local Block'; if (!$this->_coreRegistry->registry('product') && $this->getProductId()) { $product = $this->productRepository->getById($this->getProductId()); $this->_coreRegistry->register('product', $product); } return $this->_coreRegistry->registry('product'); } } 商品詳細ページの左上に Local Block と表示されていることが確認できます。 *Controllerの継承 [#g0ea5270] vendor\magento\module-catalog\Controller\Product\View.php を継承する場合 <?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="Magento\Catalog\Controller\Product\View" type="Yassujp\HelloWorld\Controller\Product\View" /> </config> app\code\Yassujp\HelloWorld\Controller\Product\View.php <?php namespace Yassujp\HelloWorld\Controller\Product; class View extends \Magento\Catalog\Controller\Product\View { public function execute() { echo 'I am in Local Controller'; $categoryId = (int) $this->getRequest()->getParam('category', false); $productId = (int) $this->getRequest()->getParam('id'); $specifyOptions = $this->getRequest()->getParam('options'); if ($this->getRequest()->isPost() && $this->getRequest()->getParam(self::PARAM_NAME_URL_ENCODED)) { $product = $this->_initProduct(); if (!$product) { return $this->noProductRedirect(); } if ($specifyOptions) { $notice = $product->getTypeInstance()->getSpecifyOptionMessage(); $this->messageManager->addNotice($notice); } if ($this->getRequest()->isAjax()) { $this->getResponse()->representJson( $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode([ 'backUrl' => $this->_redirect->getRedirectUrl() ]) ); return; } $resultRedirect = $this->resultRedirectFactory->create(); $resultRedirect->setRefererOrBaseUrl(); return $resultRedirect; } $params = new \Magento\Framework\DataObject(); $params->setCategoryId($categoryId); $params->setSpecifyOptions($specifyOptions); try { $page = $this->resultPageFactory->create(); $this->viewHelper->prepareAndRender($page, $productId, $this, $params); return $page; } catch (\Magento\Framework\Exception\NoSuchEntityException $e) { return $this->noProductRedirect(); } catch (\Exception $e) { $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $resultForward = $this->resultForwardFactory->create(); $resultForward->forward('noroute'); return $resultForward; } } } 商品詳細ページ左上に I am in Local Controller と表示されていることが確認できます。 参考 -http://magento.stackexchange.com/questions/86497/how-to-override-core-block-model-and-controller-in-magento2 -http://magento.stackexchange.com/questions/113511/how-to-override-magento-checkout-customerdata-cart-php