繁体   English   中英

Symfony2:如何覆盖捆绑软件的特定类

[英]Symfony2: How to override a specific class of a bundle

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

我需要覆盖Util目录中的DoctrineBuilder类

我已经在src目录中使用Alidatatable Bundle的所有结构创建了一个DtatableBundle,在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 }

有任何想法吗 ?

非常感谢!

在普通(可扩展)捆绑包中,您始终可以通过将一个参数替换为您的值(将默认类名更改为类名)来覆盖它的每个部分。 但是,您要扩展的捆绑软件不打算扩展。 因此,要正确扩展它并覆盖某些部分,您将需要进行许多操作。

在特定情况下,若要使用自己的查询生成器,则需要在您的类中重写Datatable.php __construct()并将其替换:

//from
$this->_queryBuilder = new DoctrineBuilder($container);
//to
$this->_queryBuilder = new YourDoctrineBuilder($container);

另外,要使应用程序使用您的Datatable类,您需要在parameters.yml中将默认类替换为您的默认类:

datatable.class: Your\Path\To\Datatable

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

bundle的getParent()仅在需要覆盖某些资源的情况下有效。 它们需要具有与原始捆绑包相同的结构。 但是您的情况与资源无关。

为此,您不能直接覆盖构建器类。

但是,您可以覆盖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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM