* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ declare(strict_types=1); namespace PrestaShop\Module\Mbo\Module\Workflow; use Exception; use PrestaShop\Module\Mbo\Helpers\ErrorHelper; use PrestaShop\Module\Mbo\Helpers\ModuleErrorHelper; use PrestaShop\Module\Mbo\Module\Exception\TransitionFailedException; use PrestaShop\Module\Mbo\Module\TransitionModule; use PrestaShop\Module\Mbo\Module\Workflow\Exception\UnknownTransitionException; use Symfony\Component\String\UnicodeString; use Symfony\Contracts\Translation\TranslatorInterface; class TransitionApplier { /** * @var TransitionsManager */ private $transitionsManager; /** * @var TranslatorInterface */ private $translator; public function __construct( TransitionsManager $transitionsManager, TranslatorInterface $translator ) { $this->transitionsManager = $transitionsManager; $this->translator = $translator; } /** * @throws Exception */ public function apply(TransitionModule $module, string $transitionName, array $context = []) { $method = (new UnicodeString($transitionName))->camel()->toString(); $executionContext = [ 'transition' => $transitionName, 'moduleName' => $module->getName(), 'moduleVersion' => $module->getVersion(), 'context' => $context, ]; try { if (!method_exists($this->transitionsManager, $method)) { throw new UnknownTransitionException($transitionName, $executionContext); } if (!$this->transitionsManager->{$method}($module, $context)) { throw new TransitionFailedException($transitionName, $executionContext); } } catch (Exception $e) { throw ModuleErrorHelper::reportAndConvertError($e, $executionContext); } } }