Module Silverstripe-对模块的自定义更改

Module Silverstripe-对模块的自定义更改,module,silverstripe,Module,Silverstripe,不知道去哪里找这个。我想对使用composer添加到站点的Silverstripe模块进行更改,但我不希望在稍后更新模块时覆盖自定义代码 如何在不编辑核心文件的情况下对某些代码进行一些更改?所讨论的代码位于控制器中的函数中。您可以对其进行自己的扩展,例如类MyModuleExtension extension 并覆盖/编辑/更改其中的代码 在config.yml中,按如下方式注册新扩展名: OriginalController: extensions: - MyModuleExten

不知道去哪里找这个。我想对使用composer添加到站点的Silverstripe模块进行更改,但我不希望在稍后更新模块时覆盖自定义代码


如何在不编辑核心文件的情况下对某些代码进行一些更改?所讨论的代码位于控制器中的函数中。

您可以对其进行自己的扩展,例如
类MyModuleExtension extension

并覆盖/编辑/更改其中的代码

config.yml
中,按如下方式注册新扩展名:

OriginalController:
  extensions:
    - MyModuleExtension

您可以对其进行自己的扩展,例如,
classmymoduleextension扩展

并覆盖/编辑/更改其中的代码

config.yml
中,按如下方式注册新扩展名:

OriginalController:
  extensions:
    - MyModuleExtension

这完全取决于你的情况

  • 如果要添加一些自定义方法,请使用
    扩展名
    (请参阅Simon的 (答复)
  • 如果要添加一些数据库字段或关系,请使用DataExtension 他是你的朋友吗
  • 如果模块是可扩展的并提供挂钩,则 可以更改(您猜到了)扩展中的行为。寻找
    $this->extend('functionName')
    在模块中,您可以修改内容 在扩展中的方法
    functionName()
但有时这是一个错误 bug或者模块没有提供可以使用的钩子,那么您就有了 要对该类进行子类化并告诉SilverStripe改用您的子类,请执行以下操作:

class MySubClass extends SomeClass
{
    public function doSomething()
        $something = parent::doSomething();
        //your changes
        return $something;
    }
}
您只需要在子类中进行更改和重写方法,无需复制子类中的所有内容。这样,以后您将获得大多数模块更新

然后,您需要将Injector配置为使用config.yml中的
MySubClass
而不是
SomeClass

Injector:
  SomeClass:
    class: MySubClass

这完全取决于你的情况

  • 如果要添加一些自定义方法,请使用
    扩展名
    (请参阅Simon的 (答复)
  • 如果要添加一些数据库字段或关系,请使用DataExtension 他是你的朋友吗
  • 如果模块是可扩展的并提供挂钩,则 可以更改(您猜到了)扩展中的行为。寻找
    $this->extend('functionName')
    在模块中,您可以修改内容 在扩展中的方法
    functionName()
但有时这是一个错误 bug或者模块没有提供可以使用的钩子,那么您就有了 要对该类进行子类化并告诉SilverStripe改用您的子类,请执行以下操作:

class MySubClass extends SomeClass
{
    public function doSomething()
        $something = parent::doSomething();
        //your changes
        return $something;
    }
}
您只需要在子类中进行更改和重写方法,无需复制子类中的所有内容。这样,以后您将获得大多数模块更新

然后,您需要将Injector配置为使用config.yml中的
MySubClass
而不是
SomeClass

Injector:
  SomeClass:
    class: MySubClass

可能值得注意的是,在某些情况下,什么也做不了,例如,您要修改的类不扩展对象(或不调用其构造函数),因此不可扩展,并且直接实例化,例如
新建SomeClass
,而不是可注入的,例如
SomeClass::create()
——在本例中(很少)除了对模块进行PR之外,您根本不能做很多事情,以使其首先可扩展。可能值得注意的是,在某些情况下,什么也做不了,例如,您要修改的类不扩展对象(或不调用其构造函数)因此不可扩展,直接实例化,例如
newsomeclass
,而不是可注入的,例如
SomeClass::create()
——在这种情况下(很少)除了对模块进行PR以使其首先可扩展之外,您无法做很多事情。值得注意的是,扩展类只能扩展类的公共API,不能使用它们覆盖任何现有方法。值得注意的是,扩展类只能扩展类的公共API,不能使用它们覆盖任何现有方法s