require dirname(__DIR__) . '/vendor/autoload.php';
-$container = \Friendica\Core\Container::fromBasePath(dirname(__DIR__));
+$container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__));
$app = \Friendica\App::fromContainer($container);
require dirname(__DIR__) . '/vendor/autoload.php';
-$container = \Friendica\Core\Container::fromBasePath(dirname(__DIR__));
+$container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__));
$app = \Friendica\App::fromContainer($container);
$argv = $_SERVER['argv'] ?? [];
array_splice($argv, 1, 0, "daemon");
-$container = \Friendica\Core\Container::fromBasePath(dirname(__DIR__));
+$container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__));
$app = \Friendica\App::fromContainer($container);
$argv = $_SERVER['argv'] ?? [];
array_splice($argv, 1, 0, "jetstream");
-$container = \Friendica\Core\Container::fromBasePath(dirname(__DIR__));
+$container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__));
$app = \Friendica\App::fromContainer($container);
$argv = $_SERVER['argv'] ?? [];
array_splice($argv, 1, 0, "worker");
-$container = \Friendica\Core\Container::fromBasePath(dirname(__DIR__));
+$container = \Friendica\Core\DiceContainer::fromBasePath(dirname(__DIR__));
$app = \Friendica\App::fromContainer($container);
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
-$container = \Friendica\Core\Container::fromBasePath(__DIR__);
-$app = \Friendica\App::fromContainer($container);
+$container = \Friendica\Core\DiceContainer::fromBasePath(__DIR__);
+
+$app = \Friendica\App::fromContainer($container);
$app->processRequest($request, $start_time);
namespace Friendica\Core;
-use Dice\Dice;
-use Friendica\Core\Addon\Capability\ICanLoadAddons;
use Friendica\Core\Logger\Capability\LogChannel;
-use Friendica\Core\Logger\Handler\ErrorHandler;
-use Friendica\DI;
-use Psr\Log\LoggerInterface;
/**
- * Wrapper for the Dice class to make some basic setups
+ * Dependency Injection Container
*/
-class Container
+interface Container
{
- public static function fromBasePath(string $basePath): self
- {
- $path = $basePath . '/static/dependencies.config.php';
-
- $dice = (new Dice())->addRules(require($path));
-
- return static::fromDice($dice);
- }
-
- private Dice $container;
-
- private function __construct(Dice $container)
- {
- $this->container = $container;
- }
-
- /**
- * Creates an instance with Dice
- *
- * @param Dice $container
- *
- * @return self
- */
- public static function fromDice(Dice $container): self
- {
- return new self($container);
- }
-
/**
* Initialize the container with the given parameters
*
*
* @return void
*/
- public function setup(string $logChannel = LogChannel::DEFAULT, bool $withTemplateEngine = true)
- {
- $this->setupContainerForAddons();
- $this->setupContainerForLogger($logChannel);
- $this->setupLegacyServiceLocator();
- $this->registerErrorHandler();
-
- if ($withTemplateEngine) {
- $this->registerTemplateEngine();
- }
- }
+ public function setup(string $logChannel = LogChannel::DEFAULT, bool $withTemplateEngine = true): void;
/**
* Returns a fully constructed object based on $name using $args and $share as constructor arguments if supplied
*
* @see Dice::create()
*/
- public function create(string $name, array $args = [], array $share = []): object
- {
- return $this->container->create($name, $args, $share);
- }
+ public function create(string $name, array $args = [], array $share = []): object;
/**
* Add a rule $rule to the class $name
*
* @see Dice::addRule()
*/
- public function addRule(string $name, array $rule): void
- {
- $this->container = $this->container->addRule($name, $rule);
- }
-
- private function setupContainerForAddons(): void
- {
- /** @var ICanLoadAddons $addonLoader */
- $addonLoader = $this->container->create(ICanLoadAddons::class);
-
- $this->container = $this->container->addRules($addonLoader->getActiveAddonConfig('dependencies'));
- }
-
- private function setupContainerForLogger(string $logChannel): void
- {
- $this->container = $this->container->addRule(LoggerInterface::class, [
- 'constructParams' => [$logChannel],
- ]);
- }
-
- private function setupLegacyServiceLocator(): void
- {
- DI::init($this->container);
- }
-
- private function registerErrorHandler(): void
- {
- ErrorHandler::register($this->container->create(LoggerInterface::class));
- }
-
- private function registerTemplateEngine(): void
- {
- Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine');
- }
+ public function addRule(string $name, array $rule): void;
}
--- /dev/null
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+declare(strict_types=1);
+
+namespace Friendica\Core;
+
+use Dice\Dice;
+use Friendica\Core\Addon\Capability\ICanLoadAddons;
+use Friendica\Core\Logger\Capability\LogChannel;
+use Friendica\Core\Logger\Handler\ErrorHandler;
+use Friendica\DI;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Wrapper for the Dice class to make some basic setups
+ */
+final class DiceContainer implements Container
+{
+ public static function fromBasePath(string $basePath): self
+ {
+ $path = $basePath . '/static/dependencies.config.php';
+
+ $dice = (new Dice())->addRules(require($path));
+
+ return static::fromDice($dice);
+ }
+
+ private Dice $container;
+
+ private function __construct(Dice $container)
+ {
+ $this->container = $container;
+ }
+
+ /**
+ * Creates an instance with Dice
+ *
+ * @param Dice $container
+ *
+ * @return self
+ */
+ public static function fromDice(Dice $container): self
+ {
+ return new self($container);
+ }
+
+ /**
+ * Initialize the container with the given parameters
+ *
+ * @param string $logChannel The Log Channel of this call
+ * @param bool $withTemplateEngine true, if the template engine should be set too
+ *
+ * @return void
+ */
+ public function setup(string $logChannel = LogChannel::DEFAULT, bool $withTemplateEngine = true): void
+ {
+ $this->setupContainerForAddons();
+ $this->setupContainerForLogger($logChannel);
+ $this->setupLegacyServiceLocator();
+ $this->registerErrorHandler();
+
+ if ($withTemplateEngine) {
+ $this->registerTemplateEngine();
+ }
+ }
+
+ /**
+ * Returns a fully constructed object based on $name using $args and $share as constructor arguments if supplied
+ * @param string $name name The name of the class to instantiate
+ * @param array $args An array with any additional arguments to be passed into the constructor upon instantiation
+ * @param array $share a list of defined in shareInstances for objects higher up the object graph, should only be used internally
+ * @return object A fully constructed object based on the specified input arguments
+ *
+ * @see Dice::create()
+ */
+ public function create(string $name, array $args = [], array $share = []): object
+ {
+ return $this->container->create($name, $args, $share);
+ }
+
+ /**
+ * Add a rule $rule to the class $name
+ * @param string $name The name of the class to add the rule for
+ * @param array $rule The container can be fully configured using rules provided by associative arrays. See {@link https://r.je/dice.html#example3} for a description of the rules.
+ *
+ * @see Dice::addRule()
+ */
+ public function addRule(string $name, array $rule): void
+ {
+ $this->container = $this->container->addRule($name, $rule);
+ }
+
+ private function setupContainerForAddons(): void
+ {
+ /** @var ICanLoadAddons $addonLoader */
+ $addonLoader = $this->container->create(ICanLoadAddons::class);
+
+ $this->container = $this->container->addRules($addonLoader->getActiveAddonConfig('dependencies'));
+ }
+
+ private function setupContainerForLogger(string $logChannel): void
+ {
+ $this->container = $this->container->addRule(LoggerInterface::class, [
+ 'constructParams' => [$logChannel],
+ ]);
+ }
+
+ private function setupLegacyServiceLocator(): void
+ {
+ DI::init($this->container);
+ }
+
+ private function registerErrorHandler(): void
+ {
+ ErrorHandler::register($this->container->create(LoggerInterface::class));
+ }
+
+ private function registerTemplateEngine(): void
+ {
+ Renderer::registerTemplateEngine('Friendica\Render\FriendicaSmartyEngine');
+ }
+}
+++ /dev/null
-<?php
-
-// Copyright (C) 2010-2024, the Friendica project
-// SPDX-FileCopyrightText: 2010-2024 the Friendica project
-//
-// SPDX-License-Identifier: AGPL-3.0-or-later
-
-declare(strict_types=1);
-
-namespace Core;
-
-use Dice\Dice;
-use Friendica\Core\Container;
-use org\bovigo\vfs\vfsStream;
-use PHPUnit\Framework\TestCase;
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-
-class ContainerTest extends TestCase
-{
- public function testFromBasePathReturnsContainer(): void
- {
- $root = vfsStream::setup('friendica', null, [
- 'static' => [
- 'dependencies.config.php' => '<?php return [];',
- ],
- ]);
-
- $container = Container::fromBasePath($root->url());
-
- $this->assertInstanceOf(Container::class, $container);
- }
-
- public function testCreateReturnsObject(): void
- {
- $root = vfsStream::setup('friendica', null, [
- 'static' => [
- 'dependencies.config.php' => <<< PHP
- <?php return [
- \Psr\Log\LoggerInterface::class => [
- 'instanceOf' => \Psr\Log\NullLogger::class,
- ],
- ];
- PHP,
- ],
- ]);
-
- $container = Container::fromBasePath($root->url());
-
- $this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
- }
-
- public function testFromDiceReturnsContainer(): void
- {
- $dice = $this->createMock(Dice::class);
- $dice->expects($this->never())->method('create');
-
- $container = Container::fromDice($dice);
-
- $this->assertInstanceOf(Container::class, $container);
- }
-
- public function testCreateFromContainer(): void
- {
- $dice = $this->createMock(Dice::class);
- $dice->expects($this->once())->method('create')->with(LoggerInterface::class)->willReturn(new NullLogger());
-
- $container = Container::fromDice($dice);
-
- $this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
- }
-
- public function testAddRuleFromContainer(): void
- {
- $dice = $this->createMock(Dice::class);
- $dice->expects($this->once())->method('addRule')->with(LoggerInterface::class, ['constructParams' => ['console']])->willReturn($dice);
-
- $container = Container::fromDice($dice);
- $container->addRule(LoggerInterface::class, ['constructParams' => ['console']]);
- }
-}
--- /dev/null
+<?php
+
+// Copyright (C) 2010-2024, the Friendica project
+// SPDX-FileCopyrightText: 2010-2024 the Friendica project
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+declare(strict_types=1);
+
+namespace Core;
+
+use Dice\Dice;
+use Friendica\Core\Container;
+use Friendica\Core\DiceContainer;
+use org\bovigo\vfs\vfsStream;
+use PHPUnit\Framework\TestCase;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+class DiceContainerTest extends TestCase
+{
+ public function testFromBasePathReturnsContainer(): void
+ {
+ $root = vfsStream::setup('friendica', null, [
+ 'static' => [
+ 'dependencies.config.php' => '<?php return [];',
+ ],
+ ]);
+
+ $container = DiceContainer::fromBasePath($root->url());
+
+ $this->assertInstanceOf(Container::class, $container);
+ }
+
+ public function testCreateReturnsObject(): void
+ {
+ $root = vfsStream::setup('friendica', null, [
+ 'static' => [
+ 'dependencies.config.php' => <<< PHP
+ <?php return [
+ \Psr\Log\LoggerInterface::class => [
+ 'instanceOf' => \Psr\Log\NullLogger::class,
+ ],
+ ];
+ PHP,
+ ],
+ ]);
+
+ $container = DiceContainer::fromBasePath($root->url());
+
+ $this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
+ }
+
+ public function testFromDiceReturnsContainer(): void
+ {
+ $dice = $this->createMock(Dice::class);
+ $dice->expects($this->never())->method('create');
+
+ $container = DiceContainer::fromDice($dice);
+
+ $this->assertInstanceOf(Container::class, $container);
+ }
+
+ public function testCreateFromContainer(): void
+ {
+ $dice = $this->createMock(Dice::class);
+ $dice->expects($this->once())->method('create')->with(LoggerInterface::class)->willReturn(new NullLogger());
+
+ $container = DiceContainer::fromDice($dice);
+
+ $this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
+ }
+
+ public function testAddRuleFromContainer(): void
+ {
+ $dice = $this->createMock(Dice::class);
+ $dice->expects($this->once())->method('addRule')->with(LoggerInterface::class, ['constructParams' => ['console']])->willReturn($dice);
+
+ $container = DiceContainer::fromDice($dice);
+ $container->addRule(LoggerInterface::class, ['constructParams' => ['console']]);
+ }
+}