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

Я работаю над проектом SilverStripe, в моем проекте мне нужно изменить поведение класса, являющегося частью инфраструктуры SilverStripe. Класс, который мне нужно изменить, это SilverStripe \ Assets \ Flysystem \ FlysystemAssetStore. Например, я сейчас пытаюсь изменить существующий метод класса. Я пытался использовать два варианта Injector и Extension. Оба не работали.

Первый вариант, который я попробовал, - это использование инжектора. Это то, что я сделал.

Сначала я создал класс с именем CustomFlysystemAssetStore.

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

SilverStripe\Assets\Flysystem\FlysystemAssetStore:
    class: CustomFlysystemAssetStore

Я объявил, что вызываемая функция publi c существует в классе CustomFlysystemAssetStore для переопределения существующего поведения. Но это не сработало. Новый метод в новом классе не был выполнен вообще.

Второй вариант, который я попробовал, - это использование Extension. Это то, что я сделал.

Сначала я создал класс CustomFlysystemAssetStore, который расширяет класс DataExtension.

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

SilverStripe\Assets\Flysystem\FlysystemAssetStore:
  extensions:
    - CustomFlysystemAssetStore

Затем я объявил метод publi c в новом вызываемом классе существует, чтобы увидеть, вызывается ли новый метод.

К сожалению, второй подход тоже не сработал. Как я могу переопределить методы класса SilverStripe \ Assets \ Flysystem \ FlysystemAssetStore, который является частью фреймворка?

Это мой файл assets.yml

---
Name: silverstripes3-flysystem
Only:
  envvarset: AWS_BUCKET_NAME
After:
  - '#assetsflysystem'
---
SilverStripe\Core\Injector\Injector:
  Aws\S3\S3Client:
    constructor:
      configuration:
        region: '`AWS_REGION`'
        version: latest
  League\Flysystem\Adapter\Local:
    class: League\Flysystem\Adapter\Local
    constructor:
      root: '`TEMP_PATH`'

  SilverStripe\S3\Adapter\PublicAdapter:
    constructor:
      s3Client: '%$Aws\S3\S3Client'
      bucket: '`AWS_BUCKET_NAME`'
      prefix: '`AWS_PUBLIC_BUCKET_PREFIX`'
  League\Flysystem\Cached\Storage\Memory.public:
    class: League\Flysystem\Cached\Storage\Memory
  League\Flysystem\Cached\Storage\Adapter.public:
    class: League\Flysystem\Cached\Storage\Adapter
    constructor:
      adapter: '%$League\Flysystem\Adapter\Local'
      file: 's3metadata/public'
      expire: 259200
  SilverStripe\Assets\Flysystem\PublicAdapter:
    class: SilverStripe\S3\Adapter\PublicCachedAdapter
    constructor:
      adapter: '%$SilverStripe\S3\Adapter\PublicAdapter'
      cache: '%$League\Flysystem\Cached\Storage\Adapter.public'

  SilverStripe\S3\Adapter\ProtectedAdapter:
    constructor:
      s3Client: '%$Aws\S3\S3Client'
      bucket: '`AWS_BUCKET_NAME`'
      prefix: '`AWS_PROTECTED_BUCKET_PREFIX`'
  League\Flysystem\Cached\Storage\Adapter.protected:
    class: League\Flysystem\Cached\Storage\Adapter
    constructor:
      adapter: '%$League\Flysystem\Adapter\Local'
      file: 's3metadata/protected'
      expire: 259200
  SilverStripe\Assets\Flysystem\ProtectedAdapter:
    class: SilverStripe\S3\Adapter\ProtectedCachedAdapter
    constructor:
      adapter: '%$SilverStripe\S3\Adapter\ProtectedAdapter'
      cache: '%$League\Flysystem\Cached\Storage\Adapter.protected'
#---
Name: silverstripes3-assetscore
Only:
  envvarset: AWS_BUCKET_NAME
After:
  - '#assetscore'
---
SilverStripe\Core\Injector\Injector:
  SilverStripe\Assets\Storage\AssetStore:
    class: CustomFlysystemAssetStore

1 Ответ

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

В Silverstripe 4.5 мы можем расширить FlysystemAssetStore и определить наш собственный метод exists.

Сначала мы создадим файл CustomFlysystemAssetStore.php в нашем проекте:

app/src/CustomFlysystemAssetStore.php

use SilverStripe\Assets\Flysystem\FlysystemAssetStore;

class CustomFlysystemAssetStore extends FlysystemAssetStore {

    public function exists($filename, $hash, $variant = null)
    {
        // Custom logic goes here
        // ...

        // Fallback to the parent exists function
        return parent::exists($filename, $hash, $variant);
    }
}

Затем мы устанавливаем это как AssetStore, которое мы хотим, чтобы система использовала через файл конфигурации yml. Мы создаем assets.yml файл:

app/_config/assets.yml

---
Name: app-assetscore
After:
  - '#assetscore'
---

SilverStripe\Core\Injector\Injector:
  SilverStripe\Assets\Storage\AssetStore:
    class: CustomFlysystemAssetStore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...