contentTypeResolver = $contentTypeResolver; $this->resultJsonFactory = $resultJsonFactory ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Controller\Result\JsonFactory::class); $this->escaper = $escaper ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Escaper::class); $this->logger = $logger ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Psr\Log\LoggerInterface::class); } /** * @inheritdoc */ public function execute() { if ($this->_request->getParam('namespace') === null) { $this->_redirect('admin/noroute'); return; } try { $component = $this->factory->create($this->getRequest()->getParam('namespace')); if ($this->validateAclResource($component->getContext()->getDataProvider()->getConfigData())) { $this->prepareComponent($component); $this->getResponse()->appendBody((string)$component->render()); $contentType = $this->contentTypeResolver->resolve($component->getContext()); $this->getResponse()->setHeader('Content-Type', $contentType, true); } } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->logger->critical($e); $result = [ 'error' => $this->escaper->escapeHtml($e->getMessage()), 'errorcode' => $this->escaper->escapeHtml($e->getCode()) ]; /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); $resultJson->setStatusHeader( \Zend\Http\Response::STATUS_CODE_400, \Zend\Http\AbstractMessage::VERSION_11, 'Bad Request' ); return $resultJson->setData($result); } catch (\Exception $e) { $this->logger->critical($e); $result = [ 'error' => __('UI component could not be rendered because of system exception'), 'errorcode' => $this->escaper->escapeHtml($e->getCode()) ]; /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->resultJsonFactory->create(); $resultJson->setStatusHeader( \Zend\Http\Response::STATUS_CODE_400, \Zend\Http\AbstractMessage::VERSION_11, 'Bad Request' ); return $resultJson->setData($result); } } /** * Call prepare method in the component UI * * @param UiComponentInterface $component * @return void */ protected function prepareComponent(UiComponentInterface $component) { foreach ($component->getChildComponents() as $child) { $this->prepareComponent($child); } $component->prepare(); } /** * Optionally validate ACL resource of components with a DataSource/DataProvider * * @param mixed $dataProviderConfigData * @return bool */ private function validateAclResource($dataProviderConfigData) { if (isset($dataProviderConfigData['aclResource'])) { if (!$this->_authorization->isAllowed($dataProviderConfigData['aclResource'])) { if (!$this->_request->isAjax()) { $this->_redirect('admin/denied'); } return false; } } return true; } }