dongtang5057 2017-12-24 14:36
浏览 61
已采纳

Symfony 4内核控制器事件监听器 - 实现接口

I want to make some operations before controller load and I have problem with include interfaces or classes into function.

My question is how should I do it to start working?

There is a code:

~/src/Controller/ControllerListener.php

<?php
namespace App\EventListener;

use App\Controller\DailyWinController;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

class ControllerListener implements DailyWinController
{
    public function onKernelController(FilterControllerEvent $event, LoggerInterface $logger) {
        $logger->alert('Working');
    }
}

~/src/Controller/DailyWinController.php

<?php
namespace App\Controller;

interface DailyWinController {
    // maybe there something?
}

~/src/Controller/UserController.php

<?php
namespace App\Controller;

use App\Entity\User;
use App\Entity\DailyWin;
use Psr\Log\LoggerInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class UserController extends Controller implements DailyWinController
{
    /**
     * @Route("/user", name="user")
     * @param AuthorizationCheckerInterface $authChecker
     * @param UserInterface $user
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function user(AuthorizationCheckerInterface $authChecker, UserInterface $user = null, LoggerInterface $logger) {
        if ($authChecker->isGranted('ROLE_USER') === false) {
            return $this->redirectToRoute('logowanie');
        }

        $logger->warning('Logger is working');

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

        $userId = $user->getId();
        $dailyWin = $DWrep->findOneBy(['userId' => $userId]);

        return $this->render('andprize/user/index.html.twig', array(
            'dailyWin' => $dailyWin,
            'userId' => $userId
        ));
    }
}

I have the following problem:

FatalThrowableError Type error: Argument 2 passed to App\EventListener\ControllerListener::onKernelController() must implement interface Psr\Log\LoggerInterface, string given

  • 写回答

1条回答 默认 最新

  • drflkphi675447 2017-12-24 14:46
    关注

    You have to inject the logger to the listener.

    <?php
    namespace App\EventListener;
    
    use App\Controller\DailyWinController;
    use Psr\Log\LoggerInterface;
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    
    class ControllerListener implements DailyWinController
    {
        protected $logger;
        public function __construct(LoggerInterface $logger)
        {
            $this->logger=$logger;
        }
        public function onKernelController(FilterControllerEvent $event) {
            $this->logger->alert('Working');
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)