3 declare(strict_types
=1);
5 namespace Shaarli\Container
;
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
;
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
;
31 * Class ContainerBuilder
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.
39 class ContainerBuilder
41 /** @var ConfigManager */
44 /** @var SessionManager */
47 /** @var CookieManager */
48 protected $cookieManager;
50 /** @var LoginManager */
53 /** @var PluginManager */
54 protected $pluginManager;
56 /** @var LoggerInterface */
59 /** @var string|null */
60 protected $basePath = null;
62 public function __construct(
64 SessionManager
$session,
65 CookieManager
$cookieManager,
67 PluginManager
$pluginManager,
68 LoggerInterface
$logger
71 $this->session
= $session;
72 $this->login
= $login;
73 $this->cookieManager
= $cookieManager;
74 $this->pluginManager
= $pluginManager;
75 $this->logger
= $logger;
78 public function build(): ShaarliContainer
80 $container = new ShaarliContainer();
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
;
91 $container['history'] = function (ShaarliContainer
$container): History
{
92 return new History($container->conf
->get('resource.history'));
95 $container['bookmarkService'] = function (ShaarliContainer
$container): BookmarkServiceInterface
{
96 return new BookmarkFileService(
98 $container->pluginManager
,
100 new FlockMutex(fopen(SHAARLI_MUTEX_FILE
, 'r'), 2),
101 $container->loginManager
->isLoggedIn()
105 $container['metadataRetriever'] = function (ShaarliContainer
$container): MetadataRetriever
{
106 return new MetadataRetriever($container->conf
, $container->httpAccess
);
109 $container['pageBuilder'] = function (ShaarliContainer
$container): PageBuilder
{
110 return new PageBuilder(
112 $container->sessionManager
->getSession(),
114 $container->bookmarkService
,
115 $container->sessionManager
->generateToken(),
116 $container->loginManager
->isLoggedIn()
120 $container['formatterFactory'] = function (ShaarliContainer
$container): FormatterFactory
{
121 return new FormatterFactory(
123 $container->loginManager
->isLoggedIn()
127 $container['pageCacheManager'] = function (ShaarliContainer
$container): PageCacheManager
{
128 return new PageCacheManager(
129 $container->conf
->get('resource.page_cache'),
130 $container->loginManager
->isLoggedIn()
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()
143 $container['thumbnailer'] = function (ShaarliContainer
$container): Thumbnailer
{
144 return new Thumbnailer($container->conf
);
147 $container['httpAccess'] = function (): HttpAccess
{
148 return new HttpAccess();
151 $container['netscapeBookmarkUtils'] = function (ShaarliContainer
$container): NetscapeBookmarkUtils
{
152 return new NetscapeBookmarkUtils($container->bookmarkService
, $container->conf
, $container->history
);
155 $container['updater'] = function (ShaarliContainer
$container): Updater
{
157 UpdaterUtils
::readUpdatesFile($container->conf
->get('resource.updates')),
158 $container->bookmarkService
,
160 $container->loginManager
->isLoggedIn()
164 $container['notFoundHandler'] = function (ShaarliContainer
$container): ErrorNotFoundController
{
165 return new ErrorNotFoundController($container);
167 $container['errorHandler'] = function (ShaarliContainer
$container): ErrorController
{
168 return new ErrorController($container);
170 $container['phpErrorHandler'] = function (ShaarliContainer
$container): ErrorController
{
171 return new ErrorController($container);