88namespace Magento \AwsS3 \Driver ;
99
1010use Aws \S3 \S3Client ;
11- use League \Flysystem \AwsS3v3 \AwsS3Adapter ;
12- use League \Flysystem \Cached \CachedAdapter ;
11+ use League \Flysystem \AwsS3V3 \AwsS3V3Adapter ;
1312use Magento \Framework \Exception \LocalizedException ;
1413use Magento \Framework \ObjectManagerInterface ;
15- use Magento \RemoteStorage \Driver \Cache \CacheFactory ;
14+ use Magento \RemoteStorage \Driver \Adapter \Cache \CacheInterfaceFactory ;
15+ use Magento \RemoteStorage \Driver \Adapter \CachedAdapterInterfaceFactory ;
16+ use Magento \RemoteStorage \Driver \Adapter \MetadataProviderInterfaceFactory ;
1617use Magento \RemoteStorage \Driver \DriverException ;
1718use Magento \RemoteStorage \Driver \DriverFactoryInterface ;
1819use Magento \RemoteStorage \Driver \RemoteDriverInterface ;
@@ -29,25 +30,52 @@ class AwsS3Factory implements DriverFactoryInterface
2930 private $ objectManager ;
3031
3132 /**
32- * @var CacheFactory
33+ * @var Config
3334 */
34- private $ cacheFactory ;
35+ private $ config ;
3536
3637 /**
37- * @var Config
38+ * @var MetadataProviderInterfaceFactory
3839 */
39- private $ config ;
40+ private $ metadataProviderFactory ;
41+
42+ /**
43+ * @var CacheInterfaceFactory
44+ */
45+ private $ cacheInterfaceFactory ;
46+
47+ /**
48+ * @var CachedAdapterInterfaceFactory
49+ */
50+ private $ cachedAdapterInterfaceFactory ;
51+
52+ /**
53+ * @var string|null
54+ */
55+ private $ cachePrefix ;
4056
4157 /**
4258 * @param ObjectManagerInterface $objectManager
43- * @param CacheFactory $cacheFactory
4459 * @param Config $config
60+ * @param MetadataProviderInterfaceFactory $metadataProviderFactory
61+ * @param CacheInterfaceFactory $cacheInterfaceFactory
62+ * @param CachedAdapterInterfaceFactory $cachedAdapterInterfaceFactory
63+ * @param string|null $cachePrefix
4564 */
46- public function __construct (ObjectManagerInterface $ objectManager , CacheFactory $ cacheFactory , Config $ config )
47- {
65+ public function __construct (
66+ ObjectManagerInterface $ objectManager ,
67+ Config $ config ,
68+ MetadataProviderInterfaceFactory $ metadataProviderFactory ,
69+ CacheInterfaceFactory $ cacheInterfaceFactory ,
70+ CachedAdapterInterfaceFactory $ cachedAdapterInterfaceFactory ,
71+ string $ cachePrefix = null
72+ ) {
4873 $ this ->objectManager = $ objectManager ;
49- $ this ->cacheFactory = $ cacheFactory ;
5074 $ this ->config = $ config ;
75+ $ this ->metadataProviderFactory = $ metadataProviderFactory ;
76+ $ this ->cacheInterfaceFactory = $ cacheInterfaceFactory ;
77+ $ this ->cachedAdapterInterfaceFactory = $ cachedAdapterInterfaceFactory ;
78+ $ this ->cachePrefix = $ cachePrefix ;
5179 }
5280
5381 /**
@@ -58,9 +86,7 @@ public function create(): RemoteDriverInterface
5886 try {
5987 return $ this ->createConfigured (
6088 $ this ->config ->getConfig (),
61- $ this ->config ->getPrefix (),
62- $ this ->config ->getCacheAdapter (),
63- $ this ->config ->getCacheConfig ()
89+ $ this ->config ->getPrefix ()
6490 );
6591 } catch (LocalizedException $ exception ) {
6692 throw new DriverException (__ ($ exception ->getMessage ()), $ exception );
@@ -73,8 +99,8 @@ public function create(): RemoteDriverInterface
7399 public function createConfigured (
74100 array $ config ,
75101 string $ prefix ,
76- string $ cacheAdapter ,
77- array $ cacheConfig
102+ string $ cacheAdapter = '' ,
103+ array $ cacheConfig = []
78104 ): RemoteDriverInterface {
79105 $ config ['version ' ] = 'latest ' ;
80106
@@ -91,16 +117,31 @@ public function createConfigured(
91117 }
92118
93119 $ client = new S3Client ($ config );
94- $ adapter = new AwsS3Adapter ($ client , $ config ['bucket ' ], $ prefix );
95-
120+ $ adapter = new AwsS3V3Adapter ($ client , $ config ['bucket ' ], $ prefix );
121+ $ cache = $ this ->cacheInterfaceFactory ->create (
122+ // Custom cache prefix required to distinguish cache records for different sources.
123+ // phpcs:ignore Magento2.Security.InsecureFunction
124+ $ this ->cachePrefix ? ['prefix ' => $ this ->cachePrefix ] : ['prefix ' => md5 ($ config ['bucket ' ] . $ prefix )]
125+ );
126+ $ metadataProvider = $ this ->metadataProviderFactory ->create (
127+ [
128+ 'adapter ' => $ adapter ,
129+ 'cache ' => $ cache
130+ ]
131+ );
132+ $ objectUrl = rtrim ($ client ->getObjectUrl ($ config ['bucket ' ], './ ' ), '/ ' ) . trim ($ prefix , '\\/ ' ) . '/ ' ;
96133 return $ this ->objectManager ->create (
97134 AwsS3::class,
98135 [
99- 'adapter ' => $ this ->objectManager ->create (CachedAdapter::class, [
100- 'adapter ' => $ adapter ,
101- 'cache ' => $ this ->cacheFactory ->create ($ cacheAdapter , $ cacheConfig )
102- ]),
103- 'objectUrl ' => $ client ->getObjectUrl ($ adapter ->getBucket (), $ adapter ->applyPathPrefix ('. ' ))
136+ 'adapter ' => $ this ->cachedAdapterInterfaceFactory ->create (
137+ [
138+ 'adapter ' => $ adapter ,
139+ 'cache ' => $ cache ,
140+ 'metadataProvider ' => $ metadataProvider
141+ ]
142+ ),
143+ 'objectUrl ' => $ objectUrl ,
144+ 'metadataProvider ' => $ metadataProvider ,
104145 ]
105146 );
106147 }
0 commit comments