我正在从事SilverStripe项目。 Project SilverStripe版本为4.4.4。在我的项目中,我试图替换为接口注入的类。接口和类都是框架的一部分。
在框架代码中,它具有以下类
class NaturalFileIDHelper implements FileIDHelper
如您所见,NaturalFileIDHelper正在实现FileIDHelper接口。我想做的是用我的客户类(称为CustomFileIDHelper类)替换所有NaturalFileIDHelper实例,该类也实现了FileIDHelper接口。
这就是我所做的。
我创建了一个名为CustomFileIDHelper的自定义类,该类正在实现FileIDHelper接口。
然后我在mysite.yml中添加了以下代码段。
SilverStripe\Assets\FilenameParsing\FileIDHelper:
class: CustomFileIDHelper
然后我重建项目。但是我的项目仍在使用框架随附的NaturalFileIDHelper类。似乎未使用CustomFileIDHelper类。
我如何使它工作?可以这样做吗?
我想用称为
NaturalFileIDHelper
类的客户类替换所有CustomFileIDHelper
实例>如果要替换所有
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;
。