[gelöst] Dependency Injection bei DCA Operationen
Hallo zusammen,
ich setze mich gerade etwas mit Dependency Injections auseinander, was inzwischen auch ganz gut klappt.
Wenn ich das jetzt richtig verstanden habe werden automatisch alle benötigten Argumente an die Klasse mitgegeben, die im Constructor stecken, wenn in der übergeordneten Klasse, die auf diese zugreift, per Annotation der ServiceTag "controller.service_arguments" mitgegeben wird.
Die übergeordnete Klasse sieht wie folgt aus.
PHP-Code:
namespace App\Service;
use Terminal42\ServiceAnnotationBundle\Annotation\ServiceTag;
use App\Stats;
use Contao\DataContainer;
/**
* @ServiceTag("controller.service_arguments")
*/
class ServiceStats {
private $stats;
public function __construct(Stats $stats)
{
$this->stats = $stats;
}
public function showStats(DataContainer $dc)
{
return $this->stats->showStats($dc);
}
}
Diese besitzt per Annotations den ServiceTag "controller.service_arguments" und bindet über den Constructor die Klasse Stats ein.
Das klappt soweit auch wunderbar. Die beiden Argumente im Constructor der Klasse Stats werden automatisch angehangen.
PHP-Code:
namespace App;
use Doctrine\DBAL\Connection;
use Symfony\Component\Filesystem\Filesystem;
use Contao\DataContainer;
use Terminal42\ServiceAnnotationBundle\Annotation\ServiceTag;
class Stats {
public function __construct(Connection $db, Filesystem $filesystem)
{
...
}
...
public function showStats(DataContainer $dc) {
return "Hooray! It works!";
}
}
Das wird aktuell als Operator innerhalb einer DCA-Liste genutzt, der zurzeit nur den Testtext "Hooray! It works!" ausgibt.
PHP-Code:
array_insert($GLOBALS['BE_MOD'], 1, [
'stats' => [
'report' => [
'tables' => ['tl_stats_report'],
'showStats' => [App\Service\ServiceStats::class, 'showStats']
]
]
]
);
Zurzeit nutze ich die Klasse ServiceStats mehr oder weniger als Krücke, da diese sich per Annotations um die Dependency Injections kümmert. Am liebsten würde ich direkt auf die Klasse Service verweisen. Mir ist jedoch nicht ganz klar, wie in diesem Fall die Dependency Injections funktionieren.
Muss ich hier eine service.yml anlegen über die ich die Argumente an die Klasse übergebe und diese auf Public setzen, oder gibt es auch hier einen eleganteren Weg.
Besten Dank und
lieben Gruß
Dennis