Ergebnis 1 bis 4 von 4

Thema: Fehler beim injecten eines Services

  1. #1
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard Fehler beim injecten eines Services

    Hallo Community,

    ich müsste für eine Erweiterung von mir auf den Datenbank-Service von Contao zugreifen, den man sonst in Templates beispielsweise mit $this->import('Database') verwenden kann.

    Meines Wissens nach ist dieser Weg in einem Controller einer Erweiterung so nicht möglich.
    Deswegen habe ich versucht den Service: Doctrine\DBAL\Connection zu verwenden.

    Beim injecten des Services aber erhalte ich einen Fehler:

    Type error: Too few arguments to function Fnjs\TestExtension\Controller\BackendController::_ _construct(), 0 passed in contao4-dev/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php on line 200 and exactly 1 expected
    Ich habe diesbezüglich zwei Fragen:
    1. Ist es möglich in einem Controller einer Erweiterung auf den gleichen Service der Datenbank zuzugreifen, wie in Templates durch $this->import('Database') und falls ja, was müsste ich dafür tun?
    2. Falls 1. nicht möglich ist, woran könnte es liegen, dass ich den DBAL\Connection Service oben nicht injecten kann?

    Mein Controller sieht folgendermaßen aus:

    Code:
    ..
    ..
    use Doctrine\DBAL\Connection;
    
    class BackendController extends AbstractController
    {
        private $_database;
    
        public function __construct
        (
            Connection $_database
        )
        {
            $this->_database = $_database;
        }
    Meine services.yml, die injected wird, sieht so aus:
    Code:
    services:
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
    
        Fnjs\TestExtension\Controller\BackendController: ~

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.109
    Partner-ID
    10107

    Standard

    Damit du Dependency Injection bei Controller verwenden kannst, musst du den Service entweder public definieren, oder mit dem controller.service_arguments Tag versehen.

  3. #3
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Damit du Dependency Injection bei Controller verwenden kannst, musst du den Service entweder public definieren, oder mit dem controller.service_arguments Tag versehen.
    Also einfach so?

    Code:
        Fnjs\TestExtension\Controller\BackendController:
            tags: ['controller.service_arguments']
    Und wie sieht es damit aus?

    Zitat Zitat von Fonjensi Beitrag anzeigen

    Ich habe diesbezüglich zwei Fragen:
    1. Ist es möglich in einem Controller einer Erweiterung auf den gleichen Service der Datenbank zuzugreifen, wie in Templates durch $this->import('Database') und falls ja, was müsste ich dafür tun?
    Danke schon mal!

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.109
    Partner-ID
    10107

    Standard

    PHP-Code:
    $this->import('Database'
    ist equivalent zu
    PHP-Code:
    $db = \Contao\Database::getInstance(); 
    Das sind aber Funktionen aus dem Legacy Contao Framework, und dafür musst du dir den ContaoFramework Service injecten lassen, damit du das Contao Framework initialisieren kannst.

    Besser wäre es jedoch, wenn du dir einfach die Default Datenbank Verbindung injecten lässt - wie du es eben schon gemacht hast.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •