EmulatedAdminhtmlAreaProcessor.php 2.07 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Config\Console\Command;

use Magento\Framework\App\Area;
use Magento\Framework\App\State;
use Magento\Framework\Config\ScopeInterface;

/**
 * Emulates callback inside adminhtml area code and adminhtml scope.
 * It is used for CLI commands which should work with data available only in adminhtml scope.
 */
class EmulatedAdminhtmlAreaProcessor
{
    /**
     * The application scope manager.
     *
     * @var ScopeInterface
     */
    private $scope;

    /**
     * The application state manager.
     *
     * @var State
     */
    private $state;

    /**
     * @param ScopeInterface $scope The application scope manager
     * @param State $state The application state manager
     */
    public function __construct(ScopeInterface $scope, State $state)
    {
        $this->scope = $scope;
        $this->state = $state;
    }

    /**
     * Emulates callback inside adminhtml area code and adminhtml scope.
     *
     * Returns the return value of the callback.
     *
     * @param callable $callback The callable to be called
     * @param array $params The parameters to be passed to the callback, as an indexed array
     * @return bool|int|float|string|array|null - as the result of this method is the result of callback,
     * you can use callback only with specified in this method return types
     * @throws \Exception The exception is thrown if the parameter $callback throws an exception
     */
    public function process(callable $callback, array $params = [])
    {
        $currentScope = $this->scope->getCurrentScope();
        try {
            return $this->state->emulateAreaCode(Area::AREA_ADMINHTML, function () use ($callback, $params) {
                $this->scope->setCurrentScope(Area::AREA_ADMINHTML);
                return call_user_func_array($callback, $params);
            });
        } catch (\Exception $exception) {
            throw $exception;
        } finally {
            $this->scope->setCurrentScope($currentScope);
        }
    }
}