suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Probleme mit Ereignissen in Symfony2

Ich habe mir heute das Ereigniskapitel in Symfony angesehen und selbst ein Experiment durchgeführt, aber eines verstehe ich nicht ganz.
Ich habe zunächst eine Eents-Aufzählungsklasse definiert, um alle Ereignisse zu verwalten

<?php
namespace Wolehao\HomeBundle\Event;


final class Events{
  const HOMEPAGE_VISIT = "home.homepage_visit";
}

Ein Ereignis ist im HomepageBundle definiert

<?php
namespace Wolehao\HomeBundle\Event;
// 这个是sf为你提供的一个基础类
use Symfony\Component\EventDispatcher\Event;

// 你的事件类
class HomepageVisit extends Event {
  public $container;
  public function __construct($container) {
    $this->container = $container;
  }
}

Dann wird ein Listener in FileBundle definiert


<?php namespace Wolehao\FileBundle\EventListener; use Wolehao\HomeBundle\Event\HomepageVisit; class FileListener { public function onHomepageVisit(HomepageVisit $event) { $event->container->get("logger")->info("我执行了"); // ... } }

Registrieren Sie den Dienst in service.xml

    <services>
        <service id="file.listener" class="Wolehao\FileBundle\EventListener\FileListener">
                <tag name="kernel.event_listener" event="home.homepage_visit" method="onHomepageVisit"/>
        </service>
    </services>

Endlich habe ich das Ereignis im Controller von HomepageBundle ausgelöst

<?php

namespace Wolehao\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Wolehao\HomeBundle\Event\HomepageVisit;
use Wolehao\HomeBundle\Event\Events;
use Wolehao\FileBundle\Event\Listener;

class DefaultController extends Controller
{
    /**
     * @Route("/home/{name}")
     * @Template()
     */
    public function indexAction($name)
    {

      $event = new HomepageVisit($this->container);
      // 在controller里取事件分发器
      $dispatcher = $this->get('event_dispatcher');
      $dispatcher->dispatch(Events::HOMEPAGE_VISIT, $event);
      return array('name' => $name);
    }

}

Zuerst greife ich über http://localhost/fm/web/app_dev.php/home/index darauf zu
Kann das „Ich habe ausgeführt“-Protokoll korrekt ausdrucken
Alles scheint in Ordnung zu sein, was darauf hindeutet, dass das Ereignis erfolgreich ausgelöst und ausgeführt wurde

Wenn Sie nun auf die Debug-Leiste klicken, sieht das Ereigniselement wie folgt aus:

Was ich nicht verstehe ist, warum home.homepage_visit in Not Called Listeners enthalten ist, aber offensichtlich ausgeführt wird?

天蓬老师天蓬老师2771 Tage vor543

Antworte allen(1)Ich werde antworten

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 16:46:46

    你的symfony 2的具体版本?

    如果确实写了log,说明你的event相关代码是有效的。

    profiler(debug bar)里显示的信息,是通过data collector收集来的,至于为什么没有记录到listener的调用,则需要知道更多细节才能了解,建议你详细检查xdebug token和profiler信息的对应关系。

    另外,不要直接注入container给event,这样依赖过于宽泛了。

    Antwort
    0
  • StornierenAntwort