Skip to content

Commit 4d93b7b

Browse files
authored
Merge pull request #200 from sumocoders/374-twig-extension-attributes
374 Twig Extension Attributes
2 parents 3b9c5aa + 5469c18 commit 4d93b7b

File tree

5 files changed

+61
-95
lines changed

5 files changed

+61
-95
lines changed

config/services.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
1717
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
1818
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
19-
use SumoCoders\FrameworkCoreBundle\Twig\PaginatorRuntime;
2019
use SumoCoders\FrameworkCoreBundle\Twig\PaginatorExtension;
2120
use SumoCoders\FrameworkCoreBundle\Twig\FrameworkExtension;
2221
use SumoCoders\FrameworkCoreBundle\Service\BreadcrumbTrail;
@@ -102,16 +101,13 @@
102101
* Twig extensions
103102
*/
104103
->set('framework.framework_extension', FrameworkExtension::class)
105-
->tag('twig.extension')
104+
->tag('twig.attribute_extension')
106105

107106
->set('framework.paginator_extension', PaginatorExtension::class)
108-
->tag('twig.extension')
109-
110-
->set('framework.paginator_runtime', PaginatorRuntime::class)
111-
->tag('twig.runtime')
107+
->tag('twig.attribute_extension')
112108

113109
->set('framework.content_extension', ContentExtension::class)
114-
->tag('twig.extension')
110+
->tag('twig.attribute_extension')
115111

116112
/*
117113
* Breadcrumbs

src/Twig/ContentExtension.php

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,21 @@
33
namespace SumoCoders\FrameworkCoreBundle\Twig;
44

55
use Symfony\Component\DependencyInjection\Attribute\Autowire;
6-
use Twig\Extension\AbstractExtension;
7-
use Twig\TwigFunction;
6+
use Symfony\Component\Filesystem\Filesystem;
7+
use Twig\Attribute\AsTwigFunction;
88

9-
class ContentExtension extends AbstractExtension
9+
readonly class ContentExtension
1010
{
1111
public function __construct(
1212
#[Autowire('%kernel.project_dir%/public')]
13-
private string $publicFolder
13+
private string $publicFolder,
14+
private Filesystem $filesystem
1415
) {
1516
}
1617

17-
public function getFunctions(): array
18-
{
19-
return [
20-
new TwigFunction('content', [$this, 'getContent'], ['is_safe' => ['html']]),
21-
];
22-
}
23-
18+
#[AsTwigFunction('content', isSafe: ['html'])]
2419
public function getContent(string $path): string
2520
{
26-
return file_get_contents($this->publicFolder . $path);
21+
return $this->filesystem->readFile($this->publicFolder . $path);
2722
}
2823
}

src/Twig/FrameworkExtension.php

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,22 @@
33
namespace SumoCoders\FrameworkCoreBundle\Twig;
44

55
use Symfony\Component\HttpFoundation\RequestStack;
6-
use Twig\Extension\AbstractExtension;
7-
use Twig\TwigFilter;
8-
use Twig\TwigFunction;
6+
use Twig\Attribute\AsTwigFilter;
7+
use Twig\Attribute\AsTwigFunction;
98

10-
class FrameworkExtension extends AbstractExtension
9+
readonly class FrameworkExtension
1110
{
1211
public function __construct(private RequestStack $requestStack)
1312
{
14-
$this->requestStack = $requestStack;
1513
}
1614

17-
public function getFilters(): array
15+
#[AsTwigFilter('ucfirst')]
16+
public static function ucfirst(string $string): string
1817
{
19-
return [
20-
new TwigFilter('ucfirst', 'ucfirst'),
21-
];
22-
}
23-
24-
public function getFunctions(): array
25-
{
26-
return [
27-
new TwigFunction('theme', [$this, 'determineTheme']),
28-
new TwigFunction('sidebarIsOpen', [$this, 'sidebarIsOpen']),
29-
];
18+
return ucfirst($string);
3019
}
3120

21+
#[AsTwigFunction('theme')]
3222
public function determineTheme(): string
3323
{
3424
if (is_null($this->requestStack->getCurrentRequest())) {
@@ -42,6 +32,7 @@ public function determineTheme(): string
4232
return 'theme-' . $this->requestStack->getCurrentRequest()->cookies->get('theme');
4333
}
4434

35+
#[AsTwigFunction('sidebarIsOpen')]
4536
public function sidebarIsOpen(): bool
4637
{
4738
if (is_null($this->requestStack->getCurrentRequest())) {

src/Twig/PaginatorExtension.php

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,51 @@
22

33
namespace SumoCoders\FrameworkCoreBundle\Twig;
44

5-
use Twig\Extension\AbstractExtension;
6-
use Twig\TwigFunction;
5+
use SumoCoders\FrameworkCoreBundle\Pagination\Paginator;
6+
use Symfony\Component\HttpFoundation\Request;
7+
use Symfony\Component\HttpFoundation\RequestStack;
8+
use Twig\Attribute\AsTwigFunction;
9+
use Twig\Environment;
710

8-
final class PaginatorExtension extends AbstractExtension
11+
readonly class PaginatorExtension
912
{
10-
public function getFunctions(): array
13+
public function __construct(
14+
private RequestStack $requestStack,
15+
) {
16+
}
17+
18+
#[AsTwigFunction('pagination', needsEnvironment: true, isSafe: ['html'])]
19+
public function renderPagination(Environment $env, Paginator $paginator): string
20+
{
21+
$request = $this->getRequest();
22+
23+
if (null !== $this->requestStack->getParentRequest()) {
24+
throw new \RuntimeException('We can not guess the route when used in a sub-request');
25+
}
26+
27+
$route = $request->attributes->get('_route');
28+
29+
// Make sure we read the route parameters from the passed option array
30+
$routeParams = array_merge($request->query->all(), $request->attributes->get('_route_params', []));
31+
32+
$paginator->calculateStartAndEndPage();
33+
34+
return $env->load('@SumoCodersFrameworkCore/Twig/pagination.html.twig')->renderBlock(
35+
'pager',
36+
[
37+
'paginator' => $paginator,
38+
'route' => $route,
39+
'routeParams' => $routeParams,
40+
'current_page' => $paginator->getCurrentPage(),
41+
'start_page' => $paginator->getStartPage(),
42+
'end_page' => $paginator->getEndPage(),
43+
'page_count' => $paginator->getNumberOfPages(),
44+
]
45+
);
46+
}
47+
48+
private function getRequest(): ?Request
1149
{
12-
return [
13-
new TwigFunction('pagination', [PaginatorRuntime::class, 'renderPagination'], ['is_safe' => ['html']]),
14-
];
50+
return $this->requestStack->getCurrentRequest();
1551
}
1652
}

src/Twig/PaginatorRuntime.php

Lines changed: 0 additions & 52 deletions
This file was deleted.

0 commit comments

Comments
 (0)