Twig扩展中的Doctrine连接 - Symfony

时间:2013-07-03 07:26:43

标签: symfony doctrine twig

根据我在网上看到的内容,应该可以在Twig扩展文件中创建Doctrine连接。我想创建一个带有过滤器的扩展,它将接收类别的id,然后在数据库中建立的categery树中返回该类别的位置。

Twig扩展文件:

(Symfony/src/MyProject/AdminBundle/Twig/MyExtension.php)

<?php

namespace MyProject\AdminBundle\Twig;

class ToolboxExtension extends \Twig_Extension
{
    protected $em;

    public function __construct($em)
    {
        $this->em = $em;
    }

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

    public function categoryPath($category_id) {
        $repository = $this->$em->getRepository('MyProjectAdminBundle:Category');
        $category = $repository->findOneById($category_id);
        $path = $repository->getPath($category);
        return implode(">", $path);
        return $category;
    }

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

}

服务配置文件:

(Symfony/src/MyProject/AdminBundle/Resources/config/services.yml)

services:
    myproject.twig.toolbox_extension:
        class: MyProject\AdminBundle\Twig\MyExtension
        tags:
            - { name: twig.extension }
        arguments:
            em: "@doctrine.orm.entity_manager"

但每当我使用此过滤器categoryPath时,Twig崩溃。因此模板仅在第一次使用此扩展时加载。

3 个答案:

答案 0 :(得分:0)

尝试将$this->em->替换为$this->$em->

答案 1 :(得分:0)

尝试替换

$this->em-> 

$this->$em-> 并取代

$this->em = $em; 

$this->em = $em['em'];

和 参数:

em: "@doctrine.orm.entity_manager"

与 参数:[em: "@doctrine.orm.entity_manager"]

答案 2 :(得分:0)

对我来说,下面的解决方案非常完美。我发现google groups上的帖子解决了我在Twig扩展中的学说问题。

在我的AppBundle \ Resources \ services.yml中:

app.twig.get_province.extension:
            class: AppBundle\Twig\GetProvinceExtension
            tags:
              - { name: twig.extension }
            arguments: [ '@doctrine.orm.entity_manager' ]

在AppBundle \ Twig \ GetProvinceExtention.php中:

class GetProvinceExtension extends \Twig_Extension {

    /**
     * @var EntityManager
     */
    protected $em;

    /**
     * GetProvinceExtension constructor.
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em) {
        $this->em = $em;
    }

    public function getFilters() {
        return [
            new \Twig_SimpleFilter('province', [$this, 'provinceFilter']),
        ];
    }

    public function provinceFilter($code) {
        $province = $this->em->getRepository("AppBundle:Province")
            ->findOneBy([ "code" => $code ]);

        return $province->getName();
    }
}