扩展SilverStripe模块扩展

时间:2016-08-08 04:19:23

标签: silverstripe

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

- Root
  - framework
  - cms
  - mymodule
    - code
      - extensions
        - CustomClass.php

以下是CustomClass.php

的示例
class CustomClass extends Extension {
    public function init() {
    }

    public function customMethod() {
    }
}

我需要覆盖customMethod类的CustomClass方法。我可以轻松地更改此方法,但如果模块更新,此处更改将导致将来出现问题。所做的所有更改都将丢失。

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

我创建了一个扩展程序/mysite/extensions/MyCustomClass.php

class MyCustomClass extends Extension {
    public function customMethod() {
       //do my code here
    }
}

但我不知道如何应用它。我认为CustomClass::add_extension("MyCustomClass ")但肯定这不起作用,因为add_extension中不存在CustomClass方法。

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

2 个答案:

答案 0 :(得分:3)

使用注入器确实解决了问题,但也必须使用_config.yml。这就是我所做的。

档案/mysite/extensions/MyCustomClass.php

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');

这一切都很好。

答案 1 :(得分:3)

还有另一种实现类似功能的方法,无需直接替换以前的扩展。使用SilverStripe的扩展系统,我们不仅可以控制加载的配置设置but the order they are loaded。这一点很重要,因为扩展中的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中的一个扩展