Added Twig template functions
parent
bb3d16d273
commit
df6360044b
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Config\Config as EngelsystemConfig;
|
||||||
|
use Twig_Extension as TwigExtension;
|
||||||
|
use Twig_Function as TwigFunction;
|
||||||
|
|
||||||
|
class Config extends TwigExtension
|
||||||
|
{
|
||||||
|
/** @var EngelsystemConfig */
|
||||||
|
protected $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param EngelsystemConfig $config
|
||||||
|
*/
|
||||||
|
public function __construct(EngelsystemConfig $config)
|
||||||
|
{
|
||||||
|
$this->config = $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return TwigFunction[]
|
||||||
|
*/
|
||||||
|
public function getFunctions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new TwigFunction('config', [$this->config, 'get']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Twig_Extension as TwigExtension;
|
||||||
|
use Twig_Extension_GlobalsInterface as GlobalsInterface;
|
||||||
|
|
||||||
|
class Globals extends TwigExtension implements GlobalsInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns a list of global variables to add to the existing list.
|
||||||
|
*
|
||||||
|
* @return array An array of global variables
|
||||||
|
*/
|
||||||
|
public function getGlobals()
|
||||||
|
{
|
||||||
|
global $user;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'user' => isset($user) ? $user : [],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\Session\Session as SymfonySession;
|
||||||
|
use Twig_Extension as TwigExtension;
|
||||||
|
use Twig_Function as TwigFunction;
|
||||||
|
|
||||||
|
class Session extends TwigExtension
|
||||||
|
{
|
||||||
|
/** @var SymfonySession */
|
||||||
|
protected $session;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SymfonySession $session
|
||||||
|
*/
|
||||||
|
public function __construct(SymfonySession $session)
|
||||||
|
{
|
||||||
|
$this->session = $session;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return TwigFunction[]
|
||||||
|
*/
|
||||||
|
public function getFunctions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new TwigFunction('session_get', [$this->session, 'get']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Http\UrlGenerator;
|
||||||
|
use Twig_Extension as TwigExtension;
|
||||||
|
use Twig_Function as TwigFunction;
|
||||||
|
|
||||||
|
class Url extends TwigExtension
|
||||||
|
{
|
||||||
|
/** @var UrlGenerator */
|
||||||
|
protected $urlGenerator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param UrlGenerator $urlGenerator
|
||||||
|
*/
|
||||||
|
public function __construct(UrlGenerator $urlGenerator)
|
||||||
|
{
|
||||||
|
$this->urlGenerator = $urlGenerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return TwigFunction[]
|
||||||
|
*/
|
||||||
|
public function getFunctions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
new TwigFunction('url', [$this, 'getUrl']),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $path
|
||||||
|
* @param array $parameters
|
||||||
|
* @return UrlGenerator|string
|
||||||
|
*/
|
||||||
|
public function getUrl($path, $parameters = [])
|
||||||
|
{
|
||||||
|
$path = str_replace('_', '-', $path);
|
||||||
|
|
||||||
|
return $this->urlGenerator->to($path, $parameters);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Config\Config as EngelsystemConfig;
|
||||||
|
use Engelsystem\Renderer\Twig\Extensions\Config;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
|
class ConfigTest extends ExtensionTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Config::__construct
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Config::getFunctions
|
||||||
|
*/
|
||||||
|
public function testGetFunctions()
|
||||||
|
{
|
||||||
|
/** @var EngelsystemConfig|MockObject $config */
|
||||||
|
$config = $this->createMock(EngelsystemConfig::class);
|
||||||
|
|
||||||
|
$extension = new Config($config);
|
||||||
|
$functions = $extension->getFunctions();
|
||||||
|
|
||||||
|
$this->assertExtensionExists('config', [$config, 'get'], $functions);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Twig_Function as TwigFunction;
|
||||||
|
|
||||||
|
abstract class ExtensionTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Assert that a twig function was registered
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param callable $callback
|
||||||
|
* @param TwigFunction[] $functions
|
||||||
|
*/
|
||||||
|
protected function assertExtensionExists($name, $callback, $functions)
|
||||||
|
{
|
||||||
|
foreach ($functions as $function) {
|
||||||
|
if ($function->getName() != $name) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertEquals($callback, $function->getCallable());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fail(sprintf('Function %s not found', $name));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that a global exists
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param mixed $value
|
||||||
|
* @param mixed[] $globals
|
||||||
|
*/
|
||||||
|
protected function assertGlobalsExists($name, $value, $globals)
|
||||||
|
{
|
||||||
|
if (isset($globals[$name])) {
|
||||||
|
$this->assertArraySubset([$name => $value], $globals);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->fail(sprintf('Global %s not found', $name));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Renderer\Twig\Extensions\Globals;
|
||||||
|
|
||||||
|
class GlobalsTest extends ExtensionTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Globals::getGlobals
|
||||||
|
*/
|
||||||
|
public function testGetGlobals()
|
||||||
|
{
|
||||||
|
$extension = new Globals();
|
||||||
|
$globals = $extension->getGlobals();
|
||||||
|
|
||||||
|
$this->assertGlobalsExists('user', [], $globals);
|
||||||
|
|
||||||
|
global $user;
|
||||||
|
$user['foo'] = 'bar';
|
||||||
|
|
||||||
|
$globals = $extension->getGlobals();
|
||||||
|
$this->assertGlobalsExists('user', ['foo' => 'bar'], $globals);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Renderer\Twig\Extensions\Session;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
use Symfony\Component\HttpFoundation\Session\Session as SymfonySession;
|
||||||
|
|
||||||
|
class SessionTest extends ExtensionTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Session::__construct
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Session::getFunctions
|
||||||
|
*/
|
||||||
|
public function testGetGlobals()
|
||||||
|
{
|
||||||
|
/** @var SymfonySession|MockObject $session */
|
||||||
|
$session = $this->createMock(SymfonySession::class);
|
||||||
|
|
||||||
|
$extension = new Session($session);
|
||||||
|
$functions = $extension->getFunctions();
|
||||||
|
|
||||||
|
$this->assertExtensionExists('session_get', [$session, 'get'], $functions);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Renderer\Twig\Extensions;
|
||||||
|
|
||||||
|
use Engelsystem\Http\UrlGenerator;
|
||||||
|
use Engelsystem\Renderer\Twig\Extensions\Url;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
|
class UrlTest extends ExtensionTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Url::__construct
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Url::getFunctions
|
||||||
|
*/
|
||||||
|
public function testGetGlobals()
|
||||||
|
{
|
||||||
|
/** @var UrlGenerator|MockObject $urlGenerator */
|
||||||
|
$urlGenerator = $this->createMock(UrlGenerator::class);
|
||||||
|
|
||||||
|
$extension = new Url($urlGenerator);
|
||||||
|
$functions = $extension->getFunctions();
|
||||||
|
|
||||||
|
$this->assertExtensionExists('url', [$extension, 'getUrl'], $functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string[][]
|
||||||
|
*/
|
||||||
|
public function getUrls()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['/', '/', 'http://foo.bar/'],
|
||||||
|
['/foo', '/foo', 'http://foo.bar/foo'],
|
||||||
|
['foo_bar', 'foo-bar', 'http://foo.bar/foo-bar'],
|
||||||
|
['dolor', 'dolor', 'http://foo.bar/dolor?lorem_ipsum=dolor', ['lorem_ipsum' => 'dolor']],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getUrls
|
||||||
|
*
|
||||||
|
* @param string $url
|
||||||
|
* @param string $return
|
||||||
|
* @param string $urlTo
|
||||||
|
* @param array $parameters
|
||||||
|
*
|
||||||
|
* @covers \Engelsystem\Renderer\Twig\Extensions\Url::getUrl
|
||||||
|
*/
|
||||||
|
public function testGetUrl($url, $urlTo, $return, $parameters = [])
|
||||||
|
{
|
||||||
|
/** @var UrlGenerator|MockObject $urlGenerator */
|
||||||
|
$urlGenerator = $this->createMock(UrlGenerator::class);
|
||||||
|
|
||||||
|
$urlGenerator->expects($this->once())
|
||||||
|
->method('to')
|
||||||
|
->with($urlTo, $parameters)
|
||||||
|
->willReturn($return);
|
||||||
|
|
||||||
|
$extension = new Url($urlGenerator);
|
||||||
|
$generatedUrl = $extension->getUrl($url, $parameters);
|
||||||
|
|
||||||
|
$this->assertEquals($return, $generatedUrl);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue