Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Basster/b80dbc6bec86b5409c18b8e18b0f89c5 to your computer and use it in GitHub Desktop.
Save Basster/b80dbc6bec86b5409c18b8e18b0f89c5 to your computer and use it in GitHub Desktop.
Let QafooLabsNoFrameworkBundle and FrameworkExtraBundle play nicely together
<?php
declare(strict_types=1);
namespace DI\View;
use QafooLabs\Bundle\NoFrameworkBundle\View\TemplateGuesser;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Class SymfonyConventionsTemplateGuesser
*
* @package View
*/
class SymfonyConventionsExtraBundleInteropTemplateGuesser implements TemplateGuesser
{
/** @var TemplateGuesser */
private $templateGuesser;
/** @var \Symfony\Component\HttpFoundation\RequestStack */
private $requestStack;
/**
* SymfonyConventionsTemplateGuesser constructor.
*
* @param TemplateGuesser $templateGuesser
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
*/
public function __construct(
TemplateGuesser $templateGuesser,
RequestStack $requestStack
) {
$this->templateGuesser = $templateGuesser;
$this->requestStack = $requestStack;
}
/** @inheritdoc */
public function guessControllerTemplateName($controller, $actionName, $format, $engine): string
{
$currentRequest = $this->requestStack->getCurrentRequest();
$template = null;
if ($currentRequest->attributes->has('_template')) {
$templateAttr = $currentRequest->attributes->get('_template');
if ($templateAttr instanceof Template) {
$template = (string)$templateAttr->getTemplate();
}
}
return $template ?:
$this->templateGuesser->guessControllerTemplateName(
$controller,
$actionName,
$format,
$engine
);
}
}
<?php
declare(strict_types=1);
namespace Tests\DI\View;
use DI\View\SymfonyConventionsExtraBundleInteropTemplateGuesser;
use PHPUnit\Framework\TestCase;
use QafooLabs\Bundle\NoFrameworkBundle\View\TemplateGuesser;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class SymfonyConventionsExtraBundleInteropTemplateGuesserTest extends TestCase
{
const ACTION = 'barAction';
const CONTROLLER = 'Foo';
const ENGINE = 'twig';
const FORMAT = 'html';
const TEMPLATE = '<my-template>';
/**
* @test
* @dataProvider provideNonHandlingRequests
*/
public function delegateOnRequestsWithoutTemplateAttribute(Request $request): void
{
$requestStack = new RequestStack;
$requestStack->push($request);
$delegate = $this->prophesize(TemplateGuesser::class);
$delegate->guessControllerTemplateName(self::CONTROLLER, self::ACTION, self::FORMAT, self::ENGINE)
->shouldBeCalled()
->willReturn(self::TEMPLATE)
;
$guesser = new SymfonyConventionsExtraBundleInteropTemplateGuesser($delegate->reveal(), $requestStack);
self::assertEquals(
self::TEMPLATE,
$guesser->guessControllerTemplateName(self::CONTROLLER, self::ACTION, self::FORMAT, self::ENGINE)
);
}
/**
* @test
*/
public function returnTemplateAttributesTemplateWhenGiven(): void
{
$templateConfig = $this->prophesize(Template::class);
$request = new Request;
$request->attributes->set('_template', $templateConfig->reveal());
$templateConfig->getTemplate()
->shouldBeCalled()
->willReturn(self::TEMPLATE)
;
$requestStack = new RequestStack;
$requestStack->push($request);
$delegate = $this->prophesize(TemplateGuesser::class);
$delegate->guessControllerTemplateName()
->shouldNotBeCalled()
;
$guesser = new SymfonyConventionsExtraBundleInteropTemplateGuesser($delegate->reveal(), $requestStack);
self::assertEquals(
self::TEMPLATE,
$guesser->guessControllerTemplateName(self::CONTROLLER, self::ACTION, self::FORMAT, self::ENGINE)
);
}
public function provideNonHandlingRequests(): array
{
$faultyAttributeRequest = new Request;
$faultyAttributeRequest->attributes->set('_template', 'foobar');
return [
'simple request' => [new Request],
'request with incompatible template attribute' => [$faultyAttributeRequest],
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment