Доступ к Doctrine Entity Manager в пользовательском расширении Twig в ZF2

Я использую модуль ZfcTwig из https://github.com/ZF-Commons/ZfcTwig

Ссылка используется: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Используя приведенную выше ссылку, я смог создать собственное расширение Twig. В этом классе я хочу получить доступ к Entity Manager, чтобы получить некоторые данные из базы данных.

Я регистрирую пользовательское расширение через следующий код в module.config.php —

'zfctwig' => array(
'extensions' => array(
'Application\Extension\MyCustomTwigExtension'
)
)

Но так как я хочу получить доступ к Doctrine Entity Manager в этом классе, я попытался создать замыкание —

'zfctwig' => array(
'extensions' => array(
'Application\Extension\MyCustomTwigExtension' => function($sm) {
$entityManager = $sm->get('doctrine.entitymanager.orm_default');
$ext = new Application\Extension\MyCustomTwigExtension();
$ext->setEntityManager($entityManager);
return $ext;
},
)
),

И это дает сообщение об ошибке как —

Catchable fatal error: Argument 1 passed to Twig_Environment::addExtension() must implement interface Twig_ExtensionInterface, instance of Closure given....

Я пытался для того же через фабрику —

'zfctwig' => array(
'extensions' => array(
'Application\Extension\MyCustomTwigExtension' => 'Application\Extension\MyCustomTwigExtensionFactory'
)
),

Сообщение об ошибке —

Catchable fatal error: Argument 1 passed to Twig_Environment::addExtension() must implement interface Twig_ExtensionInterface, instance of Application\Extension\MyCustomTwigExtensionFactory given...

Есть идеи по добавлению зависимости в расширение ветки? Это может быть не просто Entity Manager, а доступ к помощникам вида и т. Д.

Редактировать: Содержание MyCustomTwigExtension файл —

namespace Application\Extension;

class MyCustomTwigExtension extends \Twig_Extension {

protected $_eventManager;

public function setEntityManager($eventManager = null) {
$this->_eventManager = $eventManager;
}

public function getEntityManager() {
return $this->_eventManager;
}

public function getFilters() {
return array(
new \Twig_SimpleFilter('list', array($this, 'listFilter')),
);
}

public function listFilter($content = '') {
$repository = $this->getEntityManager()->getRepository('Application\Entity\User');
$models = $repository->findAll();

$html = '<ul>List Extension';
foreach ($models as $model) {
$html .= "<li>" . $model->getId() . ' ' . $model->getFullname() . "</li>";
}
$html .= '</ul>';

return $html;
}

public function getName() {
return 'list_extension';
}
}

Благодарю.

1

Решение

Единственная проблема, которую вы имеете, заключается в следующем:

Как уже упоминалось в module.config.php # 32 Вы не можете добавить Расширение через Фабрику, но данное пространство имен Application\Extension\MyCustomTwigExtensionFactory должен существовать как ключ в вашем service_manager-config.

Таким образом, вы можете сделать следующее:

'zfctwig' => array(
'extensions' => array(
'customTwig' => 'MyCustomTwigExtensionFactory'
)
),
'service_manager' => array(
'factories' => array(
'MyCustomTwigExtensionFactory' => 'Application\Extension\MyCustomTwigExtensionFactory'
)
)

И все должно быть хорошо.

0

Другие решения

Вы можете реализовать ServiceLocatorAwareInterface:

class MyCustomTwigExtension extends \Twig_Extension implements ServiceLocatorAwareInterface {

}

для реализации вы можете использовать черту: ServiceLocatorAwareTrait
и вы можете добавить метод, чтобы получить менеджер сущностей:

public function getEntityManager() {
if($this->entityManager === null) {
$this->entityManager = $this->getServiceLocator()->get(''doctrine.entitymanager.orm_default'')
}
return $this->entityManager;
}

и последнее: в конфигурации вы должны добавить:

'service_manager' => array(
'factories' => array(
'MyCustomTwigExtensionFactory' => function() { return new MyCustomTwigExtension(); }
)
)
0

По вопросам рекламы [email protected]