如何覆盖现有类FlysystemAssetStore的现有方法,该类是SilverStripe中框架的一部分

问题描述 投票:0回答:1

我正在研究SilverStripe项目,在我的项目中,我需要更改属于SilverStripe框架的类的行为。我需要修改的类是SilverStripe \ Assets \ Flysystem \ FlysystemAssetStore。例如,我现在试图修改该类的exist方法。我尝试使用两个选项Injector和Extension。两者都不起作用。

我尝试的第一个选项是使用Injector。这就是我所做的。

首先,我创建了一个名为CustomFlysystemAssetStore的类。

然后我将以下代码添加到mysite.yml

SilverStripe\Assets\Flysystem\FlysystemAssetStore:
    class: CustomFlysystemAssetStore

我声明了CustomFlysystemAssetStore类中存在的名为pu​​blic的公共函数,以覆盖现有行为。但这没有用。新类中的新方法根本未执行。

我尝试的第二个选项是使用扩展名。这就是我所做的。

首先,我创建了一个名为CustomFlysystemAssetStore的类,该类正在扩展DataExtension类。

然后,我将以下代码段添加到mysite.yml中。

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

然后我在新类中声明了一个公共方法,该方法存在,以查看是否调用了新方法。

[不幸的是,第二种方法也不起作用。如何覆盖属于框架的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
silverstripe silverstripe-4
1个回答
0
投票

在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);
    }
}

然后将其设置为我们希望系统通过yml配置文件使用的AssetStore。我们创建一个assets.yml文件:

app/_config/assets.yml

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

SilverStripe\Core\Injector\Injector:
  SilverStripe\Assets\Storage\AssetStore:
    class: CustomFlysystemAssetStore
© www.soinside.com 2019 - 2024. All rights reserved.