ZF2 получает службу доктрины внутри события расширения bootstrap zfcUser

Я расширил ZfcUser. У меня заработали новые поля, и они добавляются в базу данных через доктрину 2. Никаких проблем. Но теперь мне нужно добавить ссылки между пользователем и таблицей выплат и специальной ролевой системой. Я пытаюсь поместить это в событие, но я не могу получить доступ к службе доктрины. Мой onBootstrap выглядит так.

public function onBootstrap( MVCEvent $e )
{
    $eventManager = $e->getApplication()->getEventManager();
    $em           = $eventManager->getSharedManager();
    $em->attach(
        'ZfcUser\Form\RegisterFilter',
        'init',
        function( $e )
        {
            $filter = $e->getTarget();

            // do your form filtering here 
            new Register\Filter($filter);

        }
    );

    // custom form fields

    $em->attach(
        'ZfcUser\Form\Register',
        'init',
        function($e)
        {
            /* @var $form \ZfcUser\Form\Register */
            $form = $e->getTarget();
            new Register\Form($form);
        }
    );

    // here's the storage bit

    $zfcServiceEvents = $e->getApplication()->getServiceManager()->get('zfcuser_user_service')->getEventManager();
    $doctrineObjectManager = $e->getApplication()->getServiceManager()->get('Doctrine\ORM\EntityManager');
    var_dump($e->getApplication()->getServiceManager()->get('zfcuser_user_service')->getEventManager()->getEvents()); 
    $zfcServiceEvents->attach('register', function($e){
        /* @var $user \User\Entity\User */
        //$form = $e->getParam('form');
        //print_r($form);
        //echo get_class($e);
        new Register\Storage($e);
        break;
    });

    // you can even do stuff after it stores           
    $zfcServiceEvents->attach('register.post', function($e) {
        /*$user = $e->getParam('user');*/
    });
}

Форма и фильтр работают, но я не могу получить доступ к службе доктрины из функции анонимного события. Как мне это сделать?


person KatsuoRyuu    schedule 09.06.2013    source источник


Ответы (1)


Поскольку вы делаете это в onBootstrap(), в MvcEvent есть все, что вам нужно. Вам просто нужно получить менеджер сущностей и use его в вашей анонимной функции

public function onBootstrap( MVCEvent $e )
{
    $eventManager = $e->getApplication()->getEventManager();
    $em           = $eventManager->getSharedManager();
    // fetch the entity manager
    $sm = $e->getApplication()->getServiceManager();
    $entityManager = $sm->get('Doctrine\ORM\EntityManager');

    $em->attach(
        'ZfcUser\Form\RegisterFilter',
        'init',
        // use the entity manager in your function
        function( $e ) use ($entityManager);
        {
            $filter = $e->getTarget();

            // variable $entityManager is now available in this scope
            // so we could for example inject it into the filter like so
            new Register\Filter($filter, $entityManager);                

        }
    );

Я предполагаю, что диспетчер сущностей был службой доктрины, о которой вы говорили, но та же самая методология используется для use других служб в рамках ваших анонимных функций.

person Crisp    schedule 09.06.2013