Issues (3627)

ConfigBundle/EventListener/ConfigSubscriber.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\ConfigBundle\EventListener;
13
14
use Mautic\ConfigBundle\ConfigEvents;
15
use Mautic\ConfigBundle\Event\ConfigEvent;
16
use Mautic\ConfigBundle\Service\ConfigChangeLogger;
17
use Mautic\CoreBundle\Helper\CoreParametersHelper;
18
use Symfony\Component\DependencyInjection\Container;
19
use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
20
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
21
22
class ConfigSubscriber implements EventSubscriberInterface
23
{
24
    /**
25
     * @var CoreParametersHelper
26
     */
27
    private $paramHelper;
28
29
    /**
30
     * @var ConfigChangeLogger
31
     */
32
    private $configChangeLogger;
33
34
    /**
35
     * @var Container
36
     */
37
    private $container;
38
39
    public function __construct(CoreParametersHelper $paramHelper, Container $container, ConfigChangeLogger $configChangeLogger)
40
    {
41
        $this->paramHelper        = $paramHelper;
42
        $this->configChangeLogger = $configChangeLogger;
43
        $this->container          = $container;
44
    }
45
46
    /**
47
     * @return array
48
     */
49
    public static function getSubscribedEvents()
50
    {
51
        return [
52
            ConfigEvents::CONFIG_PRE_SAVE  => ['escapePercentCharacters', 1000],
53
            ConfigEvents::CONFIG_POST_SAVE => ['onConfigPostSave', 0],
54
        ];
55
    }
56
57
    public function escapePercentCharacters(ConfigEvent $event)
58
    {
59
        $config = $event->getConfig();
60
61
        $escapeInvalidReference = function ($reference) {
62
            // only escape when the referenced variable doesn't exist as either a Mautic config parameter or Symfony container parameter
63
64
            try {
65
                $this->container->getParameter($reference[1]);
66
67
                return $reference[0];
68
            } catch (ParameterNotFoundException $exception) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
69
            }
70
71
            if (!$this->paramHelper->has($reference[1])) {
72
                return '%'.$reference[0].'%';
73
            }
74
75
            return $reference[0];
76
        };
77
78
        array_walk_recursive($config, function (&$value) use ($escapeInvalidReference) {
79
            if (is_string($value)) {
80
                $value = preg_replace_callback('/%(.*?)%/s', $escapeInvalidReference, $value);
81
            }
82
        });
83
        $event->setConfig($config);
84
    }
85
86
    public function onConfigPostSave(ConfigEvent $event)
87
    {
88
        if ($originalNormData = $event->getOriginalNormData()) {
89
            // We have something to log
90
            $this->configChangeLogger
91
                ->setOriginalNormData($originalNormData)
92
                ->log($event->getNormData());
93
        }
94
    }
95
}
96