ParserPlugin.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. declare(strict_types=1);
  3. namespace Yansongda\Pay\Plugin;
  4. use Closure;
  5. use Psr\Http\Message\ResponseInterface;
  6. use Yansongda\Pay\Contract\DirectionInterface;
  7. use Yansongda\Pay\Contract\PackerInterface;
  8. use Yansongda\Pay\Contract\PluginInterface;
  9. use Yansongda\Pay\Exception\ContainerException;
  10. use Yansongda\Pay\Exception\Exception;
  11. use Yansongda\Pay\Exception\InvalidConfigException;
  12. use Yansongda\Pay\Exception\ServiceNotFoundException;
  13. use Yansongda\Pay\Pay;
  14. use Yansongda\Pay\Rocket;
  15. class ParserPlugin implements PluginInterface
  16. {
  17. /**
  18. * @throws ServiceNotFoundException
  19. * @throws ContainerException
  20. * @throws InvalidConfigException
  21. */
  22. public function assembly(Rocket $rocket, Closure $next): Rocket
  23. {
  24. /* @var Rocket $rocket */
  25. $rocket = $next($rocket);
  26. /* @var ResponseInterface $response */
  27. $response = $rocket->getDestination();
  28. return $rocket->setDestination(
  29. $this->getDirection($rocket)->parse($this->getPacker($rocket), $response)
  30. );
  31. }
  32. /**
  33. * @throws ContainerException
  34. * @throws InvalidConfigException
  35. * @throws ServiceNotFoundException
  36. */
  37. protected function getDirection(Rocket $rocket): DirectionInterface
  38. {
  39. $packer = Pay::get($rocket->getDirection());
  40. $packer = is_string($packer) ? Pay::get($packer) : $packer;
  41. if (!$packer instanceof DirectionInterface) {
  42. throw new InvalidConfigException(Exception::INVALID_PARSER);
  43. }
  44. return $packer;
  45. }
  46. /**
  47. * @throws ContainerException
  48. * @throws InvalidConfigException
  49. * @throws ServiceNotFoundException
  50. */
  51. protected function getPacker(Rocket $rocket): PackerInterface
  52. {
  53. $packer = Pay::get($rocket->getPacker());
  54. $packer = is_string($packer) ? Pay::get($packer) : $packer;
  55. if (!$packer instanceof PackerInterface) {
  56. throw new InvalidConfigException(Exception::INVALID_PACKER);
  57. }
  58. return $packer;
  59. }
  60. }