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 $config, ContextualizerInterface $contextualizer)
  143. {
  144. $contextualizer->mapConfigArray('session', $config);
  145. }
  146. public function mapConfig(array &$scopeSettings, $currentScope, ContextualizerInterface $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');