2015-08-27 3 views
1

Я хочу использовать мои объекты внутри своего настраиваемого плагина. Таким образом, я делаю в таком порядке:Как вызвать doctrine.entitymanager.orm_default в плагине zf2

1) Заявленный мой плагин в модуле \ SRC \ Plugin \ plugin.php

namespace Application\Plugin; 

    use Zend\Mvc\Controller\Plugin\AbstractPlugin; 
    use Doctrine\ORM\EntityManager; 
    use User\Entity\UserProfile; 
    use Zend\ServiceManager\ServiceManager; 

    class AuthenticationPlugin extends AbstractPlugin { 
     protected $entityManager; 
     protected $serviceManager; 

    public function setServiceManager(ServiceManager $locator) { 
     $this->serviceManager = $locator; 
    } 

    public function getServiceManager() { 
     return $this->serviceManager; 
    } 

    public function getEntityManager() { 
     $userEntityFactory = new \Application\Factory\UserEntityFactory(); 

     $this->entityManager = $userEntityFactory->createService($this->getServiceManager()); 

     return $this->entityManager; 
    } 

    public function someAction($user_email) { 
     $user = $this->getEntityManager()->getRepository('User\Entity\User')->findBy(array('email'=>$user_email)); 
    } 
} 

2) Создан мой завод:

namespace User\Factory; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class UserEntityFactory implements FactoryInterface { 

    public function createService(ServiceLocatorInterface $serviceLocator) { 
     return $serviceLocator->get('doctrine.entitymanager.orm_default'); 
    }  
} 

3) Определяет его в module.config.php:

'service_manager' => array(
    'factories' => array(
     'UserEntityFactory' => 'Application\Factory\UserEntityFactory', 
    ), 
), 
'controller_plugins' => array(
    'invokables' => array(
     'AuthenticationPlugin' => 'Application\Plugin\AuthenticationPlugin', 
    ) 
), 

4) Отправка на мой поиска сервиса плагин в module.php:

public function getServiceConfig() { 
     return array(
      'factories' => array(
       'AuthenticationPlugin' => function($sm) { 
        $locator = $sm->getServiceLocator(); 
        $instance = new \Application\Plugin\AuthenticationPlugin(); 
        $instance->setServiceManager($locator); 

        return $instance; 
       }, 
      ), 
     ); 
    } 

5) ... и назвав его в onBootstrap:

$em->attach('ZfcUser\Service\User', 'register', function($e) { 

     $user = $e->getParam('user'); // User account object 
     $authenticationPlugin = new AuthenticationPlugin(); 
     $authenticationPlugin->someAction($user->getEmail()); 
    }); 

Но я получил сообщение об ошибке, что $ локатора в плагин является пустой ... Я запутался, и я уверен, что я я делаю что-то неправильно ... или все. Я был бы счастлив, если кто-то поделится опытом или покажет порядок действий. Благодарю.

ответ

0

Вам не нужно вводить весь объект сервис-менеджера в свой класс плагина.

Вам нужно всего лишь ввести объект репозитория User \ Entity \ User, это будет единственная зависимость, требуемая в вашем классе плагинов.

Вы должны передать это в конструкторе класса плагина с помощью вашего завода:

public function getServiceConfig() { 
     return array(
      'factories' => array(
       'AuthenticationPlugin' => function($sm) { 
        return new \Application\Plugin\AuthenticationPlugin($sm->get('doctrine.entitymanager.orm_default')->getRepository('User\Entity\User')); 
       }, 
      ), 
     ); 
    } 

в классе плагина:

class AuthenticationPlugin extends AbstractPlugin { 

    private $userRepository; 

    public function __construct(\User\Entity\User $userRepository){ 

     $this->userRepository=$userRepository; 

    } 

    public function someAction($user_email) { 
     $user = $this->userRepository->findBy(array('email'=>$user_email)); 
    } 
                 } 

Как вы настраиваете плагин через module.php вы не нужно также объявлять плагин как invokable в вашем файле конфигурации. Так удалите следующую строку из вашего module.config.php

'AuthenticationPlugin' => 'Application\Plugin\AuthenticationPlugin' 

Как примечание стороны, существуют различные плюсы и минусы между объявляя свои услуги/плагинами либо module.php или файл module.config. Это, однако, не было вопросом, поэтому я не буду вдаваться в подробности здесь.

+0

Спасибо, но когда я пытаюсь передать User \ Entity \ User в конструктор плагинов, у меня есть ошибка: Catchable fatal error: Аргумент 1 передан AuthenticationPlugin :: __ construct() должен быть экземпляром User \ Entity \ Пользователь, не указан, вызван в /module/Application/Module.php в строке 37 и определен в /module/Application/src/Application/Plugin/AuthenticationPlugin.php. В моем контроллере все работает нормально, но в плагине нет. Я попытался передать другой класс в конструкцию плагина, и у меня есть такая же ошибка, но теперь вместо User \ Entity \ User это другой класс ... –

+0

вы можете вставить здесь файл Module.php. – matwr

+0

ok Я вижу проблему, которую вы также объявили плагином как invokable, поэтому он вызывается дважды, один раз через ваш загрузочный файл модуля, а также через объявление конфигурации. Теперь решение состоит в том, чтобы удалить его. Поскольку вы правильно настроили Module.php, вы можете просто удалить объявление из файла конфигурации, я обновлю ответ, чтобы отразить это. – matwr