2017-12-24 6 views
1


Als ich Userinterface zu meinem Ereignis-Listener hinzufügen, dann habe ich Fehler folgende:
Symfony 4: Event-Listener kann nicht autowire Userinterface

Cannot autowire service "App\EventListener\ControllerListener": argument "$user" of method "__construct()" references interface "Symfony\Component\Security\Core\User\UserInterface" but no such service exists. It cannot be auto-registered because it is from a different root namespace. 


Ich weiß nicht, was los ist, sonstige Dienstleistungen funktioniert gut. Können Sie nach Code suchen und mir sagen, was mache ich falsch?

~ src/Eventlistener/ControllerListener.php

<?php 
namespace App\EventListener; 

use App\Entity\User; 
use App\Entity\DailyWin; 
use App\Controller\DailyWinController; 
use Psr\Log\LoggerInterface; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; 

class ControllerListener extends Controller implements DailyWinController 
{ 
    private $authChecker, $user, $logger; 

    public function __construct(UserInterface $user, AuthorizationCheckerInterface $authChecker, LoggerInterface $logger) { 
     $this->user = $user; 
     $this->authChecker = $authChecker; 
     $this->logger = $logger; 
    } 

    public function onKernelController(FilterControllerEvent $event) { 
     if ($this->authChecker->isGranted('IS_AUTHENTICATED_FULLY') === false) return; 

     $this->logger->warning('Inicjowanie...'); 

     $em = $this->getDoctrine()->getManager(); 
     $DWrep = $em->getRepository(DailyWin::class); 

     $userId = $this->user->getId(); 
     $userDailyWin = $DWrep->findOneBy(['userId' => $userId]); 
     $this->logger->warning(print_r($userDailyWin)); 

     if (empty($userDailyWin)) { 
      $currentDate = new \DateTime(date('Y-m-d', time())); 
      $userDailyWin = new DailyWin(); 
      $userDailyWin->setUserId($userId); 
      $userDailyWin->setMultiplier(0); 
      $userDailyWin->setClaimed(0); 
      $userDailyWin->setStreak(0); 
      $userDailyWin->setLastLogin($currentDate); 

      $em->persist($userDailyWin); 
      $em->flush(); 
     } 
    } 
} 

Dank.

+0

So die Benutzer $ tun Sie injiziert haben erwarten? – Cerad

+0

@Cerad - Benutzer, der angemeldet ist (das ist mein Ziel) – Invictus

+1

So überlegen Sie, wie Sie den aktuell angemeldeten Benutzer erhalten. Vielleicht sehen Sie sich Controller :: getUser() als Beispiel an. – Cerad

Antwort

2

Der Benutzer ist kein Symfony-Dienst und wird nicht autowired.

Versuchen Sie, mit dieser Schnittstelle:

Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface 

Dann Sie tun:

$user=$tokenStorage->getToken()->getUser(); 
0

Seit Symfony 3.2, ein neuer Benutzer Resolver eingeführt wurde. Es scheint nicht die Injektion über Konstruktor zu erlauben (ich habe auch versucht, dies zu tun), aber Sie sollten stattdessen Ihre Methoden injizieren.

public function onKernelController(UserInterface $user , FilterControllerEvent $event) { 

nach dem documentation

Verwandte Themen