Я хочу использовать мои объекты внутри своего настраиваемого плагина. Таким образом, я делаю в таком порядке:Как вызвать 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());
});
Но я получил сообщение об ошибке, что $ локатора в плагин является пустой ... Я запутался, и я уверен, что я я делаю что-то неправильно ... или все. Я был бы счастлив, если кто-то поделится опытом или покажет порядок действий. Благодарю.
Спасибо, но когда я пытаюсь передать 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 это другой класс ... –
вы можете вставить здесь файл Module.php. – matwr
ok Я вижу проблему, которую вы также объявили плагином как invokable, поэтому он вызывается дважды, один раз через ваш загрузочный файл модуля, а также через объявление конфигурации. Теперь решение состоит в том, чтобы удалить его. Поскольку вы правильно настроили Module.php, вы можете просто удалить объявление из файла конфигурации, я обновлю ответ, чтобы отразить это. – matwr