1313 */
1414
1515use B13 \Assetcollector \AssetCollector ;
16- use TYPO3 \CMS \Core \Information \Typo3Version ;
16+ use Psr \Http \Message \ServerRequestInterface ;
17+ use Symfony \Component \DependencyInjection \Attribute \Autoconfigure ;
18+ use TYPO3 \CMS \Core \Cache \CacheDataCollector ;
19+ use TYPO3 \CMS \Core \Cache \CacheTag ;
20+ use TYPO3 \CMS \Core \Cache \Frontend \FrontendInterface ;
21+ use TYPO3 \CMS \Core \Http \ApplicationType ;
1722use TYPO3 \CMS \Core \Page \PageRenderer ;
18- use TYPO3 \CMS \Core \SingletonInterface ;
19- use TYPO3 \CMS \Core \Utility \GeneralUtility ;
20- use TYPO3 \CMS \Frontend \Controller \TypoScriptFrontendController ;
23+ use TYPO3 \CMS \Frontend \Page \PageInformation ;
2124
2225/**
2326 * Hooks into PageRenderer to add CSS / JS / SVG files
3639 * With COA_INT 2nd hit
3740 * 1. insertAssets() - taking data from the cache PLUS all the the assets added via USER_INTs
3841 */
39- class AssetRenderer implements SingletonInterface
42+ #[Autoconfigure(public: true )]
43+ class AssetRenderer
4044{
45+ public function __construct (private readonly FrontendInterface $ cache , private readonly AssetCollector $ assetCollector )
46+ {
47+ }
48+
4149 /**
4250 * Called via PageRenderer->render-postProcess(). Get this:
4351 *
@@ -55,37 +63,35 @@ class AssetRenderer implements SingletonInterface
5563 */
5664 public function insertAssets ($ params , PageRenderer $ pageRenderer ): void
5765 {
58- $ frontendController = $ this ->getTypoScriptFrontendController ();
59- if ($ frontendController instanceof TypoScriptFrontendController) {
60- $ assetCollector = GeneralUtility::makeInstance (AssetCollector::class);
61- $ cached = $ this ->getFromCached ($ frontendController );
66+ $ request = $ this ->getServerRequest ();
67+ if (ApplicationType::fromRequest ($ this ->getServerRequest ())->isFrontend () === false ) {
68+ return ;
69+ }
70+ if ($ request !== null ) {
71+ $ cached = $ this ->getFromCached ($ request );
6272 if (!empty ($ cached ['cssFiles ' ]) && is_array ($ cached ['cssFiles ' ])) {
63- $ assetCollector ->mergeCssFiles ($ cached ['cssFiles ' ]);
73+ $ this -> assetCollector ->mergeCssFiles ($ cached ['cssFiles ' ]);
6474 }
6575 if (!empty ($ cached ['inlineCss ' ]) && is_array ($ cached ['inlineCss ' ])) {
66- $ assetCollector ->mergeInlineCss ($ cached ['inlineCss ' ]);
76+ $ this -> assetCollector ->mergeInlineCss ($ cached ['inlineCss ' ]);
6777 }
6878 if (!empty ($ cached ['jsFiles ' ]) && is_array ($ cached ['jsFiles ' ])) {
6979 foreach ($ cached ['jsFiles ' ] as $ data ) {
70- $ assetCollector ->addJavaScriptFile ($ data ['fileName ' ], $ data ['additionalAttributes ' ]);
71- }
72- }
73- // Add individual registered JS files. Only relevant on first hit, fully cacheable
74- // when the cache is not accessed yet.
75- foreach ($ frontendController ->pSetup ['jsFiles. ' ] ?? [] as $ key => $ jsFile ) {
76- if (is_array ($ jsFile )) {
77- continue ;
80+ $ this ->assetCollector ->addJavaScriptFile ($ data ['fileName ' ], $ data ['additionalAttributes ' ]);
7881 }
79- $ additionalAttributes = $ frontendController ->pSetup ['jsFiles. ' ][$ key . '. ' ] ?? [];
80- $ assetCollector ->addJavaScriptFile ($ jsFile , $ additionalAttributes );
8182 }
8283 $ params ['headerData ' ] = array_merge (
8384 $ params ['headerData ' ],
84- [$ assetCollector ->buildInlineCssTag (), $ assetCollector ->buildJavaScriptIncludes ()]
85+ [$ this -> assetCollector ->buildInlineCssTag (), $ this -> assetCollector ->buildJavaScriptIncludes ()]
8586 );
8687 }
8788 }
8889
90+ protected function getServerRequest (): ?ServerRequestInterface
91+ {
92+ return $ GLOBALS ['TYPO3_REQUEST ' ] ?? null ;
93+ }
94+
8995 /**
9096 * Called via contentPostProc-all hook.
9197 *
@@ -101,61 +107,52 @@ public function insertAssets($params, PageRenderer $pageRenderer): void
101107 * If the page is fully cacheable the hook is not called on a "cached hit".
102108 *
103109 * Then, the full information is again stored in the "b13/assetcollector" bucket.
104- *
105- * @param array $params
106- * @param TypoScriptFrontendController $frontendController
107110 */
108- public function collectInlineAssets ($ params , TypoScriptFrontendController $ frontendController ): void
111+ public function collectInlineAssets (ServerRequestInterface $ serverRequest ): void
109112 {
110- $ assetCollector = GeneralUtility::makeInstance (AssetCollector::class);
111- $ cached = $ this ->getFromCached ($ frontendController );
112-
113- // Add individual registered JS files
114- foreach ($ frontendController ->pSetup ['jsFiles. ' ] ?? [] as $ key => $ jsFile ) {
115- if (is_array ($ jsFile )) {
116- continue ;
117- }
118- $ additionalAttributes = $ frontendController ->pSetup ['jsFiles. ' ][$ key . '. ' ] ?? [];
119- $ assetCollector ->addJavaScriptFile ($ jsFile , $ additionalAttributes );
120- }
113+ $ cached = $ this ->getFromCached ($ serverRequest );
121114 if (!empty ($ cached ['jsFiles ' ]) && is_array ($ cached ['jsFiles ' ])) {
122115 foreach ($ cached ['jsFiles ' ] as $ data ) {
123- $ assetCollector ->addJavaScriptFile ($ data ['fileName ' ], $ data ['additionalAttributes ' ]);
116+ $ this -> assetCollector ->addJavaScriptFile ($ data ['fileName ' ], $ data ['additionalAttributes ' ]);
124117 }
125118 }
126119 if (!empty ($ cached ['cssFiles ' ]) && is_array ($ cached ['cssFiles ' ])) {
127- $ assetCollector ->mergeCssFiles ($ cached ['cssFiles ' ]);
120+ $ this -> assetCollector ->mergeCssFiles ($ cached ['cssFiles ' ]);
128121 }
129122 if (!empty ($ cached ['inlineCss ' ]) && is_array ($ cached ['inlineCss ' ])) {
130- $ assetCollector ->mergeInlineCss ($ cached ['inlineCss ' ]);
123+ $ this -> assetCollector ->mergeInlineCss ($ cached ['inlineCss ' ]);
131124 }
132125 if (!empty ($ cached ['xmlFiles ' ]) && is_array ($ cached ['xmlFiles ' ])) {
133- $ assetCollector ->mergeXmlFiles ($ cached ['xmlFiles ' ]);
126+ $ this -> assetCollector ->mergeXmlFiles ($ cached ['xmlFiles ' ]);
134127 }
135128 $ cached = [
136- 'jsFiles ' => $ assetCollector ->getJavaScriptFiles (),
137- 'cssFiles ' => $ assetCollector ->getUniqueCssFiles (),
138- 'inlineCss ' => $ assetCollector ->getUniqueInlineCss (),
139- 'xmlFiles ' => $ assetCollector ->getUniqueXmlFiles (),
129+ 'jsFiles ' => $ this -> assetCollector ->getJavaScriptFiles (),
130+ 'cssFiles ' => $ this -> assetCollector ->getUniqueCssFiles (),
131+ 'inlineCss ' => $ this -> assetCollector ->getUniqueInlineCss (),
132+ 'xmlFiles ' => $ this -> assetCollector ->getUniqueXmlFiles (),
140133 ];
141- $ this ->addToCached ($ frontendController , $ cached );
134+ $ this ->addToCached ($ serverRequest , $ cached );
142135 }
143136
144- protected function getFromCached (TypoScriptFrontendController $ frontendController ): array
137+ protected function getFromCached (ServerRequestInterface $ request ): array
145138 {
146- if ((GeneralUtility::makeInstance (Typo3Version::class))->getMajorVersion () < 13 ) {
147- return $ frontendController ->config ['b13/assetcollector ' ] ?? [];
139+ /** @var CacheDataCollector $cacheDataCollector */
140+ $ cacheDataCollector = $ request ->getAttribute ('frontend.cache.collector ' );
141+ $ identifier = $ cacheDataCollector ->getPageCacheIdentifier ();
142+ if ($ this ->cache ->has ($ identifier )) {
143+ return $ this ->cache ->get ($ identifier );
148144 }
149- return $ frontendController -> config [ ' INTincScript_ext ' ][ ' b13/assetcollector ' ] ?? [];
145+ return [];
150146 }
151147
152- protected function addToCached (TypoScriptFrontendController $ frontendController , array $ data ): void
148+ protected function addToCached (ServerRequestInterface $ request , array $ data ): void
153149 {
154- if ((GeneralUtility::makeInstance (Typo3Version::class))->getMajorVersion () < 13 ) {
155- $ frontendController ->config ['b13/assetcollector ' ] = $ data ;
156- } else {
157- $ frontendController ->config ['INTincScript_ext ' ]['b13/assetcollector ' ] = $ data ;
158- }
150+ /** @var CacheDataCollector $cacheDataCollector */
151+ $ cacheDataCollector = $ request ->getAttribute ('frontend.cache.collector ' );
152+ $ identifier = $ cacheDataCollector ->getPageCacheIdentifier ();
153+ $ cacheTags = array_map (fn (CacheTag $ cacheTag ) => $ cacheTag ->name , $ cacheDataCollector ->getCacheTags ());
154+ $ cacheTimeout = $ cacheDataCollector ->resolveLifetime ();
155+ $ this ->cache ->set ($ identifier , $ data , $ cacheTags , $ cacheTimeout );
159156 }
160157
161158 /**
@@ -167,17 +164,8 @@ protected function addToCached(TypoScriptFrontendController $frontendController,
167164 */
168165 public function collectCssFiles ($ params , PageRenderer $ pageRenderer ): void
169166 {
170- $ assetCollector = GeneralUtility::makeInstance (AssetCollector::class);
171- foreach ($ assetCollector ->getExternalCssFiles () as $ cssFile ) {
167+ foreach ($ this ->assetCollector ->getExternalCssFiles () as $ cssFile ) {
172168 $ pageRenderer ->addCssFile ($ cssFile ['fileName ' ], 'stylesheet ' , $ cssFile ['mediaType ' ], '' , false , false , '' , true );
173169 }
174170 }
175-
176- protected function getTypoScriptFrontendController (): ?TypoScriptFrontendController
177- {
178- if (($ GLOBALS ['TSFE ' ] ?? null ) instanceof TypoScriptFrontendController) {
179- return $ GLOBALS ['TSFE ' ];
180- }
181- return null ;
182- }
183171}
0 commit comments