[英]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.