これを探す場所が不明です。私はComposerで自分のサイトに追加したSilverstripeモジュールに変更を加えたいが、後でモジュールを更新するときにカスタムコードを上書きしたくない。Silverstripe - モジュールへのカスタム変更
コアファイルを編集せずにコードの一部をいくつか変更するにはどうすればよいですか?問題のコードは、コントローラ内の関数内にあります。
これを探す場所が不明です。私はComposerで自分のサイトに追加したSilverstripeモジュールに変更を加えたいが、後でモジュールを更新するときにカスタムコードを上書きしたくない。Silverstripe - モジュールへのカスタム変更
コアファイルを編集せずにコードの一部をいくつか変更するにはどうすればよいですか?問題のコードは、コントローラ内の関数内にあります。
自分で拡張することができます。 class MyModuleExtension extends Extension
オーバーライド/編集/変更コードがあります。あなたのconfig.yml
で
、そのような新しい拡張登録:それは間違いなくあなたのケースに依存
OriginalController:
extensions:
- MyModuleExtension
を。
Extension
を使い追加したい場合は(サイモンの 答えを参照)$this->extend('functionName')
を探して、あなたはあなたの拡張方法functionName()
にをもの を変更することができます。しかし、時にはそれは バグですか、モジュールが使用できるフックを提供していない場合、あなたは にを持っていますクラスをサブクラス化し、代わりにあなたのサブクラスを使用するようにSilverStripeを伝える:
class MySubClass extends SomeClass
{
public function doSomething()
$something = parent::doSomething();
//your changes
return $something;
}
}
あなたは、あなたのサブクラスであなたのサブクラスですべてのものをコピーする必要があなたの変更や上書き方法を必要としません。この方法で、ほとんどのモジュールアップデートを後で入手できます。
次に、あなたがあなたのconfig.ymlに代わりSomeClass
のごMySubClass
を使用するようにインジェクターを構成する必要があります。
Injector:
SomeClass:
class: MySubClass
何もできない場合があることに注意する価値があります。変更したいクラスがObjectを拡張しない(またはそのコンストラクタを呼び出さない)ため、拡張できず、直接インスタンス化されます。例えば、新しい「SomeClass」を注入することができる。 'SomeClass :: create()' - この場合はまれですが、最初にモジュールを拡張可能にするために、モジュールへのPR以外のことは全くできません –
それはあなたが使用することはできません、拡張クラスのみが、クラスの公開APIを拡張することができることは注目に値します既存のメソッドをオーバーライドします。 –