Symfony2调用函数来自一个树枝中的多个树枝扩展

时间:2016-07-13 08:27:04

标签: symfony twig

我有两个树枝延伸和一根树枝。我需要在一根树枝上使用树枝延伸部分的功能。有什么方法可以区分调用函数的扩展名。

现在,我正在使用这种方法driverId|getDriverNameFromId 它给了我错误!

以下是驱动程序扩展的代码:

<?php

namespace abc\CoreBundle\Extension;

use Doctrine\Common\Persistence\ManagerRegistry;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use abc\CoreBundle\Entity\CostAllocation;
use abc\CoreBundle\Entity\Driver;

class DriverExtension extends \Twig_Extension {

    protected $mr;
    protected $container;

    public function __construct(ManagerRegistry $mr, Container $container) 
    {
        $this->mr = $mr;
        $this->container = $container;
    }

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

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

    /**
     * get updated columns
     *
     * @param Integer $driverImportId
     *
     * return array
     */
    public function getDriverNameFromId($driverImportId)
    {
        return $this->container->get('core_process_import')->getName($driverImportId, 'DriverImport');
    }


}

同样我有一个核心扩展。

在我的树枝上,当我打电话

    {% if driverImport.id|getDriverNameFromId|length > 0  %}
{% endif %}

它给了我错误

Unknown "getDriverNameFromId" filter in CoreBundle:DriverImport:list.html.twig at line 88?

以下是services.yml的代码

_core.services.invoice.extension.class: abc\CoreBundle\Extension\InvoiceExtension
    _core.services.driver.extension.class: abc\CoreBundle\Extension\DriverExtension


invoice.twig.extension: 
        class: %_core.services.invoice.extension.class% 
        arguments: [@doctrine, @service_container] 
        tags: 
            - { name: twig.extension }
    driver.twig.extension: 
        class: %_core.services.driver.extension.class% 
        arguments: [@doctrine, @service_container] 
        tags: 
            - { name: twig.extension }

2 个答案:

答案 0 :(得分:1)

首先获得正确的命名空间(根据最佳实践建议);对于任何Twig扩展类,它应该是名称空间Smartshore\CoreBundle\Twig

确保您已在services.yml中正确声明了类 E.g。

driver_extension.twig.extension:
        class: Smartshore\CoreBundle\Twig\DriverExtension
        arguments: ["@my.injected.services"]
        tags:
           - { name: twig.extension }
myotherclass.twig.extension:
        class: Smartshore\CoreBundle\Twig\MyOtherTwigExtension
        arguments: ["@security.context", '@kernel', '@router']
        tags:
           - { name: twig.extension }

答案 1 :(得分:1)

我已经在我的项目中测试了你的代码,它运行正常,所以它是另一回事。

我认为您的服务配置未导入。

如果您将其添加到捆绑包 services.yml文件中(不是app/config/services.yml中的主要文件),请确保您已在config.yml中导入此文件文件。

假设您的服务配置在

src/CoreBundle/Resources/config/services.yml

确保您已在app/config/config.yml文件的开头导入它:

imports:
    - { resource: parameters.yml }  // |
    - { resource: security.yml }    // |=> default ones
    - { resource: services.yml }    // |
    - { resource: "@CoreBundle/Resources/config/services.yml" } //new one