2017-12-24 50 views
1


をautowireすることはできません私は私のイベントリスナーにたUserInterfaceを追加すると、その後、私はエラーを次ています
symfonyの4:イベントリスナーがた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. 


私は何が起こっているか分からない、他のサービスうまく動作します。 コードを探して、何が間違っているのか教えていただけますか?

〜の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(); 
     } 
    } 
} 

感謝。

+0

に応じだから、どの$ユーザーあなたは、注入されていると期待していますか? – Cerad

+0

@Cerad - ログインしているユーザー(つまり、私のターゲット) – Invictus

+1

現在ログインしているユーザーを取得する方法を検討することを検討してください。 Controller :: getUser()を例に見てみましょう。 – Cerad

答えて

2

ユーザはsymfonyサービスではなく、autowiredになりません。

は、このインタフェースを試してみてください:

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

次に、あなたが実行します。

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

のSymfony 3.2、リゾルバが導入された新しいユーザーので。コンストラクタ経由での注入を許可していないようです(私もこの作業をしようとしていましたが)代わりにあなたのメソッドに注入する必要があります。

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

documentation

関連する問題