TYPO3CMS  8
 All Classes Namespaces Files Functions Variables Pages
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 
56  protected $defaultControllerName = '';
57 
63  protected $defaultFormat = 'html';
64 
70  protected $allowedControllerActions = [];
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 = (string)current(array_keys($configuration['controllerConfiguration']));
140  $this->allowedControllerActions = [];
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 = array_replace_recursive($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 (empty($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(
216  'The controller "' . $parameters['controller'] . '" is not allowed by plugin "' . $this->pluginName . '". Please check for TYPO3\\CMS\\Extbase\\Utility\\ExtensionUtility::configurePlugin() in your ext_localconf.php.',
217  1313855173
218  );
219  }
220  return filter_var($parameters['controller'], FILTER_SANITIZE_STRING);
221  }
222 
235  protected function resolveActionName($controllerName, array $parameters)
236  {
237  $defaultActionName = is_array($this->allowedControllerActions[$controllerName]) ? current($this->allowedControllerActions[$controllerName]) : '';
238  if (!isset($parameters['action']) || $parameters['action'] === '') {
239  if ($defaultActionName === '') {
240  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);
241  }
242  return $defaultActionName;
243  }
244  $actionName = $parameters['action'];
245  $allowedActionNames = $this->allowedControllerActions[$controllerName];
246  if (!in_array($actionName, $allowedActionNames)) {
247  $configuration = $this->configurationManager->getConfiguration(ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
248  if (isset($configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) && (bool)$configuration['mvc']['throwPageNotFoundExceptionIfActionCantBeResolved']) {
249  throw new \TYPO3\CMS\Core\Error\Http\PageNotFoundException('The requested resource was not found', 1313857898);
250  } elseif (isset($configuration['mvc']['callDefaultActionIfActionCantBeResolved']) && (bool)$configuration['mvc']['callDefaultActionIfActionCantBeResolved']) {
251  return $defaultActionName;
252  }
253  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);
254  }
255  return filter_var($actionName, FILTER_SANITIZE_STRING);
256  }
257 
265  protected function untangleFilesArray(array $convolutedFiles)
266  {
267  $untangledFiles = [];
268  $fieldPaths = [];
269  foreach ($convolutedFiles as $firstLevelFieldName => $fieldInformation) {
270  if (!is_array($fieldInformation['error'])) {
271  $fieldPaths[] = [$firstLevelFieldName];
272  } else {
273  $newFieldPaths = $this->calculateFieldPaths($fieldInformation['error'], $firstLevelFieldName);
274  array_walk($newFieldPaths, function (&$value, $key) {
275  $value = explode('/', $value);
276  });
277  $fieldPaths = array_merge($fieldPaths, $newFieldPaths);
278  }
279  }
280  foreach ($fieldPaths as $fieldPath) {
281  if (count($fieldPath) === 1) {
282  $fileInformation = $convolutedFiles[$fieldPath[0]];
283  } else {
284  $fileInformation = [];
285  foreach ($convolutedFiles[$fieldPath[0]] as $key => $subStructure) {
286  try {
287  $fileInformation[$key] = \TYPO3\CMS\Core\Utility\ArrayUtility::getValueByPath($subStructure, array_slice($fieldPath, 1));
288  } catch (\RuntimeException $e) {
289  // do nothing if the path is invalid
290  }
291  }
292  }
293  $untangledFiles = \TYPO3\CMS\Core\Utility\ArrayUtility::setValueByPath($untangledFiles, $fieldPath, $fileInformation);
294  }
295  return $untangledFiles;
296  }
297 
305  protected function calculateFieldPaths(array $structure, $firstLevelFieldName = null)
306  {
307  $fieldPaths = [];
308  if (is_array($structure)) {
309  foreach ($structure as $key => $subStructure) {
310  $fieldPath = ($firstLevelFieldName !== null ? $firstLevelFieldName . '/' : '') . $key;
311  if (is_array($subStructure)) {
312  foreach ($this->calculateFieldPaths($subStructure) as $subFieldPath) {
313  $fieldPaths[] = $fieldPath . '/' . $subFieldPath;
314  }
315  } else {
316  $fieldPaths[] = $fieldPath;
317  }
318  }
319  }
320  return $fieldPaths;
321  }
322 }
injectEnvironmentService(\TYPO3\CMS\Extbase\Service\EnvironmentService $environmentService)
injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager)
static getValueByPath(array $array, $path, $delimiter= '/')
injectExtensionService(\TYPO3\CMS\Extbase\Service\ExtensionService $extensionService)
injectConfigurationManager(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface $configurationManager)
calculateFieldPaths(array $structure, $firstLevelFieldName=null)
resolveActionName($controllerName, array $parameters)
static setValueByPath(array $array, $path, $value, $delimiter= '/')