我正在研究SilverStripe项目,在我的项目中,我需要更改属于SilverStripe框架的类的行为。我需要修改的类是SilverStripe \ Assets \ Flysystem \ FlysystemAssetStore。例如,我现在试图修改该类的exist方法。我尝试使用两个选项Injector和Extension。两者都不起作用。
我尝试的第一个选项是使用Injector。这就是我所做的。
首先,我创建了一个名为CustomFlysystemAssetStore的类。
然后我将以下代码添加到mysite.yml
SilverStripe\Assets\Flysystem\FlysystemAssetStore:
class: CustomFlysystemAssetStore
我声明了CustomFlysystemAssetStore类中存在的名为public的公共函数,以覆盖现有行为。但这没有用。新类中的新方法根本未执行。
我尝试的第二个选项是使用扩展名。这就是我所做的。
首先,我创建了一个名为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 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