Dependency Injection Container zur Verfügung stellen
Beschreibung
Über StEP #1552 wird Slim unterhalb von Trails eingeführt. Slim verwendet intern einen Dependency-Injection-Container (PHP-DI). Da wir mit der JSONAPI schon Slim verwenden, wird das also bereits in Stud.IP eingesetzt.
Wie DI funktioniert, liest sich hier ganz gut: https://php-di.org/doc/understanding-di.html
Damit der Dependency-Injection-Container nicht nur in Trails sondern auch im übrigen Stud.IP verwendet werden kann, bietet es sich an, hier jetzt schon Infrastruktur zu schaffen.
Durch die große Menge an Code, der nicht auf DI eingestellt ist, muss es eine Möglichkeit geben, an den Container heranzukommen und ihn dann um eine Dependency zu bitten. Dafür gäbe es eine Vielzahl an Möglichkeiten. Mir wäre eine möglichst einfach lieb.
Dieser TIC macht also zwei Sachen:
- Eine Stelle schaffen, um den DI-Container zentral mit Definitionen auszustatten.
- Eine Funktion namens
app(…)
erstellen, um dann auf den Container zuzugreifen.
Beispiel:
Es könnte folgende Definition erstellt werden:
use Psr\Log\LoggerInterface;
class AppServiceProvider implements ServiceProvider
{
public function register($builder)
{
$builder->addDefinitions([
LoggerInterface::class => new \Monolog\Logger(
'studip',
[
new \Monolog\Handler\StreamHandler(/* … */)
]
)
]);
// …
}
}
Es gäbe dann eine Klasse, die den Logger als Abhängigkeit hat:
class Foo
{
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
// …
$logger->debug("hello from foo");
}
}
Wird an einer Stelle eine bestimmte Dependency benötigt, kann diese aber auch über app(Foo::class)
abgefragt werden.