그것이 내가 한 방식입니다. 매우 효율적이고 깨끗합니다.
1) 먼저 다음 클래스를 주입해야합니다.
protected $_storeManager;
protected $_appEmulation;
protected $_blockFactory;
public function __construct(
...
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\View\Element\BlockFactory $blockFactory,
\Magento\Store\Model\App\Emulation $appEmulation)
{
$this->_storeManager = $storeManager;
$this->_blockFactory = $blockFactory;
$this->_appEmulation = $appEmulation;
}
2) 그런 다음 아래 코드를 사용하여 getImageUrl 메소드를 작성하십시오.
protected function getImageUrl($product, string $imageType = '')
{
$storeId = $this->_storeManager->getStore()->getId();
$this->_appEmulation->startEnvironmentEmulation($storeId, \Magento\Framework\App\Area::AREA_FRONTEND, true);
$imageBlock = $this->_blockFactory->createBlock('Magento\Catalog\Block\Product\ListProduct');
$productImage = $imageBlock->getImage($product, $imageType);
$imageUrl = $productImage->getImageUrl();
$this->_appEmulation->stopEnvironmentEmulation();
return $imageUrl;
}
참고 : "appEmulation"코드는 관리자 또는 API 에서이 호출을 수행 할 때만 필요 합니다 . 그렇지 않으면 아래 (또는 유사한) 오류가 발생합니다.
Unable to resolve the source file for 'webapi_rest/_view/en_AU/Magento_Catalog/images/product/placeholder/.jpg'
3) 제품 객체와 원하는 이미지 유형을 전달하는 getImageUrl을 호출하십시오 ( view.xml 파일을 기반으로 함 )
...
$smallImage = $this->getImageUrl($productObject, 'product_page_image_small');
...