扩展SilverStripe模块扩展

扩展SilverStripe模块扩展,silverstripe,Silverstripe,我在SilverStripe安装中安装了一个特定的模块。下面是目录结构 - Root - framework - cms - mymodule - code - extensions - CustomClass.php 下面是CustomClass.php class CustomClass extends Extension { public function init() { } public function cu

我在SilverStripe安装中安装了一个特定的模块。下面是目录结构

- Root
  - framework
  - cms
  - mymodule
    - code
      - extensions
        - CustomClass.php
下面是
CustomClass.php

class CustomClass extends Extension {
    public function init() {
    }

    public function customMethod() {
    }
}
class MyCustomClass extends CustomClass {
    public function customMethod() {
       //do my code here
    }
}
我需要重写
CustomClass
类的
customMethod
方法。我可以很容易地更改此方法,但是如果模块得到更新,在此处更改将在将来造成麻烦。所做的所有更改都将丢失

为此,我想扩展模块中使用的扩展类

我已经创建了一个扩展
/mysite/extensions/MyCustomClass.php

class MyCustomClass extends Extension {
    public function customMethod() {
       //do my code here
    }
}
但我不知道如何应用这个。我以为
CustomClass::add_extension(“MyCustomClass”)
但这肯定行不通,因为
add_extension
方法在
CustomClass
中不存在


我们如何应对这种情况?我可以改用注射器吗?如果是,如何在
mysite/\u config.php
中调用它而不是
\u config.yml

使用injector确实解决了问题,但也必须使用
\u config.yml
。这就是我所做的

文件
/mysite/extensions/MyCustomClass.php

class CustomClass extends Extension {
    public function init() {
    }

    public function customMethod() {
    }
}
class MyCustomClass extends CustomClass {
    public function customMethod() {
       //do my code here
    }
}
/mysite/_config/config.yml
中,我添加了以下几行

Injector:
  CustomClass:
    class: MyCustomClass
/mysite/_config.php
中,我添加了以下行

$object = Injector::inst()->create('CustomClass');

这一切都很好。

还有另一种方法可以实现类似的功能,而无需直接替换以前的扩展。使用SilverStripe的扩展系统,我们不仅可以控制加载的配置设置。注意这一点很重要,因为来自扩展的
customMethod
函数使用它从加载的所有扩展中找到的第一个函数

因此,只有控制何时加载
MyCustomClass
扩展才能运行自己的
customMethod
函数

假设“MyModule”模块定义了以下YAML文件:

---
Name: MyModuleExtensions
After:
  - 'framework/*'
  - 'cms/*'
---

Page:
  extensions:
    - CustomClass
我们需要做的就是在这个“MyModule”文件之前指定一个单独的YAML文件来运行。这可以通过以下方式实现:

---
Name: MyCustomModule
Before:
  - MyModule/#MyModuleExtensions
---

Page:
  extensions:
    - MyCustomClass
现在,当您在扩展名所在的任何类上调用
customMethod
函数时(因此在我的示例中,
Page
类),它将调用
MyCustomClass
扩展名中的函数