InputParamsResolver.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Webapi\Controller\Rest;
  7. use Magento\Framework\Webapi\ServiceInputProcessor;
  8. use Magento\Framework\Webapi\Rest\Request as RestRequest;
  9. use Magento\Webapi\Controller\Rest\Router;
  10. use Magento\Webapi\Controller\Rest\Router\Route;
  11. /**
  12. * This class is responsible for retrieving resolved input data
  13. */
  14. class InputParamsResolver
  15. {
  16. /**
  17. * @var RestRequest
  18. */
  19. private $request;
  20. /**
  21. * @var ParamsOverrider
  22. */
  23. private $paramsOverrider;
  24. /**
  25. * @var ServiceInputProcessor
  26. */
  27. private $serviceInputProcessor;
  28. /**
  29. * @var Router
  30. */
  31. private $router;
  32. /**
  33. * @var Route
  34. */
  35. private $route;
  36. /**
  37. * @var RequestValidator
  38. */
  39. private $requestValidator;
  40. /**
  41. * Initialize dependencies
  42. *
  43. * @param RestRequest $request
  44. * @param ParamsOverrider $paramsOverrider
  45. * @param ServiceInputProcessor $serviceInputProcessor
  46. * @param Router $router
  47. * @param RequestValidator $requestValidator
  48. */
  49. public function __construct(
  50. RestRequest $request,
  51. ParamsOverrider $paramsOverrider,
  52. ServiceInputProcessor $serviceInputProcessor,
  53. Router $router,
  54. RequestValidator $requestValidator
  55. ) {
  56. $this->request = $request;
  57. $this->paramsOverrider = $paramsOverrider;
  58. $this->serviceInputProcessor = $serviceInputProcessor;
  59. $this->router = $router;
  60. $this->requestValidator = $requestValidator;
  61. }
  62. /**
  63. * Process and resolve input parameters
  64. *
  65. * @return array
  66. * @throws \Magento\Framework\Webapi\Exception
  67. */
  68. public function resolve()
  69. {
  70. $this->requestValidator->validate();
  71. $route = $this->getRoute();
  72. $serviceMethodName = $route->getServiceMethod();
  73. $serviceClassName = $route->getServiceClass();
  74. /*
  75. * Valid only for updates using PUT when passing id value both in URL and body
  76. */
  77. if ($this->request->getHttpMethod() == RestRequest::HTTP_METHOD_PUT) {
  78. $inputData = $this->paramsOverrider->overrideRequestBodyIdWithPathParam(
  79. $this->request->getParams(),
  80. $this->request->getBodyParams(),
  81. $serviceClassName,
  82. $serviceMethodName
  83. );
  84. $inputData = array_merge($inputData, $this->request->getParams());
  85. } else {
  86. $inputData = $this->request->getRequestData();
  87. }
  88. $inputData = $this->paramsOverrider->override($inputData, $route->getParameters());
  89. $inputParams = $this->serviceInputProcessor->process($serviceClassName, $serviceMethodName, $inputData);
  90. return $inputParams;
  91. }
  92. /**
  93. * Retrieve current route.
  94. *
  95. * @return Route
  96. */
  97. public function getRoute()
  98. {
  99. if (!$this->route) {
  100. $this->route = $this->router->match($this->request);
  101. }
  102. return $this->route;
  103. }
  104. }