Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Render.php
Go to the documentation of this file.
1 <?php
7 
13 use Psr\Log\LoggerInterface;
16 
22 class Render extends AbstractAction
23 {
27  private $contentTypeResolver;
28 
32  private $resultJsonFactory;
33 
37  private $escaper;
38 
42  private $logger;
43 
52  public function __construct(
53  Context $context,
55  UiComponentTypeResolver $contentTypeResolver,
56  JsonFactory $resultJsonFactory = null,
57  Escaper $escaper = null,
58  LoggerInterface $logger = null
59  ) {
60  parent::__construct($context, $factory);
61  $this->contentTypeResolver = $contentTypeResolver;
62  $this->resultJsonFactory = $resultJsonFactory ?: \Magento\Framework\App\ObjectManager::getInstance()
63  ->get(\Magento\Framework\Controller\Result\JsonFactory::class);
64  $this->escaper = $escaper ?: \Magento\Framework\App\ObjectManager::getInstance()
65  ->get(\Magento\Framework\Escaper::class);
66  $this->logger = $logger ?: \Magento\Framework\App\ObjectManager::getInstance()
67  ->get(\Psr\Log\LoggerInterface::class);
68  }
69 
73  public function execute()
74  {
75  if ($this->_request->getParam('namespace') === null) {
76  $this->_redirect('admin/noroute');
77 
78  return;
79  }
80 
81  try {
82  $component = $this->factory->create($this->getRequest()->getParam('namespace'));
83  if ($this->validateAclResource($component->getContext()->getDataProvider()->getConfigData())) {
84  $this->prepareComponent($component);
85  $this->getResponse()->appendBody((string)$component->render());
86 
87  $contentType = $this->contentTypeResolver->resolve($component->getContext());
88  $this->getResponse()->setHeader('Content-Type', $contentType, true);
89  }
90  } catch (\Magento\Framework\Exception\LocalizedException $e) {
91  $this->logger->critical($e);
92  $result = [
93  'error' => $this->escaper->escapeHtml($e->getMessage()),
94  'errorcode' => $this->escaper->escapeHtml($e->getCode())
95  ];
97  $resultJson = $this->resultJsonFactory->create();
98  $resultJson->setStatusHeader(
99  \Zend\Http\Response::STATUS_CODE_400,
100  \Zend\Http\AbstractMessage::VERSION_11,
101  'Bad Request'
102  );
103 
104  return $resultJson->setData($result);
105  } catch (\Exception $e) {
106  $this->logger->critical($e);
107  $result = [
108  'error' => __('UI component could not be rendered because of system exception'),
109  'errorcode' => $this->escaper->escapeHtml($e->getCode())
110  ];
112  $resultJson = $this->resultJsonFactory->create();
113  $resultJson->setStatusHeader(
114  \Zend\Http\Response::STATUS_CODE_400,
115  \Zend\Http\AbstractMessage::VERSION_11,
116  'Bad Request'
117  );
118 
119  return $resultJson->setData($result);
120  }
121  }
122 
129  protected function prepareComponent(UiComponentInterface $component)
130  {
131  foreach ($component->getChildComponents() as $child) {
132  $this->prepareComponent($child);
133  }
134 
135  $component->prepare();
136  }
137 
144  private function validateAclResource($dataProviderConfigData)
145  {
146  if (isset($dataProviderConfigData['aclResource'])) {
147  if (!$this->_authorization->isAllowed($dataProviderConfigData['aclResource'])) {
148  if (!$this->_request->isAjax()) {
149  $this->_redirect('admin/denied');
150  }
151 
152  return false;
153  }
154  }
155 
156  return true;
157  }
158 }
__()
Definition: __.php:13
prepareComponent(UiComponentInterface $component)
Definition: Render.php:129
__construct(Context $context, UiComponentFactory $factory, UiComponentTypeResolver $contentTypeResolver, JsonFactory $resultJsonFactory=null, Escaper $escaper=null, LoggerInterface $logger=null)
Definition: Render.php:52