DangelZM の回答に基づいて構築し、イベント マネージャーに関する別のリファレンス (投稿の最後にあるリンクを参照) を使用して、潜在的な ZfcUser イベント リスナーをユーザー リスナー オブジェクトに整理するこのソリューションを思いつきました。
注: NvUser という独自のユーザー モジュールを作成したので、モジュールの名前によっては、NvUser のすべての参照をユーザー モジュール名に置き換える必要があります。
概要
イベント リスナーを共有イベント マネージャーにアタッチし、イベント リスナーのコールバックを格納できる NvUserListener オブジェクトを作成しました。
NvUser/Module.php 内:
<?php
namespace NvUser;
use Zend\Mvc\MvcEvent;
use NvUser\Listener\NvUserListener;
class Module
{
public function onBootstrap(MvcEvent $mvcEvent)
{
$em = $mvcEvent->getApplication()->getEventManager();
$em->attach(new NvUserListener());
}
}
NvUser/src/NvUser/Listener/NvUserListener.php 内:
<?php
namespace NvUser\Listener;
use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\Event;
class NvUserListener extends AbstractListenerAggregate
{
public function attach(EventManagerInterface $events)
{
$sharedManager = $events->getSharedManager();
$this->listeners[] = $sharedManager->attach('ZfcUser\Service\User', 'register', array($this, 'onRegister'));
$this->listeners[] = $sharedManager->attach('ZfcUser\Service\User', 'register.post', array($this, 'onRegisterPost'));
}
public function onRegister(Event $e)
{
$sm = $e->getTarget()->getServiceManager();
$em = $sm->get('doctrine.entitymanager.orm_default');
$user = $e->getParam('user');
$config = $sm->get('config');
$criteria = array('roleId' => $config['zfcuser']['new_user_default_role']);
$defaultUserRole = $em->getRepository('NvUser\Entity\Role')->findOneBy($criteria);
if ($defaultUserRole !== null)
{
$user->addRole($defaultUserRole);
}
}
public function onRegisterPost(Event $e)
{
$user = $e->getParam('user');
$form = $e->getParam('form');
// Do something after user has registered
}
}
NvUser/config/module.config.php 内:
<?php
namespace NvUser;
return array(
'zfcuser' => array(
'new_user_default_role' => 'user',
),
);
参考文献:
Zend Framework 2 イベント マネージャーについて