Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Cleaner.php
Go to the documentation of this file.
1 <?php
8 
12 
17 class Cleaner
18 {
22  private $requestData;
23 
27  private $mappedQueries;
28 
32  private $mappedFilters;
33 
37  private $aggregationStatus;
38 
44  public function __construct(AggregationStatus $aggregationStatus)
45  {
46  $this->aggregationStatus = $aggregationStatus;
47  }
48 
55  public function clean(array $requestData)
56  {
57  $this->clear();
58  $this->requestData = $requestData;
59  $this->cleanQuery($requestData['query']);
60  $this->cleanAggregations();
61  $requestData = $this->requestData;
62  $this->clear();
63 
64  if (empty($requestData['queries']) && empty($requestData['filters'])) {
65  throw new EmptyRequestDataException(
66  new Phrase("The request query and filters aren't set. Verify the query and filters and try again.")
67  );
68  }
69 
70  return $requestData;
71  }
72 
83  private function cleanQuery($queryName)
84  {
85  if (!isset($this->requestData['queries'][$queryName])) {
86  throw new \Exception('Query ' . $queryName . ' does not exist');
87  } elseif (in_array($queryName, $this->mappedQueries)) {
88  throw new StateException(
89  new Phrase('A cycle was found. The "%1" query is already used in the request hierarchy.', [$queryName])
90  );
91  }
92  $this->mappedQueries[] = $queryName;
93  $query = $this->requestData['queries'][$queryName];
94  switch ($query['type']) {
96  $queryReference = $this->processQueryReference($query['queryReference']);
97  if (empty($queryReference)) {
98  unset($this->requestData['queries'][$queryName]);
99  } else {
100  $this->requestData['queries'][$queryName]['queryReference'] = array_values($queryReference);
101  }
102  break;
104  if (!array_key_exists('is_bind', $query)) {
105  unset($this->requestData['queries'][$queryName]);
106  }
107  break;
109  if (isset($query['queryReference'][0])) {
110  $fQueryName = $query['queryReference'][0]['ref'];
111  $this->cleanQuery($fQueryName);
112  if (!isset($this->requestData['queries'][$fQueryName])) {
113  unset($this->requestData['queries'][$queryName]);
114  }
115  } elseif (isset($query['filterReference'][0])) {
116  $filterName = $query['filterReference'][0]['ref'];
117  $this->cleanFilter($filterName);
118  if (!isset($this->requestData['filters'][$filterName])) {
119  unset($this->requestData['queries'][$queryName]);
120  }
121  } else {
122  throw new \Exception('Reference is not provided');
123  }
124  break;
125  default:
126  throw new \InvalidArgumentException('Invalid query type');
127  }
128  }
129 
135  private function cleanAggregations()
136  {
137  if (!$this->aggregationStatus->isEnabled()) {
138  $this->requestData['aggregations'] = [];
139  } else {
140  if (array_key_exists('aggregations', $this->requestData) && is_array($this->requestData['aggregations'])) {
141  foreach ($this->requestData['aggregations'] as $aggregationName => $aggregationValue) {
142  switch ($aggregationValue['type']) {
143  case 'dynamicBucket':
144  if (is_string($aggregationValue['method'])
145  && preg_match('/^\$(.+)\$$/si', $aggregationValue['method'])
146  ) {
147  unset($this->requestData['aggregations'][$aggregationName]);
148  }
149  }
150  }
151  }
152  }
153  }
154 
164  private function cleanFilter($filterName)
165  {
166  if (!isset($this->requestData['filters'][$filterName])) {
167  throw new \Exception('Filter ' . $filterName . ' does not exist');
168  } elseif (in_array($filterName, $this->mappedFilters)) {
169  throw new StateException(
170  new Phrase(
171  'A cycle was found. The "%1" filter is already used in the request hierarchy.',
172  [$filterName]
173  )
174  );
175  }
176  $this->mappedFilters[] = $filterName;
177  $filter = $this->requestData['filters'][$filterName];
178  switch ($filter['type']) {
181  if (!array_key_exists('is_bind', $filter)) {
182  unset($this->requestData['filters'][$filterName]);
183  }
184  break;
186  $keys = ['from', 'to'];
187  foreach ($keys as $key) {
188  if (isset($filter[$key]) && preg_match('/^\$(.+)\$$/si', $filter[$key])) {
189  unset($this->requestData['filters'][$filterName][$key]);
190  }
191  }
192  $filterKeys = array_keys($this->requestData['filters'][$filterName]);
193  if (count(array_diff($keys, $filterKeys)) == count($keys)) {
194  unset($this->requestData['filters'][$filterName]);
195  }
196  break;
198  $filterReference = $this->processFilterReference($filter['filterReference']);
199  if (empty($filterReference)) {
200  unset($this->requestData['filters'][$filterName]);
201  } else {
202  $this->requestData['filters'][$filterName]['filterReference'] = array_values($filterReference);
203  }
204  break;
205  default:
206  throw new \InvalidArgumentException('Invalid filter type');
207  }
208  }
209 
216  private function processQueryReference($queryReference)
217  {
218  foreach ($queryReference as $key => $value) {
219  $this->cleanQuery($value['ref']);
220  if (!isset($this->requestData['queries'][$value['ref']])) {
221  unset($queryReference[$key]);
222  }
223  }
224  return $queryReference;
225  }
226 
233  private function processFilterReference($filterReference)
234  {
235  foreach ($filterReference as $key => $value) {
236  $this->cleanFilter($value['ref']);
237  if (!isset($this->requestData['filters'][$value['ref']])) {
238  unset($filterReference[$key]);
239  }
240  }
241  return $filterReference;
242  }
243 
249  private function clear()
250  {
251  $this->mappedQueries = [];
252  $this->mappedFilters = [];
253  $this->requestData = [];
254  }
255 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$value
Definition: gender.phtml:16
__construct(AggregationStatus $aggregationStatus)
Definition: Cleaner.php:44