【问题标题】:Extending SilverStripe modules extension扩展 SilverStripe 模块扩展
【发布时间】:2016-08-08 04:19:23
【问题描述】:

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

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

这里是CustomClass.php的例子

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

    public function customMethod() {
    }
}

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

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

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

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

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

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

【问题讨论】:

    标签: silverstripe


    【解决方案1】:

    使用注入器确实可以解决问题,但也必须使用_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');
    

    一切都很好。

    【讨论】:

      【解决方案2】:

      还有另一种方法可以实现类似的功能,而无需直接替换以前的扩展。使用 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 扩展中调用该函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 2014-03-30
        • 1970-01-01
        • 2012-12-19
        • 2016-12-19
        相关资源
        最近更新 更多