在 ZF2 中的自定义 Twig 扩展中访问原则实体管理器


Access Doctrine Entity Manager in custom Twig Extension in ZF2

我正在使用 https://github.com/ZF-Commons/ZfcTwig 的ZfcTwig模块

参考使用: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

使用上面的链接,我能够创建自定义的Twig扩展。在此类中,我想访问实体管理器以从数据库中获取一些数据。

我正在通过模块中的以下代码注册自定义扩展.php -

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

但是由于我想访问这个类中的学说实体管理器,我尝试创建一个闭包 -

'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...

关于将依赖注入树枝扩展的任何想法?它可能不仅仅是实体管理器,而是对查看帮助程序等的访问。

编辑: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';
    }
}

谢谢。

您遇到的唯一问题是以下几点:

如 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'
    )
)

一切都应该没问题。

你可以实现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(); }
    )
)