Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7ddd8fb

Browse files
committed
feature #28875 [FWBundle] Add a new method AbstractController::addLink() (dunglas)
This PR was squashed before being merged into the 4.2-dev branch (closes #28875). Discussion ---------- [FWBundle] Add a new method AbstractController::addLink() | Q | A | ------------- | --- | Branch? | master | Bug fix? |no | New feature? | yes <!-- don't forget to update src/**/CHANGELOG.md files --> | BC breaks? | no <!-- see https://symfony.com/bc --> | Deprecations? | no <!-- don't forget to update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tests pass? | yes <!-- please add some, will be required by reviewers --> | Fixed tickets | n/a <!-- #-prefixed issue number(s), if any --> | License | MIT | Doc PR | todo This provides a convenient method to add `Link` headers to the current `Response` directly from the `Request` object. It improves the developer experience and the discoverability of [the WebLink component](symfony/symfony-docs#10309). Usage: ```php namespace App\Controller; use Fig\Link\Link; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class MyAction extends AbstractController { public function __invoke(Request $request): Response { $this->addLink($request, new Link('mercure', 'https://demo.mercure.rocks')); return $this->json(['foo' => 'bar']); } } ``` Commits ------- 4d20c39f70 [FWBundle] Add a new method AbstractController::addLink()
2 parents 837260c + 9c15e6f commit 7ddd8fb

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
4.2.0
55
-----
66

7+
* Added a `AbstractController::addLink()` method to add Link headers to the current response
78
* Allowed configuring taggable cache pools via a new `framework.cache.pools.tags` option (bool|service-id)
89
* Allowed configuring PDO-based cache pools via a new `cache.adapter.pdo` abstract service
910
* Deprecated auto-injection of the container in AbstractController instances, register them as service subscribers instead

Controller/ControllerTrait.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
namespace Symfony\Bundle\FrameworkBundle\Controller;
1313

1414
use Doctrine\Common\Persistence\ManagerRegistry;
15+
use Fig\Link\GenericLinkProvider;
16+
use Fig\Link\Link;
1517
use Psr\Container\ContainerInterface;
1618
use Symfony\Component\Form\Extension\Core\Type\FormType;
1719
use Symfony\Component\Form\FormBuilderInterface;
1820
use Symfony\Component\Form\FormInterface;
1921
use Symfony\Component\HttpFoundation\BinaryFileResponse;
2022
use Symfony\Component\HttpFoundation\JsonResponse;
2123
use Symfony\Component\HttpFoundation\RedirectResponse;
24+
use Symfony\Component\HttpFoundation\Request;
2225
use Symfony\Component\HttpFoundation\Response;
2326
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
2427
use Symfony\Component\HttpFoundation\StreamedResponse;
@@ -27,6 +30,7 @@
2730
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
2831
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
2932
use Symfony\Component\Security\Csrf\CsrfToken;
33+
use Symfony\Component\WebLink\EventListener\AddLinkHeaderListener;
3034

3135
/**
3236
* Common features needed in controllers.
@@ -398,4 +402,26 @@ protected function dispatchMessage($message)
398402

399403
return $this->container->get('message_bus')->dispatch($message);
400404
}
405+
406+
/**
407+
* Adds a Link HTTP header to the current response.
408+
*
409+
* @see https://tools.ietf.org/html/rfc5988
410+
*
411+
* @final
412+
*/
413+
protected function addLink(Request $request, Link $link)
414+
{
415+
if (!class_exists(AddLinkHeaderListener::class)) {
416+
throw new \LogicException('You can not use the "addLink" method if the WebLink component is not available. Try running "composer require symfony/web-link".');
417+
}
418+
419+
if (null === $linkProvider = $request->attributes->get('_links')) {
420+
$request->attributes->set('_links', new GenericLinkProvider(array($link)));
421+
422+
return;
423+
}
424+
425+
$request->attributes->set('_links', $linkProvider->withLink($link));
426+
}
401427
}

Tests/Controller/ControllerTraitTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\Tests\Controller;
1313

14+
use Fig\Link\Link;
1415
use Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait;
1516
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
1617
use Symfony\Component\DependencyInjection\Container;
@@ -528,6 +529,21 @@ public function testGetDoctrine()
528529

529530
$this->assertEquals($doctrine, $controller->getDoctrine());
530531
}
532+
533+
public function testAddLink()
534+
{
535+
$request = new Request();
536+
$link1 = new Link('mercure', 'https://demo.mercure.rocks');
537+
$link2 = new Link('self', 'https://example.com/foo');
538+
539+
$controller = $this->createController();
540+
$controller->addLink($request, $link1);
541+
$controller->addLink($request, $link2);
542+
543+
$links = $request->attributes->get('_links')->getLinks();
544+
$this->assertContains($link1, $links);
545+
$this->assertContains($link2, $links);
546+
}
531547
}
532548

533549
trait TestControllerTrait
@@ -552,5 +568,6 @@ trait TestControllerTrait
552568
createForm as public;
553569
createFormBuilder as public;
554570
getDoctrine as public;
571+
addLink as public;
555572
}
556573
}

0 commit comments

Comments
 (0)