我正在使用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很多!
答案 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