mirror of
https://github.com/friendica/friendica
synced 2025-02-22 13:18:13 +00:00
Create Container interface, add DiceContainer as implementation
This commit is contained in:
parent
316fac0161
commit
320fe18654
9 changed files with 147 additions and 97 deletions
|
@ -48,7 +48,7 @@ chdir(dirname(__DIR__));
|
||||||
|
|
||||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
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);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ if (php_sapi_name() !== 'cli') {
|
||||||
|
|
||||||
require dirname(__DIR__) . '/vendor/autoload.php';
|
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);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
$argv = $_SERVER['argv'] ?? [];
|
$argv = $_SERVER['argv'] ?? [];
|
||||||
array_splice($argv, 1, 0, "daemon");
|
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);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
$argv = $_SERVER['argv'] ?? [];
|
$argv = $_SERVER['argv'] ?? [];
|
||||||
array_splice($argv, 1, 0, "jetstream");
|
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);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ require dirname(__DIR__) . '/vendor/autoload.php';
|
||||||
$argv = $_SERVER['argv'] ?? [];
|
$argv = $_SERVER['argv'] ?? [];
|
||||||
array_splice($argv, 1, 0, "worker");
|
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);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,8 @@ require __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
|
$request = \GuzzleHttp\Psr7\ServerRequest::fromGlobals();
|
||||||
|
|
||||||
$container = \Friendica\Core\Container::fromBasePath(__DIR__);
|
$container = \Friendica\Core\DiceContainer::fromBasePath(__DIR__);
|
||||||
|
|
||||||
$app = \Friendica\App::fromContainer($container);
|
$app = \Friendica\App::fromContainer($container);
|
||||||
|
|
||||||
$app->processRequest($request, $start_time);
|
$app->processRequest($request, $start_time);
|
||||||
|
|
|
@ -9,46 +9,13 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Friendica\Core;
|
namespace Friendica\Core;
|
||||||
|
|
||||||
use Dice\Dice;
|
|
||||||
use Friendica\Core\Addon\Capability\ICanLoadAddons;
|
|
||||||
use Friendica\Core\Logger\Capability\LogChannel;
|
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
|
* Initialize the container with the given parameters
|
||||||
*
|
*
|
||||||
|
@ -57,17 +24,7 @@ class Container
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function setup(string $logChannel = LogChannel::DEFAULT, bool $withTemplateEngine = true)
|
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
|
* Returns a fully constructed object based on $name using $args and $share as constructor arguments if supplied
|
||||||
|
@ -78,10 +35,7 @@ class Container
|
||||||
*
|
*
|
||||||
* @see Dice::create()
|
* @see Dice::create()
|
||||||
*/
|
*/
|
||||||
public function create(string $name, array $args = [], array $share = []): object
|
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
|
* Add a rule $rule to the class $name
|
||||||
|
@ -90,38 +44,5 @@ class Container
|
||||||
*
|
*
|
||||||
* @see Dice::addRule()
|
* @see Dice::addRule()
|
||||||
*/
|
*/
|
||||||
public function addRule(string $name, array $rule): void
|
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');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
127
src/Core/DiceContainer.php
Normal file
127
src/Core/DiceContainer.php
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
<?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');
|
||||||
|
}
|
||||||
|
}
|
|
@ -11,12 +11,13 @@ namespace Core;
|
||||||
|
|
||||||
use Dice\Dice;
|
use Dice\Dice;
|
||||||
use Friendica\Core\Container;
|
use Friendica\Core\Container;
|
||||||
|
use Friendica\Core\DiceContainer;
|
||||||
use org\bovigo\vfs\vfsStream;
|
use org\bovigo\vfs\vfsStream;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use Psr\Log\NullLogger;
|
use Psr\Log\NullLogger;
|
||||||
|
|
||||||
class ContainerTest extends TestCase
|
class DiceContainerTest extends TestCase
|
||||||
{
|
{
|
||||||
public function testFromBasePathReturnsContainer(): void
|
public function testFromBasePathReturnsContainer(): void
|
||||||
{
|
{
|
||||||
|
@ -26,7 +27,7 @@ class ContainerTest extends TestCase
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$container = Container::fromBasePath($root->url());
|
$container = DiceContainer::fromBasePath($root->url());
|
||||||
|
|
||||||
$this->assertInstanceOf(Container::class, $container);
|
$this->assertInstanceOf(Container::class, $container);
|
||||||
}
|
}
|
||||||
|
@ -45,7 +46,7 @@ class ContainerTest extends TestCase
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$container = Container::fromBasePath($root->url());
|
$container = DiceContainer::fromBasePath($root->url());
|
||||||
|
|
||||||
$this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
|
$this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
|
||||||
}
|
}
|
||||||
|
@ -55,7 +56,7 @@ class ContainerTest extends TestCase
|
||||||
$dice = $this->createMock(Dice::class);
|
$dice = $this->createMock(Dice::class);
|
||||||
$dice->expects($this->never())->method('create');
|
$dice->expects($this->never())->method('create');
|
||||||
|
|
||||||
$container = Container::fromDice($dice);
|
$container = DiceContainer::fromDice($dice);
|
||||||
|
|
||||||
$this->assertInstanceOf(Container::class, $container);
|
$this->assertInstanceOf(Container::class, $container);
|
||||||
}
|
}
|
||||||
|
@ -65,7 +66,7 @@ class ContainerTest extends TestCase
|
||||||
$dice = $this->createMock(Dice::class);
|
$dice = $this->createMock(Dice::class);
|
||||||
$dice->expects($this->once())->method('create')->with(LoggerInterface::class)->willReturn(new NullLogger());
|
$dice->expects($this->once())->method('create')->with(LoggerInterface::class)->willReturn(new NullLogger());
|
||||||
|
|
||||||
$container = Container::fromDice($dice);
|
$container = DiceContainer::fromDice($dice);
|
||||||
|
|
||||||
$this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
|
$this->assertInstanceOf(NullLogger::class, $container->create(LoggerInterface::class));
|
||||||
}
|
}
|
||||||
|
@ -75,7 +76,7 @@ class ContainerTest extends TestCase
|
||||||
$dice = $this->createMock(Dice::class);
|
$dice = $this->createMock(Dice::class);
|
||||||
$dice->expects($this->once())->method('addRule')->with(LoggerInterface::class, ['constructParams' => ['console']])->willReturn($dice);
|
$dice->expects($this->once())->method('addRule')->with(LoggerInterface::class, ['constructParams' => ['console']])->willReturn($dice);
|
||||||
|
|
||||||
$container = Container::fromDice($dice);
|
$container = DiceContainer::fromDice($dice);
|
||||||
$container->addRule(LoggerInterface::class, ['constructParams' => ['console']]);
|
$container->addRule(LoggerInterface::class, ['constructParams' => ['console']]);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue