]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - application/container/ContainerBuilder.php
New plugin hook: ability to add custom filters to Shaarli search engine
[github/shaarli/Shaarli.git] / application / container / ContainerBuilder.php
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Shaarli\Container;
6
7 use malkusch\lock\mutex\FlockMutex;
8 use Psr\Log\LoggerInterface;
9 use Shaarli\Bookmark\BookmarkFileService;
10 use Shaarli\Bookmark\BookmarkServiceInterface;
11 use Shaarli\Config\ConfigManager;
12 use Shaarli\Feed\FeedBuilder;
13 use Shaarli\Formatter\FormatterFactory;
14 use Shaarli\Front\Controller\Visitor\ErrorController;
15 use Shaarli\Front\Controller\Visitor\ErrorNotFoundController;
16 use Shaarli\History;
17 use Shaarli\Http\HttpAccess;
18 use Shaarli\Http\MetadataRetriever;
19 use Shaarli\Netscape\NetscapeBookmarkUtils;
20 use Shaarli\Plugin\PluginManager;
21 use Shaarli\Render\PageBuilder;
22 use Shaarli\Render\PageCacheManager;
23 use Shaarli\Security\CookieManager;
24 use Shaarli\Security\LoginManager;
25 use Shaarli\Security\SessionManager;
26 use Shaarli\Thumbnailer;
27 use Shaarli\Updater\Updater;
28 use Shaarli\Updater\UpdaterUtils;
29
30 /**
31 * Class ContainerBuilder
32 *
33 * Helper used to build a Slim container instance with Shaarli's object dependencies.
34 * Note that most injected objects MUST be added as closures, to let the container instantiate
35 * only the objects it requires during the execution.
36 *
37 * @package Container
38 */
39 class ContainerBuilder
40 {
41 /** @var ConfigManager */
42 protected $conf;
43
44 /** @var SessionManager */
45 protected $session;
46
47 /** @var CookieManager */
48 protected $cookieManager;
49
50 /** @var LoginManager */
51 protected $login;
52
53 /** @var PluginManager */
54 protected $pluginManager;
55
56 /** @var LoggerInterface */
57 protected $logger;
58
59 /** @var string|null */
60 protected $basePath = null;
61
62 public function __construct(
63 ConfigManager $conf,
64 SessionManager $session,
65 CookieManager $cookieManager,
66 LoginManager $login,
67 PluginManager $pluginManager,
68 LoggerInterface $logger
69 ) {
70 $this->conf = $conf;
71 $this->session = $session;
72 $this->login = $login;
73 $this->cookieManager = $cookieManager;
74 $this->pluginManager = $pluginManager;
75 $this->logger = $logger;
76 }
77
78 public function build(): ShaarliContainer
79 {
80 $container = new ShaarliContainer();
81
82 $container['conf'] = $this->conf;
83 $container['sessionManager'] = $this->session;
84 $container['cookieManager'] = $this->cookieManager;
85 $container['loginManager'] = $this->login;
86 $container['pluginManager'] = $this->pluginManager;
87 $container['logger'] = $this->logger;
88 $container['basePath'] = $this->basePath;
89
90
91 $container['history'] = function (ShaarliContainer $container): History {
92 return new History($container->conf->get('resource.history'));
93 };
94
95 $container['bookmarkService'] = function (ShaarliContainer $container): BookmarkServiceInterface {
96 return new BookmarkFileService(
97 $container->conf,
98 $container->pluginManager,
99 $container->history,
100 new FlockMutex(fopen(SHAARLI_MUTEX_FILE, 'r'), 2),
101 $container->loginManager->isLoggedIn()
102 );
103 };
104
105 $container['metadataRetriever'] = function (ShaarliContainer $container): MetadataRetriever {
106 return new MetadataRetriever($container->conf, $container->httpAccess);
107 };
108
109 $container['pageBuilder'] = function (ShaarliContainer $container): PageBuilder {
110 return new PageBuilder(
111 $container->conf,
112 $container->sessionManager->getSession(),
113 $container->logger,
114 $container->bookmarkService,
115 $container->sessionManager->generateToken(),
116 $container->loginManager->isLoggedIn()
117 );
118 };
119
120 $container['formatterFactory'] = function (ShaarliContainer $container): FormatterFactory {
121 return new FormatterFactory(
122 $container->conf,
123 $container->loginManager->isLoggedIn()
124 );
125 };
126
127 $container['pageCacheManager'] = function (ShaarliContainer $container): PageCacheManager {
128 return new PageCacheManager(
129 $container->conf->get('resource.page_cache'),
130 $container->loginManager->isLoggedIn()
131 );
132 };
133
134 $container['feedBuilder'] = function (ShaarliContainer $container): FeedBuilder {
135 return new FeedBuilder(
136 $container->bookmarkService,
137 $container->formatterFactory->getFormatter(),
138 $container->environment,
139 $container->loginManager->isLoggedIn()
140 );
141 };
142
143 $container['thumbnailer'] = function (ShaarliContainer $container): Thumbnailer {
144 return new Thumbnailer($container->conf);
145 };
146
147 $container['httpAccess'] = function (): HttpAccess {
148 return new HttpAccess();
149 };
150
151 $container['netscapeBookmarkUtils'] = function (ShaarliContainer $container): NetscapeBookmarkUtils {
152 return new NetscapeBookmarkUtils($container->bookmarkService, $container->conf, $container->history);
153 };
154
155 $container['updater'] = function (ShaarliContainer $container): Updater {
156 return new Updater(
157 UpdaterUtils::readUpdatesFile($container->conf->get('resource.updates')),
158 $container->bookmarkService,
159 $container->conf,
160 $container->loginManager->isLoggedIn()
161 );
162 };
163
164 $container['notFoundHandler'] = function (ShaarliContainer $container): ErrorNotFoundController {
165 return new ErrorNotFoundController($container);
166 };
167 $container['errorHandler'] = function (ShaarliContainer $container): ErrorController {
168 return new ErrorController($container);
169 };
170 $container['phpErrorHandler'] = function (ShaarliContainer $container): ErrorController {
171 return new ErrorController($container);
172 };
173
174 return $container;
175 }
176 }