Как внедрить интерфейс, который является частью инфраструктуры, используя пользовательский класс в SilverStripe - PullRequest
1 голос
/ 15 января 2020

Я работаю над проектом SilverStripe. Версия проекта SilverStripe 4.4.4. В моем проекте я пытаюсь заменить класс, введенный для интерфейса. И интерфейс, и класс являются частью фреймворка.

В коде фреймворка он имеет следующий класс

class NaturalFileIDHelper implements FileIDHelper

Как видите, NaturalFileIDHelper реализует интерфейс FileIDHelper. Я хочу заменить все экземпляры NaturalFileIDHelper своим клиентским классом CustomFileIDHelper, который также реализует интерфейс FileIDHelper.

Это то, что я сделал.

Я создал пользовательский класс с именем CustomFileIDHelper, который реализует интерфейс FileIDHelper.

Затем я добавил следующий фрагмент кода в mysite.yml.

  SilverStripe\Assets\FilenameParsing\FileIDHelper:
    class: CustomFileIDHelper

Затем я перестроил проект. Но мой проект все еще использует класс NaturalFileIDHelper, который поставляется с фреймворком. Кажется, что класс CustomFileIDHelper не используется.

Как мне заставить его работать? Возможно ли это сделать?

1 Ответ

3 голосов
/ 16 января 2020

Я хочу заменить все NaturalFileIDHelper экземпляры своим классом клиента под названием CustomFileIDHelper class

Если вы хотите заменить все NaturalFileIDHelper экземпляры, то это класс, который вы следует переопределить (не FileIDHelper). Также конфигурацию .yml, которую вы имеете, необходимо передать в Injector. (https://docs.silverstripe.org/en/4/developer_guides/extending/injector/)

SilverStripe\Core\Injector\Injector:
  SilverStripe\Assets\FilenameParsing\NaturalFileIDHelper:
    class: CustomFileIDHelper

Но это будет работать только в том случае, если объект создается с помощью функции ClassName::create(), и я нашел этот фрагмент кода в каркасе:

(LegacyThumbnailMigrationHelper.php)
$defaultFileIDHelper = new NaturalFileIDHelper(), // Injector is not called here.

Вам нужно переопределить классы, которые вызывают new NaturalFileIDHelper(), и изменить его на NaturalFileIDHelper::create(), вы можете вызвать ::create(), потому что класс NaturalFileIDHelper имеет черту use Injectable;.

Кроме того, вместо того, чтобы преодолевать проблемы с переопределением классов, которые вызывают new NaturalFileIDHelper(), вы можете создать запрос на извлечение репозитория фреймворка с вашими изменениями NaturalFileIDHelper::create(), так как это улучшит текущий код фреймворка. (это позволяет использовать внедрение зависимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...