Skip to content

Commit ae48e9b

Browse files
committed
bug #84 Web link 4.4 compat (weaverryan)
This PR was squashed before being merged into the master branch (closes #84). Discussion ---------- Web link 4.4 compat Fixes #83 Commits ------- 0a8472a Fixing 5.1 deprecation 1c55b32 php-cs addf9a5 Fixing compat with symfony/web-link 4.4 and own impl of Fig link
2 parents 8a5ba96 + 0a8472a commit ae48e9b

File tree

4 files changed

+56
-22
lines changed

4 files changed

+56
-22
lines changed

composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
"symfony/framework-bundle": "^3.4 || ^4.0 || ^5.0",
3333
"symfony/phpunit-bridge": "^4.3.5 || ^5.0",
3434
"symfony/twig-bundle": "^3.4 || ^4.0 || ^5.0",
35-
"symfony/web-link": "^3.4 || ^4.0 || ^5.0",
36-
"fig/link-util": "^1.0"
35+
"symfony/web-link": "^3.4 || ^4.0 || ^5.0"
3736
},
3837
"extra": {
3938
"thanks": {

src/EventListener/PreLoadAssetsEventListener.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99

1010
namespace Symfony\WebpackEncoreBundle\EventListener;
1111

12-
use Fig\Link\GenericLinkProvider;
13-
use Fig\Link\Link;
12+
use Fig\Link\GenericLinkProvider as FigGenericLinkProvider;
13+
use Fig\Link\Link as FigLink;
14+
use Symfony\Component\WebLink\GenericLinkProvider;
15+
use Symfony\Component\WebLink\Link;
1416
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1517
use Symfony\Component\HttpKernel\Event\ResponseEvent;
1618
use Symfony\WebpackEncoreBundle\Asset\TagRenderer;
@@ -39,16 +41,20 @@ public function onKernelResponse($event)
3941
$request = $event->getRequest();
4042

4143
if (null === $linkProvider = $request->attributes->get('_links')) {
42-
$request->attributes->set('_links', new GenericLinkProvider());
44+
$request->attributes->set(
45+
'_links',
46+
// For backwards-compat with symfony/web-link 4.3 and lower
47+
class_exists(GenericLinkProvider::class) ? new GenericLinkProvider() : new FigGenericLinkProvider()
48+
);
4349
}
4450

45-
/** @var GenericLinkProvider $linkProvider */
51+
/** @var GenericLinkProvider|FigGenericLinkProvider $linkProvider */
4652
$linkProvider = $request->attributes->get('_links');
4753
$defaultAttributes = $this->tagRenderer->getDefaultAttributes();
4854
$crossOrigin = $defaultAttributes['crossorigin'] ?? false;
4955

5056
foreach ($this->tagRenderer->getRenderedScripts() as $href) {
51-
$link = (new Link('preload', $href))->withAttribute('as', 'script');
57+
$link = ($this->createLink('preload', $href))->withAttribute('as', 'script');
5258

5359
if (false !== $crossOrigin) {
5460
$link = $link->withAttribute('crossorigin', $crossOrigin);
@@ -58,7 +64,7 @@ public function onKernelResponse($event)
5864
}
5965

6066
foreach ($this->tagRenderer->getRenderedStyles() as $href) {
61-
$link = (new Link('preload', $href))->withAttribute('as', 'style');
67+
$link = ($this->createLink('preload', $href))->withAttribute('as', 'style');
6268

6369
if (false !== $crossOrigin) {
6470
$link = $link->withAttribute('crossorigin', $crossOrigin);
@@ -77,4 +83,16 @@ public static function getSubscribedEvents()
7783
'kernel.response' => ['onKernelResponse', 50],
7884
];
7985
}
86+
87+
/**
88+
* For backwards-compat with symfony/web-link 4.3 and lower.
89+
*
90+
* @return Link|FigLink
91+
*/
92+
private function createLink(string $rel, string $href)
93+
{
94+
$class = class_exists(Link::class) ? Link::class : FigLink::class;
95+
96+
return new $class($rel, $href);
97+
}
8098
}

tests/EventListener/PreLoadAssetsEventListenerTest.php

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99

1010
namespace Symfony\WebpackEncoreBundle\Tests\Asset;
1111

12-
use Fig\Link\GenericLinkProvider;
13-
use Fig\Link\Link;
12+
use Fig\Link\GenericLinkProvider as FigGenericLinkProvider;
13+
use Fig\Link\Link as FigLink;
14+
use Symfony\Component\WebLink\GenericLinkProvider;
15+
use Symfony\Component\WebLink\Link;
1416
use PHPUnit\Framework\TestCase;
1517
use Symfony\Component\HttpFoundation\Request;
1618
use Symfony\Component\HttpFoundation\Response;
@@ -35,10 +37,12 @@ public function testItPreloadsAssets()
3537
$listener = new PreLoadAssetsEventListener($tagRenderer);
3638
$listener->onKernelResponse($event);
3739
$this->assertTrue($request->attributes->has('_links'));
38-
/** @var GenericLinkProvider $linkProvider */
40+
/** @var GenericLinkProvider|FigGenericLinkProvider $linkProvider */
3941
$linkProvider = $request->attributes->get('_links');
40-
$this->assertInstanceOf(GenericLinkProvider::class, $linkProvider);
41-
/** @var Link[] $links */
42+
43+
$expectedProviderClass = class_exists(GenericLinkProvider::class) ? GenericLinkProvider::class : FigGenericLinkProvider::class;
44+
$this->assertInstanceOf($expectedProviderClass, $linkProvider);
45+
/** @var Link[]|FigLink[] $links */
4246
$links = array_values($linkProvider->getLinks());
4347
$this->assertCount(2, $links);
4448
$this->assertSame('/file1.js', $links[0]->getHref());
@@ -58,14 +62,16 @@ public function testItReusesExistingLinkProvider()
5862
$tagRenderer->expects($this->once())->method('getRenderedStyles')->willReturn([]);
5963

6064
$request = new Request();
61-
$linkProvider = new GenericLinkProvider([new Link('preload', 'bar.js')]);
65+
$linkProviderClass = class_exists(GenericLinkProvider::class) ? GenericLinkProvider::class : FigGenericLinkProvider::class;
66+
$linkClass = class_exists(Link::class) ? Link::class : FigLink::class;
67+
$linkProvider = new $linkProviderClass([new $linkClass('preload', 'bar.js')]);
6268
$request->attributes->set('_links', $linkProvider);
6369

6470
$response = new Response();
6571
$event = $this->createResponseEvent($request, HttpKernelInterface::MASTER_REQUEST, $response);
6672
$listener = new PreLoadAssetsEventListener($tagRenderer);
6773
$listener->onKernelResponse($event);
68-
/** @var GenericLinkProvider $linkProvider */
74+
/** @var GenericLinkProvider|FigGenericLinkProvider $linkProvider */
6975
$linkProvider = $request->attributes->get('_links');
7076
$this->assertCount(2, $linkProvider->getLinks());
7177
}

tests/IntegrationTest.php

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
1515
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
1616
use Symfony\Bundle\TwigBundle\TwigBundle;
17-
use Symfony\Bundle\TwigBundle\Controller\ExceptionController;
1817
use Symfony\Component\Config\Loader\LoaderInterface;
1918
use Symfony\Component\DependencyInjection\Alias;
2019
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -23,6 +22,7 @@
2322
use Symfony\Component\HttpFoundation\Response;
2423
use Symfony\Component\HttpKernel\Kernel;
2524
use Symfony\Component\HttpKernel\Log\Logger;
25+
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
2626
use Symfony\Component\Routing\RouteCollectionBuilder;
2727
use Symfony\WebpackEncoreBundle\Asset\EntrypointLookupCollectionInterface;
2828
use Symfony\WebpackEncoreBundle\Asset\EntrypointLookupInterface;
@@ -178,7 +178,7 @@ public function testAutowireDefaultBuildArgument()
178178
}
179179
}
180180

181-
class WebpackEncoreIntegrationTestKernel extends Kernel
181+
abstract class AbstractWebpackEncoreIntegrationTestKernel extends Kernel
182182
{
183183
use MicroKernelTrait;
184184

@@ -204,11 +204,6 @@ public function registerBundles()
204204
];
205205
}
206206

207-
protected function configureRoutes(RouteCollectionBuilder $routes)
208-
{
209-
$routes->add('/foo', 'kernel:'.(parent::VERSION_ID >= 40100 ? ':' : '').'renderFoo');
210-
}
211-
212207
protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
213208
{
214209
$container->loadFromExtension('framework', [
@@ -269,6 +264,22 @@ public function renderFoo()
269264
}
270265
}
271266

267+
if (method_exists(AbstractWebpackEncoreIntegrationTestKernel::class, 'configureRouting')) {
268+
class WebpackEncoreIntegrationTestKernel extends AbstractWebpackEncoreIntegrationTestKernel {
269+
protected function configureRouting(RoutingConfigurator $routes): void
270+
{
271+
$routes->add('/foo', 'kernel:'.(parent::VERSION_ID >= 40100 ? ':' : '').'renderFoo');
272+
}
273+
}
274+
} else {
275+
class WebpackEncoreIntegrationTestKernel extends AbstractWebpackEncoreIntegrationTestKernel {
276+
protected function configureRoutes(RouteCollectionBuilder $routes)
277+
{
278+
$routes->add('/foo', 'kernel:'.(parent::VERSION_ID >= 40100 ? ':' : '').'renderFoo');
279+
}
280+
}
281+
}
282+
272283
class WebpackEncoreCacheWarmerTester
273284
{
274285
private $entrypointCacheWarmer;

0 commit comments

Comments
 (0)