Ahoj, mám event, kterej bych chtěl odchytnout, ale nevím jak ho přiřadit konkrétnímu listeneru. Udělal jsem to podle návodu, hledal na netu, jestli jsem na něco nezapomněl, ale nic jsem nenašel.

extension

public function loadConfiguration()
{
    $builder = $this->getContainerBuilder();

    $builder->addDefinition($this->prefix('signUpEmailListener'))
        ->setClass('\UserModule\Component\SignUpEmailListener')
        ->setTags(['kdyby.subscriber']);

    $builder->addDefinition($this->prefix('signUp'))
        ->setImplement('\UserModule\Component\ISignUp')
        ->setFactory('\UserModule\Component\SignUp');
}

listener

private $mailer;
private $appSettings;

public function __construct(\Component\Mailer $mailer, \AppSettings $appSettings)
{
    $this->mailer = $mailer;
    $this->appSettings = $appSettings;
}

public function getSubscribedEvents()
{
    return array('\UserModule\Component\SignUp::onRegistered' => 'onRegistered');
}


public function onRegistered(SignUp $signUp, \User\Entity\User $userEntity)
{
    dump('registered');
}

SignUp

public $onRegistered = [];

public function process($form)
{
    // ...
    $this->em->dispatchEvent(
        get_class($this) . '::onRegistered',
        new \Kdyby\Events\EventArgsList([$this, $this->userEntity])
    );
}

Event v debug buru vidět je a obsahuje i objekty, který obsahovat má, ale Listener vrací no system listeners Co dělám špatně?

Díky

A proč nezavoláš prostě tohle?

$this->onRegistered($this, $this->userEntity);

můžeš zkusit kouknout do té továrničky kterou to vygenerovalo, jestli její eventy jsou napojené. Například služba application z nette vypadá takto, když je napojená

/**
 * @return Nette\Application\Application
 */
public function createServiceApplication()
{
    $service = new Nette\Application\Application(...);
    $service->onStartup = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onStartup',
    ), $service->onStartup);
    $service->onShutdown = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onShutdown',
    ), $service->onShutdown);
    $service->onRequest = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onRequest',
    ), $service->onRequest);
    $service->onPresenter = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onPresenter',
    ), $service->onPresenter);
    $service->onResponse = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onResponse',
    ), $service->onResponse);
    $service->onError = $this->getService('events.manager')->createEvent(array(
        'Nette\\Application\\Application',
        'onError',
    ), $service->onError);
    return $service;
}

tvoje služba je ale komponenta, takže bude až někde dole pod containerem, v samostatné třídě, která bude implementovat interface UserModule\Component\ISignUp

A proč nezavoláš prostě tohle?

Protože to vytvářím pomocí továrničky a někde jsem četl, že se to přiřadí továrničce a ne službě. Nicméně zkoušel jsem, tak jak to mám i jen s tím $this->onRegistered($this, $this->userEntity);.

Oboje vygeneruje stejný hodnoty do Nette.Configurator:

public function createServiceUserModule__signUp()
{
    return new SystemContainer_UserModule_Component_ISignUpImpl_userModule_signUp($this);
}
final class SystemContainer_UserModule_Component_ISignUpImpl_userModule_signUp implements UserModule\Component\ISignUp
{
    private $container;

    public function __construct(Nette\DI\Container $container)
    {
        $this->container = $container;
    }

    public function create()
    {
        $service = new \UserModule\Component\SignUp($this->container->getService('userDao'), // ...);
        if (!$service instanceof UserModule\Component\SignUp) {
            throw new Nette\UnexpectedValueException('Unable to create service \'userModule.signUp\', value returned by factory is not UserModule\\Component\\SignUp type.');
        }
        $service->onRegistered = $this->container->getService('events.manager')->createEvent(array(
            'UserModule\\Component\\SignUp',
            'onRegistered',
        ), $service->onRegistered);
        return $service;
    }
}

Předpokládám, že v tom je ten problém, že ten listener by měl být u createServiceUserModule__signUp, nebo se pletu? Otázka je, jak ho tam ale dostanu? :-)

  • Comments:

  • Nějakej nápad, čím by to mohlo být, respektive jak to dostat z továrničky do služby? :-)

    by Oli at 3.11.2014 9:28
  • I když zavolám $this->onRegistered($this, $this->userEntity);, tak to nezavolá a debug bar ukazuje no system listeners. Už jsem z toho celej zoufalej. Pomohlo by třeba kdybych ti někam poslal nějaký kusy kodu? Třeba mám něco někde nějak blbě na čem to ještě může záviset?

    by Oli at 7.11.2014 13:19
  • Takhle je to správně, zkus na té komponentě zavolat ten event jak jsem psal v předchozím příspěvku.

    by Filip Procházka at 3.11.2014 19:39

Pokud s tím máš pořád problém, tak prosím založ na githubu issue s kódem, ze kterého to půjde snadno reprodukovat. Nebo lépe, pošli pullrequest s hotovým testem ze kterého půjde poznat co je za problém a opravit to. A nebo úplně nejlépe můžeš rovnou poslat i opravu.

Jak chceš ty :) Díky!


You must first log in to participate in this discussion