根据我在网上看到的内容,应该可以在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崩溃。因此模板仅在第一次使用此扩展时加载。
答案 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();
}
}