AccountsServiceProvider.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. /**
  3. * @package Grav\Common\Service
  4. *
  5. * @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Service;
  9. use Grav\Common\Config\Config;
  10. use Grav\Common\Debugger;
  11. use Grav\Common\User\DataUser;
  12. use Grav\Common\User\FlexUser;
  13. use Grav\Common\User\User;
  14. use Grav\Framework\File\Formatter\YamlFormatter;
  15. use Grav\Framework\Flex\Flex;
  16. use Grav\Framework\Flex\FlexDirectory;
  17. use Pimple\Container;
  18. use Pimple\ServiceProviderInterface;
  19. use RocketTheme\Toolbox\Event\Event;
  20. use RocketTheme\Toolbox\Event\EventDispatcher;
  21. class AccountsServiceProvider implements ServiceProviderInterface
  22. {
  23. public function register(Container $container)
  24. {
  25. $container['accounts'] = function (Container $container) {
  26. $type = strtolower(defined('GRAV_USER_INSTANCE') ? GRAV_USER_INSTANCE : $container['config']->get('system.accounts.type', 'data'));
  27. if ($type === 'flex') {
  28. /** @var Debugger $debugger */
  29. $debugger = $container['debugger'];
  30. $debugger->addMessage('User Accounts: Flex Directory');
  31. return $this->flexAccounts($container);
  32. }
  33. return $this->dataAccounts($container);
  34. };
  35. $container['users'] = $container->factory(function (Container $container) {
  36. user_error('Grav::instance()[\'users\'] is deprecated since Grav 1.6, use Grav::instance()[\'accounts\'] instead', E_USER_DEPRECATED);
  37. return $container['accounts'];
  38. });
  39. }
  40. protected function dataAccounts(Container $container)
  41. {
  42. if (!defined('GRAV_USER_INSTANCE')) {
  43. define('GRAV_USER_INSTANCE', 'DATA');
  44. }
  45. // Use User class for backwards compatibility.
  46. return new DataUser\UserCollection(User::class);
  47. }
  48. protected function flexAccounts(Container $container)
  49. {
  50. if (!defined('GRAV_USER_INSTANCE')) {
  51. define('GRAV_USER_INSTANCE', 'FLEX');
  52. }
  53. /** @var Config $config */
  54. $config = $container['config'];
  55. $options = [
  56. 'enabled' => true,
  57. 'data' => [
  58. 'object' => User::class, // Use User class for backwards compatibility.
  59. 'collection' => FlexUser\UserCollection::class,
  60. 'index' => FlexUser\UserIndex::class,
  61. 'storage' => $this->getFlexStorage($config->get('system.accounts.storage', 'file')),
  62. 'search' => [
  63. 'options' => [
  64. 'contains' => 1
  65. ],
  66. 'fields' => [
  67. 'key',
  68. 'email'
  69. ]
  70. ]
  71. ]
  72. ] + ($config->get('plugins.flex-objects.object') ?: []);
  73. $directory = new FlexDirectory('accounts', 'blueprints://user/accounts.yaml', $options);
  74. /** @var EventDispatcher $dispatcher */
  75. $dispatcher = $container['events'];
  76. $dispatcher->addListener('onFlexInit', function (Event $event) use ($directory) {
  77. /** @var Flex $flex */
  78. $flex = $event['flex'];
  79. $flex->addDirectory($directory);
  80. });
  81. return $directory->getIndex();
  82. }
  83. protected function getFlexStorage($config)
  84. {
  85. if (\is_array($config)) {
  86. return $config;
  87. }
  88. if ($config === 'folder') {
  89. return [
  90. 'class' => FlexUser\Storage\UserFolderStorage::class,
  91. 'options' => [
  92. 'formatter' => ['class' => YamlFormatter::class],
  93. 'folder' => 'account://',
  94. 'pattern' => '{FOLDER}/{KEY:2}/{KEY}/user.yaml',
  95. 'key' => 'username',
  96. 'indexed' => true
  97. ],
  98. ];
  99. }
  100. return [
  101. 'class' => FlexUser\Storage\UserFileStorage::class,
  102. 'options' => [
  103. 'formatter' => ['class' => YamlFormatter::class],
  104. 'folder' => 'account://',
  105. 'pattern' => '{FOLDER}/{KEY}.yaml',
  106. 'key' => 'storage_key',
  107. 'indexed' => true
  108. ],
  109. ];
  110. }
  111. }