【问题标题】:Access Doctrine Entity Manager in custom Twig Extension in ZF2在 ZF2 的自定义 Twig 扩展中访问 Doctrine Entity Manager
【发布时间】:2015-01-09 17:32:52
【问题描述】:

我正在使用来自 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';
    }
}

谢谢。

【问题讨论】:

  • 你实例化Application\Extension\MyCustomTwigExtension。但是这个对象是错误的类型。能否请您显示您正在使用的Application\Extension\MyCustomTwigExtension 类的内容?
  • 不是Application\Extension\MyCustomTwigExtension而不是Application\Extension\MyCustomTwigExtensionFactory吗?
  • 我在注册时使用了上面添加的文件'zfctwig' =&gt; array('extensions' =&gt; array( 'Application\Extension\MyCustomTwigExtension'))
  • 现在当我通过'Application\Extension\MyCustomTwigExtension' =&gt; 'Application\Extension\MyCustomTwigExtensionFactory' 注册时,它给出了错误Argument 1 passed to Twig_Environment::addExtension() must implement interface Twig_ExtensionInterface, instance of Application\Extension\MyCustomTwigExtensionFactory given...
  • 当我通过闭包注册时,它说参数 1 必须实现接口 Twig_ExtensionInterface 但给出了一个闭包。

标签: php doctrine-orm zend-framework2 twig twig-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'
    )
)

一切都应该没问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2012-11-08
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多