1

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

树枝扩展文件:

(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 就会崩溃。所以模板只在第一次使用这个扩展之前加载。

4

4 回答 4

1

对我来说,下面的解决方案很完美。我在google 群组上找到了帖子,这些帖子解决了我在 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();
    }
}
于 2017-11-22T18:50:06.533 回答
0

尝试替换$this->em->$this->$em->.

于 2015-03-25T00:55:20.123 回答
0

尝试更换

$this->em-> 

$this->$em-> 和替换

$this->em = $em; 

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

和论据:

em: "@doctrine.orm.entity_manager"

有论据:[em: "@doctrine.orm.entity_manager"]

于 2016-09-21T13:25:48.007 回答
0

您可以使用

{% set Products = repository('Entity\\Products').findAll() %}

在你的树枝里面

然后你可以使用

{% Product in Products %}
     <p>{{ Product.name }}</p>
{% endfor %}
于 2022-02-23T08:42:49.957 回答