我正在使用https://github.com/ZF-Commons/ZfcTwig
中的ZfcTwig模块使用的参考:http://symfony.com/doc/current/cookbook/templating/twig_extension.html
使用上面的链接,我能够创建一个自定义的Twig扩展。在这个类中,我想访问实体管理器以从数据库中获取一些数据。
我正在通过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...
关于将依赖注入twig扩展的任何想法?它可能不仅仅是实体管理器,而是访问View Helpers等。
编辑: 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';
}
}
感谢。
答案 0 :(得分:0)
唯一的问题是:
如module.config.php#32中所述,您可以通过Factory添加Extension,但是给定的命名空间Application\Extension\MyCustomTwigExtensionFactory
必须作为service_manager
- config中的键存在。
所以你可以做到以下几点:
'zfctwig' => array(
'extensions' => array(
'customTwig' => 'MyCustomTwigExtensionFactory'
)
),
'service_manager' => array(
'factories' => array(
'MyCustomTwigExtensionFactory' => 'Application\Extension\MyCustomTwigExtensionFactory'
)
)
一切都应该没问题。
答案 1 :(得分:0)
您可以实施ServiceLocatorAwareInterface
:
class MyCustomTwigExtension extends \Twig_Extension implements ServiceLocatorAwareInterface {
}
实现你可以使用trait: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(); }
)
)