TYPO3  7.6
Web/RequestBuilder.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Extbase\Mvc\Web;
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
18 use TYPO3\CMS\Extbase\Mvc\Exception as MvcException;
19 
24 {
28  protected $objectManager;
29 
35  protected $vendorName;
36 
42  protected $pluginName = 'plugin';
43 
49  protected $extensionName;
50 
57 
63  protected $defaultFormat = 'html';
64 
70  protected $allowedControllerActions = array();
71 
76 
80  protected $extensionService;
81 
86 
90  public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager)
91  {
92  $this->objectManager = $objectManager;
93  }
94 
98  public function injectConfigurationManager(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface $configurationManager)
99  {
100  $this->configurationManager = $configurationManager;
101  }
102 
106  public function injectExtensionService(\TYPO3\CMS\Extbase\Service\ExtensionService $extensionService)
107  {
108  $this->extensionService = $extensionService;
109  }
110 
114  public function injectEnvironmentService(\TYPO3\CMS\Extbase\Service\EnvironmentService $environmentService)
115  {
116  $this->environmentService = $environmentService;
117  }
118 
123  protected function loadDefaultValues()
124  {
125  $configuration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
126  if (empty($configuration['extensionName'])) {
127  throw new MvcException('"extensionName" is not properly configured. Request can\'t be dispatched!', 1289843275);
128  }
129  if (empty($configuration['pluginName'])) {
130  throw new MvcException('"pluginName" is not properly configured. Request can\'t be dispatched!', 1289843277);
131  }
132  if (!empty($configuration['vendorName'])) {
133  $this->vendorName = $configuration['vendorName'];
134  } else {
135  $this->vendorName = null;
136  }
137  $this->extensionName = $configuration['extensionName'];
138  $this->pluginName = $configuration['pluginName'];
139  $this->defaultControllerName = current(array_keys($configuration['controllerConfiguration']));
140  $this->allowedControllerActions = array();
141  foreach ($configuration['controllerConfiguration'] as $controllerName => $controllerActions) {
142  $this->allowedControllerActions[$controllerName] = $controllerActions['actions'];
143  }
144  if (!empty($configuration['format'])) {
145  $this->defaultFormat = $configuration['format'];
146  }
147  }
148 
154  public function build()
155  {
156  $this->loadDefaultValues();
157  $pluginNamespace = $this->extensionService->getPluginNamespace($this->extensionName, $this->pluginName);
158  $parameters = \TYPO3\CMS\Core\Utility\GeneralUtility::_GPmerged($pluginNamespace);
159  $files = $this->untangleFilesArray($_FILES);
160  if (isset($files[$pluginNamespace]) && is_array($files[$pluginNamespace])) {
161  $parameters = \TYPO3\CMS\Extbase\Utility\ArrayUtility::arrayMergeRecursiveOverrule($parameters, $files[$pluginNamespace]);
162  }
163  $controllerName = $this->resolveControllerName($parameters);
164  $actionName = $this->resolveActionName($controllerName, $parameters);
166  $request = $this->objectManager->get(\TYPO3\CMS\Extbase\Mvc\Web\Request::class);
167  if ($this->vendorName !== null) {
168  $request->setControllerVendorName($this->vendorName);
169  }
170  $request->setPluginName($this->pluginName);
171  $request->setControllerExtensionName($this->extensionName);
172  $request->setControllerName($controllerName);
173  $request->setControllerActionName($actionName);
174  $request->setRequestUri(\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL'));
175  $request->setBaseUri(\TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('TYPO3_SITE_URL'));
176  $request->setMethod($this->environmentService->getServerRequestMethod());
177  if (is_string($parameters['format']) && $parameters['format'] !== '') {
178  $request->setFormat(filter_var($parameters['format'], FILTER_SANITIZE_STRING));
179  } else {
180  $request->setFormat($this->defaultFormat);
181  }
182  foreach ($parameters as $argumentName => $argumentValue) {
183  $request->setArgument($argumentName, $argumentValue);
184  }
185  return $request;
186  }
187 
199  protected function resolveControllerName(array $parameters)
200  {
201  if (!isset($parameters['controller']) || $parameters['controller'] === '') {
202  if ($this->defaultControllerName === '') {
203  throw new MvcException('The default controller for extension "' . $this->extensionName . '" and plugin "' . $this->pluginName . '" can not be determined. Please check for TYPO3\\CMS\\Extbase\\Utility\\ExtensionUtility::configurePlugin() in your ext_localconf.php.', 1316104317);
204  }
206  }
207  $allowedControllerNames = array_keys($this->allowedControllerActions);
208  if (!in_array($parameters['controller'], $allowedControllerNames)) {
209  $configuration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
210  if (isset($configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) && (bool)$configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) {
211  throw new \TYPO3\CMS\Core\Error\Http\PageNotFoundException('The requested resource was not found', 1313857897);
212  } elseif (isset($configuration['mvc']['callDefaultActionIfActionCantBeResolved']) && (bool)$configuration['mvc']['callDefaultActionIfActionCantBeResolved']) {
214  }
215  throw new \TYPO3\CMS\Extbase\Mvc\Exception\InvalidControllerNameException('The controller "' . $parameters['controller'] . '" is not allowed by this plugin. Please check for TYPO3\\CMS\\Extbase\\Utility\\ExtensionUtility::configurePlugin() in your ext_localconf.php.', 1313855173);
216  }
217  return filter_var($parameters['controller'], FILTER_SANITIZE_STRING);
218  }
219 
232  protected function resolveActionName($controllerName, array $parameters)
233  {
234  $defaultActionName = is_array($this->allowedControllerActions[$controllerName]) ? current($this->allowedControllerActions[$controllerName]) : '';
235  if (!isset($parameters['action']) || $parameters['action'] === '') {
236  if ($defaultActionName === '') {
237  throw new MvcException('The default action can not be determined for controller "' . $controllerName . '". Please check TYPO3\\CMS\\Extbase\\Utility\\ExtensionUtility::configurePlugin() in your ext_localconf.php.', 1295479651);
238  }
239  return $defaultActionName;
240  }
241  $actionName = $parameters['action'];
242  $allowedActionNames = $this->allowedControllerActions[$controllerName];
243  if (!in_array($actionName, $allowedActionNames)) {
244  $configuration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
245  if (isset($configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) && (bool)$configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) {
246  throw new \TYPO3\CMS\Core\Error\Http\PageNotFoundException('The requested resource was not found', 1313857898);
247  } elseif (isset($configuration['mvc']['callDefaultActionIfActionCantBeResolved']) && (bool)$configuration['mvc']['callDefaultActionIfActionCantBeResolved']) {
248  return $defaultActionName;
249  }
250  throw new \TYPO3\CMS\Extbase\Mvc\Exception\InvalidActionNameException('The action "' . $actionName . '" (controller "' . $controllerName . '") is not allowed by this plugin. Please check TYPO3\\CMS\\Extbase\\Utility\\ExtensionUtility::configurePlugin() in your ext_localconf.php.', 1313855175);
251  }
252  return filter_var($actionName, FILTER_SANITIZE_STRING);
253  }
254 
262  protected function untangleFilesArray(array $convolutedFiles)
263  {
264  $untangledFiles = array();
265  $fieldPaths = array();
266  foreach ($convolutedFiles as $firstLevelFieldName => $fieldInformation) {
267  if (!is_array($fieldInformation['error'])) {
268  $fieldPaths[] = array($firstLevelFieldName);
269  } else {
270  $newFieldPaths = $this->calculateFieldPaths($fieldInformation['error'], $firstLevelFieldName);
271  array_walk($newFieldPaths, function (&$value, $key) {
272  $value = explode('/', $value);
273  });
274  $fieldPaths = array_merge($fieldPaths, $newFieldPaths);
275  }
276  }
277  foreach ($fieldPaths as $fieldPath) {
278  if (count($fieldPath) === 1) {
279  $fileInformation = $convolutedFiles[$fieldPath[0]];
280  } else {
281  $fileInformation = array();
282  foreach ($convolutedFiles[$fieldPath[0]] as $key => $subStructure) {
283  $fileInformation[$key] = \TYPO3\CMS\Extbase\Utility\ArrayUtility::getValueByPath($subStructure, array_slice($fieldPath, 1));
284  }
285  }
286  $untangledFiles = \TYPO3\CMS\Extbase\Utility\ArrayUtility::setValueByPath($untangledFiles, $fieldPath, $fileInformation);
287  }
288  return $untangledFiles;
289  }
290 
298  protected function calculateFieldPaths(array $structure, $firstLevelFieldName = null)
299  {
300  $fieldPaths = array();
301  if (is_array($structure)) {
302  foreach ($structure as $key => $subStructure) {
303  $fieldPath = ($firstLevelFieldName !== null ? $firstLevelFieldName . '/' : '') . $key;
304  if (is_array($subStructure)) {
305  foreach ($this->calculateFieldPaths($subStructure) as $subFieldPath) {
306  $fieldPaths[] = $fieldPath . '/' . $subFieldPath;
307  }
308  } else {
309  $fieldPaths[] = $fieldPath;
310  }
311  }
312  }
313  return $fieldPaths;
314  }
315 }