Symfony2:如何覆盖特定类的bundle

时间:2014-10-29 05:02:46

标签: symfony

我正在使用DatatableBundle开发symfony2应用程序(https://github.com/AliHichem/AliDatatableBundle

我需要覆盖Util Directory中的DoctrineBuilder类

我在我的src目录中创建了一个DtatableBundle,其中包含Alidatatable Bundle的所有结构 我在newBundle中编写了一个getParentMethod,并创建了我的新DoctrineBuilde类

Symfony始终使用供应商类而不是新的

这里是捆绑结构,然后是我要覆盖的类:

DatatableBundle  
 Util
   Factory
     Query
       DoctrineBuilder.php

和捆绑包的服务定义:     参数:         datatable.class:Ali \ DatatableBundle \ Util \ Datatable

services:
    datatable:
        class: "%datatable.class%"
        arguments: [ @service_container ]
        scope: prototype

    datatable.twig.extension:
        class: Ali\DatatableBundle\Twig\Extension\AliDatatableExtension
        arguments: [ @service_container ]
        tags:
            -  { name: twig.extension }

任何想法?

Thansk很多!

2 个答案:

答案 0 :(得分:3)

在普通(可扩展)包中,您只需将一个参数替换为您的值(默认类名称为您的类名),就可以覆盖它的每个部分。但是您想要扩展的包不是要扩展的。因此,要正确扩展它并覆盖某些部分,您需要进行许多操作。

在您使用自己的查询构建器的特定情况下,您需要覆盖类中__construct()的{​​{1}}并替换它:

Datatable.php

另外,要使应用程序使用您的//from $this->_queryBuilder = new DoctrineBuilder($container); //to $this->_queryBuilder = new YourDoctrineBuilder($container); 课程,您需要在Datatable中将默认课程替换为您的课程:

parameters.yml

没有必要在bundle中实现相同的目录结构来覆盖bundle的某些部分。它没有效果!您唯一需要的是定义自己的类并设置bundle以使用您的类而不是原始类。

bundle的

datatable.class: Your\Path\To\Datatable 仅适用于需要覆盖某些资源的情况。它们需要具有与原始捆绑相同的结构。但你的情况与资源无关。

答案 1 :(得分:0)

为此,您无法直接覆盖构建器类。

但是,您可以覆盖Datatable类并在__construct中调用您自己的构建器版本,如此...

namespace Acme\DatatableBundle\Util;

use Ali\DatatableBundle\Util\Datatable as BaseDatatable;
use Acme\DatatableBundle\Util\Factory\Query\DoctrineBuilder;

class Datatable extends BaseDatatable
{
    /**
     * class constructor 
     * 
     * @param ContainerInterface $container 
     */
    public function __construct(ContainerInterface $container)
    {
        parent::__construct($container);

        // This would change the default for your version of the builder
        $this->_queryBuilder = new DoctrineBuilder($container);
    }
}

然后只需将您的datatable类的版本设置为%datatable.class%参数,如..

datatable.class: Acme\DatatableBundle\Util\Datatable