Last active
May 5, 2017 11:44
-
-
Save Basster/b80dbc6bec86b5409c18b8e18b0f89c5 to your computer and use it in GitHub Desktop.
Let QafooLabsNoFrameworkBundle and FrameworkExtraBundle play nicely together
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 | |
); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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