vendor/ibexa/core/src/bundle/Core/DependencyInjection/Configuration/Parser/Common.php line 69

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. namespace Ibexa\Bundle\Core\DependencyInjection\Configuration\Parser;
  7. use Ibexa\Bundle\Core\DependencyInjection\Configuration\AbstractParser;
  8. use Ibexa\Bundle\Core\DependencyInjection\Configuration\SiteAccessAware\ContextualizerInterface;
  9. use Ibexa\Bundle\Core\DependencyInjection\Configuration\Suggestion\Collector\SuggestionCollectorAwareInterface;
  10. use Ibexa\Bundle\Core\DependencyInjection\Configuration\Suggestion\Collector\SuggestionCollectorInterface;
  11. use Ibexa\Bundle\Core\DependencyInjection\Configuration\Suggestion\ConfigSuggestion;
  12. use Symfony\Component\Config\Definition\Builder\NodeBuilder;
  13. /**
  14.  * Configuration parser handling all basic configuration (aka "common").
  15.  */
  16. class Common extends AbstractParser implements SuggestionCollectorAwareInterface
  17. {
  18.     /** @var \Ibexa\Bundle\Core\DependencyInjection\Configuration\Suggestion\Collector\SuggestionCollectorInterface */
  19.     private $suggestionCollector;
  20.     /**
  21.      * Adds semantic configuration definition.
  22.      *
  23.      * @param \Symfony\Component\Config\Definition\Builder\NodeBuilder $nodeBuilder Node just under ibexa.system.<siteaccess>
  24.      */
  25.     public function addSemanticConfig(NodeBuilder $nodeBuilder)
  26.     {
  27.         $nodeBuilder
  28.             ->scalarNode('repository')->info('The repository to use. Choose among ibexa.repositories.')->end()
  29.             // @deprecated
  30.             // Use ibexa.repositories / repository settings instead.
  31.             ->arrayNode('database')
  32.                 ->info('DEPRECATED. Use ibexa.repositories / repository settings instead.')
  33.                 ->children()
  34.                     ->enumNode('type')->values(['mysql''pgsql''sqlite'])->info('The database driver. Can be mysql, pgsql or sqlite.')->end()
  35.                     ->scalarNode('server')->end()
  36.                     ->scalarNode('port')->end()
  37.                     ->scalarNode('user')->cannotBeEmpty()->end()
  38.                     ->scalarNode('password')->end()
  39.                     ->scalarNode('database_name')->cannotBeEmpty()->end()
  40.                     ->scalarNode('charset')->defaultValue('utf8')->end()
  41.                     ->scalarNode('socket')->end()
  42.                     ->arrayNode('options')
  43.                         ->info('Arbitrary options, supported by your DB driver ("driver-opts" in PDO)')
  44.                         ->example(['foo' => 'bar''someOptionName' => ['one''two''three']])
  45.                         ->useAttributeAsKey('key')
  46.                         ->prototype('variable')->end()
  47.                     ->end()
  48.                     ->scalarNode('dsn')->info('Full database DSN. Will replace settings above.')->example('mysql://root:root@localhost:3306/ezdemo')->end()
  49.                 ->end()
  50.             ->end()
  51.             ->scalarNode('cache_service_name')
  52.                 ->example('cache.app')
  53.                 ->info('The cache pool service name to use for a siteaccess / siteaccess-group, *must* be present.')
  54.             ->end()
  55.             ->scalarNode('var_dir')
  56.                 ->cannotBeEmpty()
  57.                 ->example('var/ibexa_demo_site')
  58.                 ->info('The directory relative to web/ where files are stored. Default value is "var"')
  59.             ->end()
  60.             ->arrayNode('api_keys')
  61.                 ->info('Collection of API keys')
  62.                 ->addDefaultsIfNotSet()
  63.                 ->children()
  64.                     ->scalarNode('google_maps')
  65.                         ->setDeprecated('The child node "%node%" at path "%path%" is no longer used and deprecated.')
  66.                         ->info('Google Maps API Key, required as of Google Maps v3 to make sure maps show up correctly.')
  67.                     ->end()
  68.                 ->end()
  69.             ->end()
  70.             ->scalarNode('storage_dir')
  71.                 ->cannotBeEmpty()
  72.                 ->info("Directory where to place new files for storage, it's relative to var directory. Default value is 'storage'")
  73.             ->end()
  74.             ->scalarNode('binary_dir')
  75.                 ->cannotBeEmpty()
  76.                 ->info('Directory where binary files (from ezbinaryfile field type) are stored. Default value is "original"')
  77.             ->end()
  78.             // @deprecated since 5.3. Will be removed in 6.x.
  79.             ->scalarNode('session_name')
  80.                 ->info('DEPRECATED. Use session.name instead.')
  81.             ->end()
  82.             ->arrayNode('session')
  83.                 ->info('Session options. Will override options defined in Symfony framework.session.*')
  84.                 ->children()
  85.                     ->scalarNode('name')
  86.                         ->info('The session name. If you want a session name per siteaccess, use "{siteaccess_hash}" token. Will override default session name from framework.session.name')
  87.                         ->example('eZSESSID{siteaccess_hash}')
  88.                     ->end()
  89.                     ->scalarNode('cookie_lifetime')->end()
  90.                     ->scalarNode('cookie_path')->end()
  91.                     ->scalarNode('cookie_domain')->end()
  92.                     ->booleanNode('cookie_secure')->end()
  93.                     ->booleanNode('cookie_httponly')->end()
  94.                 ->end()
  95.             ->end()
  96.             ->scalarNode('pagelayout')
  97.                 ->info('The default layout to use')
  98.                 ->example('AppBundle::pagelayout.html.twig')
  99.                 ->setDeprecated('The "pagelayout" option is deprecated. Use "page_layout" instead.')
  100.             ->end()
  101.             ->scalarNode('page_layout')
  102.                 ->info('The default layout to use')
  103.                 ->example('AppBundle::page_layout.html.twig')
  104.             ->end()
  105.             ->scalarNode('index_page')
  106.                 ->info('The page that the index page will show. Default value is null.')
  107.                 ->example('/Getting-Started')
  108.             ->end()
  109.             ->scalarNode('default_page')
  110.                 ->info('The default page to show, e.g. after user login this will be used for default redirection. If provided, will override "default_target_path" from security.yml.')
  111.                 ->example('/Getting-Started')
  112.             ->end()
  113.             ->arrayNode('http_cache')
  114.                 ->info('Settings related to Http cache')
  115.                 ->children()
  116.                     ->arrayNode('purge_servers')
  117.                         ->info('Servers to use for Http PURGE (will NOT be used if ibexa.http_cache.purge_type is "local").')
  118.                         ->example(['http://localhost/''http://another.server/'])
  119.                         ->requiresAtLeastOneElement()
  120.                         ->prototype('scalar')->end()
  121.                     ->end()
  122.                 ->end()
  123.             ->end()
  124.             ->scalarNode('anonymous_user_id')
  125.                 ->cannotBeEmpty()
  126.                 ->example('10')
  127.                 ->info('The ID of the user used for everyone who is not logged in.')
  128.             ->end()
  129.             ->arrayNode('user')
  130.                 ->children()
  131.                     ->scalarNode('layout')
  132.                         ->info('Layout template to use for user related actions. This is most likely the base pagelayout template of your site.')
  133.                         ->example('pagelayout.html.twig')
  134.                     ->end()
  135.                     ->scalarNode('login_template')
  136.                         ->info('Template to use for login form. Defaults to @IbexaCore/Security/login.html.twig')
  137.                         ->example('login.html.twig')
  138.                     ->end()
  139.                 ->end()
  140.             ->end();
  141.     }
  142.     public function preMap(array $configContextualizerInterface $contextualizer)
  143.     {
  144.         $contextualizer->mapConfigArray('session'$config);
  145.     }
  146.     public function mapConfig(array &$scopeSettings$currentScopeContextualizerInterface $contextualizer)
  147.     {
  148.         if (isset($scopeSettings['database'])) {
  149.             $this->addDatabaseConfigSuggestion($currentScope$scopeSettings['database']);
  150.         }
  151.         if (isset($scopeSettings['repository'])) {
  152.             $contextualizer->setContextualParameter('repository'$currentScope$scopeSettings['repository']);
  153.         }
  154.         if (isset($scopeSettings['cache_service_name'])) {
  155.             $contextualizer->setContextualParameter('cache_service_name'$currentScope$scopeSettings['cache_service_name']);
  156.         }
  157.         if (isset($scopeSettings['var_dir'])) {
  158.             $contextualizer->setContextualParameter('var_dir'$currentScope$scopeSettings['var_dir']);
  159.         }
  160.         if (isset($scopeSettings['storage_dir'])) {
  161.             $contextualizer->setContextualParameter('storage_dir'$currentScope$scopeSettings['storage_dir']);
  162.         }
  163.         if (isset($scopeSettings['binary_dir'])) {
  164.             $contextualizer->setContextualParameter('binary_dir'$currentScope$scopeSettings['binary_dir']);
  165.         }
  166.         $contextualizer->setContextualParameter('api_keys'$currentScope$scopeSettings['api_keys']);
  167.         foreach ($scopeSettings['api_keys'] as $key => $value) {
  168.             $contextualizer->setContextualParameter('api_keys.' $key$currentScope$value);
  169.         }
  170.         // session_name setting is deprecated in favor of session.name
  171.         $container $contextualizer->getContainer();
  172.         $sessionOptions $container->hasParameter("ibexa.site_access.config.$currentScope.session") ? $container->getParameter("ibexa.site_access.config.$currentScope.session") : [];
  173.         if (isset($sessionOptions['name'])) {
  174.             $contextualizer->setContextualParameter('session_name'$currentScope$sessionOptions['name']);
  175.         }
  176.         // @deprecated session_name is deprecated, but if present, in addition to session.name, consider it instead (BC).
  177.         if (isset($scopeSettings['session_name'])) {
  178.             $sessionOptions['name'] = $scopeSettings['session_name'];
  179.             $contextualizer->setContextualParameter('session_name'$currentScope$scopeSettings['session_name']);
  180.             $contextualizer->setContextualParameter('session'$currentScope$sessionOptions);
  181.         }
  182.         if (isset($scopeSettings['http_cache']['purge_servers'])) {
  183.             $contextualizer->setContextualParameter('http_cache.purge_servers'$currentScope$scopeSettings['http_cache']['purge_servers']);
  184.         }
  185.         if (isset($scopeSettings['anonymous_user_id'])) {
  186.             $contextualizer->setContextualParameter('anonymous_user_id'$currentScope$scopeSettings['anonymous_user_id']);
  187.         }
  188.         if (isset($scopeSettings['user']['layout'])) {
  189.             $contextualizer->setContextualParameter('security.base_layout'$currentScope$scopeSettings['user']['layout']);
  190.         }
  191.         if (isset($scopeSettings['user']['login_template'])) {
  192.             $contextualizer->setContextualParameter('security.login_template'$currentScope$scopeSettings['user']['login_template']);
  193.         }
  194.         if (isset($scopeSettings['index_page'])) {
  195.             $contextualizer->setContextualParameter('index_page'$currentScope$scopeSettings['index_page']);
  196.         }
  197.         if (isset($scopeSettings['default_page'])) {
  198.             $contextualizer->setContextualParameter('default_page'$currentScope'/' ltrim($scopeSettings['default_page'], '/'));
  199.         }
  200.         if (isset($scopeSettings['pagelayout'])) {
  201.             // note: "pagelayout" is deprecated, deprecation message is set via Semantic Config Node Builder
  202.             $contextualizer->setContextualParameter('pagelayout'$currentScope$scopeSettings['pagelayout']);
  203.             $contextualizer->setContextualParameter('page_layout'$currentScope$scopeSettings['pagelayout']);
  204.         }
  205.         if (isset($scopeSettings['page_layout'])) {
  206.             // note: "page_layout" as the new setting always takes precedence
  207.             $contextualizer->setContextualParameter('pagelayout'$currentScope$scopeSettings['page_layout']);
  208.             $contextualizer->setContextualParameter('page_layout'$currentScope$scopeSettings['page_layout']);
  209.         }
  210.     }
  211.     /**
  212.      * Injects SuggestionCollector.
  213.      *
  214.      * @param \Ibexa\Bundle\Core\DependencyInjection\Configuration\Suggestion\Collector\SuggestionCollectorInterface $suggestionCollector
  215.      */
  216.     public function setSuggestionCollector(SuggestionCollectorInterface $suggestionCollector)
  217.     {
  218.         $this->suggestionCollector $suggestionCollector;
  219.     }
  220.     private function addDatabaseConfigSuggestion($sa, array $databaseConfig)
  221.     {
  222.         $suggestion = new ConfigSuggestion(
  223.             <<<EOT
  224. Database configuration has changed for Ibexa Content repository.
  225. Please define:
  226.  - An entry in ibexa.repositories
  227.  - A Doctrine connection (You may check configuration reference for Doctrine "config:dump-reference doctrine" console command.)
  228.  - A reference to configured repository in ibexa.system.$sa.repository
  229. EOT
  230.         );
  231.         $suggestion->setMandatory(true);
  232.         $suggestionArray = [
  233.             'driver' => 'pdo_mysql',
  234.             'host' => 'localhost',
  235.             'dbname' => 'my_database',
  236.             'user' => 'my_user',
  237.             'password' => 'some_password',
  238.             'charset' => 'UTF8',
  239.         ];
  240.         if (!empty($databaseConfig)) {
  241.             $suggestionArray['dbname'] = $databaseConfig['database_name'];
  242.             $suggestionArray['host'] = $databaseConfig['server'];
  243.             $driverMap = [
  244.                 'mysql' => 'pdo_mysql',
  245.                 'pgsql' => 'pdo_pgsql',
  246.                 'sqlite' => 'pdo_sqlite',
  247.             ];
  248.             if (isset($driverMap[$databaseConfig['type']])) {
  249.                 $suggestionArray['driver'] = $driverMap[$databaseConfig['type']];
  250.             } else {
  251.                 $suggestionArray['driver'] = $databaseConfig['type'];
  252.             }
  253.             if (isset($databaseConfig['socket'])) {
  254.                 $suggestionArray['unix_socket'] = $databaseConfig['socket'];
  255.             }
  256.             $suggestionArray['options'] = $databaseConfig['options'];
  257.             $suggestionArray['user'] = $databaseConfig['user'];
  258.             $suggestionArray['password'] = $databaseConfig['password'];
  259.         }
  260.         $suggestion->setSuggestion(
  261.             [
  262.                 'doctrine' => [
  263.                     'dbal' => [
  264.                         'connections' => [
  265.                             'default' => $suggestionArray,
  266.                         ],
  267.                     ],
  268.                 ],
  269.                 'ibexa' => [
  270.                     'repositories' => [
  271.                         'my_repository' => [
  272.                             'storage' => [
  273.                                 'engine' => 'legacy',
  274.                                 'connection' => 'default',
  275.                             ],
  276.                             'search' => [
  277.                                 'engine' => 'legacy',
  278.                                 'connection' => 'default',
  279.                             ],
  280.                         ],
  281.                     ],
  282.                     'system' => [
  283.                         $sa => [
  284.                             'repository' => 'my_repository',
  285.                         ],
  286.                     ],
  287.                 ],
  288.             ]
  289.         );
  290.         $this->suggestionCollector->addSuggestion($suggestion);
  291.     }
  292. }
  293. class_alias(Common::class, 'eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\Parser\Common');