Skip to content

Commit

Permalink
Make twig extensions lazy
Browse files Browse the repository at this point in the history
  • Loading branch information
core23 committed Sep 10, 2021
1 parent ff8faba commit 717ae24
Show file tree
Hide file tree
Showing 12 changed files with 196 additions and 138 deletions.
8 changes: 4 additions & 4 deletions src/DependencyInjection/NucleosUserAdminExtension.php
Expand Up @@ -13,8 +13,8 @@

namespace Nucleos\UserAdminBundle\DependencyInjection;

use Nucleos\UserAdminBundle\Twig\AvatarExtension;
use Nucleos\UserAdminBundle\Twig\ImpersonateExtension;
use Nucleos\UserAdminBundle\Twig\AvatarRuntime;
use Nucleos\UserAdminBundle\Twig\ImpersonateRuntime;
use RuntimeException;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\Config\FileLocator;
Expand Down Expand Up @@ -74,7 +74,7 @@ public function load(array $configs, ContainerBuilder $container): void
$loader->load('impersonating.php');

if (false !== $config['impersonating']) {
$container->getDefinition(ImpersonateExtension::class)
$container->getDefinition(ImpersonateRuntime::class)
->replaceArgument(1, $config['impersonating']['route'])
->replaceArgument(2, $config['impersonating']['parameters'])
;
Expand All @@ -83,7 +83,7 @@ public function load(array $configs, ContainerBuilder $container): void

private function configureAvatar(array $config, ContainerBuilder $container): void
{
$container->getDefinition(AvatarExtension::class)
$container->getDefinition(AvatarRuntime::class)
->replaceArgument(1, $config['avatar']['resolver'])
;
$container->setParameter('nucleos_user_admin.default_avatar', $config['avatar']['default_avatar']);
Expand Down
4 changes: 4 additions & 0 deletions src/Resources/config/admin.php
Expand Up @@ -18,6 +18,7 @@
use Nucleos\UserAdminBundle\Security\RolesBuilder\MatrixRolesBuilder;
use Nucleos\UserAdminBundle\Security\RolesBuilder\SecurityRolesBuilder;
use Nucleos\UserAdminBundle\Twig\RolesMatrixExtension;
use Nucleos\UserAdminBundle\Twig\RolesMatrixRuntime;

return static function (ContainerConfigurator $container): void {
$container->services()
Expand Down Expand Up @@ -72,6 +73,9 @@

->set(RolesMatrixExtension::class)
->tag('twig.extension')

->set(RolesMatrixRuntime::class)
->tag('twig.runtime')
->args([
ref('nucleos_user_admin.matrix_roles_builder'),
])
Expand Down
4 changes: 4 additions & 0 deletions src/Resources/config/avatar.php
Expand Up @@ -14,12 +14,16 @@
use Nucleos\UserAdminBundle\Avatar\AvatarResolver;
use Nucleos\UserAdminBundle\Avatar\StaticAvatarResolver;
use Nucleos\UserAdminBundle\Twig\AvatarExtension;
use Nucleos\UserAdminBundle\Twig\AvatarRuntime;

return static function (ContainerConfigurator $container): void {
$container->services()

->set(AvatarExtension::class)
->tag('twig.extension')

->set(AvatarRuntime::class)
->tag('twig.runtime')
->args([
ref(AvatarResolver::class),
null,
Expand Down
5 changes: 4 additions & 1 deletion src/Resources/config/impersonating.php
Expand Up @@ -12,17 +12,20 @@
namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Nucleos\UserAdminBundle\Twig\ImpersonateExtension;
use Nucleos\UserAdminBundle\Twig\ImpersonateRuntime;

return static function (ContainerConfigurator $container): void {
$container->services()

->set(ImpersonateExtension::class)
->tag('twig.extension')

->set(ImpersonateRuntime::class)
->tag('twig.runtime')
->args([
ref('router'),
null,
[],
])

;
};
19 changes: 1 addition & 18 deletions src/Twig/AvatarExtension.php
Expand Up @@ -11,32 +11,15 @@

namespace Nucleos\UserAdminBundle\Twig;

use Nucleos\UserAdminBundle\Avatar\AvatarResolver;
use Symfony\Component\Security\Core\User\UserInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

final class AvatarExtension extends AbstractExtension
{
private AvatarResolver $avatarResolver;

public function __construct(AvatarResolver $avatarResolver)
{
$this->avatarResolver = $avatarResolver;
}

/**
* @return TwigFunction[]
*/
public function getFunctions(): array
{
return [
new TwigFunction('userAvatar', [$this, 'userAvatar']),
new TwigFunction('userAvatar', [AvatarRuntime::class, 'userAvatar']),
];
}

public function userAvatar(?UserInterface $user): string
{
return $this->avatarResolver->avatarUrl($user);
}
}
31 changes: 31 additions & 0 deletions src/Twig/AvatarRuntime.php
@@ -0,0 +1,31 @@
<?php

/*
* This file is part of the NucleosUserAdminBundle package.
*
* (c) Christian Gripp <mail@core23.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Nucleos\UserAdminBundle\Twig;

use Nucleos\UserAdminBundle\Avatar\AvatarResolver;
use Symfony\Component\Security\Core\User\UserInterface;
use Twig\Extension\RuntimeExtensionInterface;

final class AvatarRuntime implements RuntimeExtensionInterface
{
private AvatarResolver $avatarResolver;

public function __construct(AvatarResolver $avatarResolver)
{
$this->avatarResolver = $avatarResolver;
}

public function userAvatar(?UserInterface $user): string
{
return $this->avatarResolver->avatarUrl($user);
}
}
41 changes: 2 additions & 39 deletions src/Twig/ImpersonateExtension.php
Expand Up @@ -11,53 +11,16 @@

namespace Nucleos\UserAdminBundle\Twig;

use Symfony\Component\Routing\RouterInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

final class ImpersonateExtension extends AbstractExtension
{
private RouterInterface $router;

private ?string $route;

/**
* @var array<string, mixed>
*/
private $routeParams;

/**
* @param array<string, mixed> $routeParams
*/
public function __construct(RouterInterface $router, ?string $route, array $routeParams)
{
$this->router = $router;
$this->route = $route;
$this->routeParams = $routeParams;
}

/**
* @return TwigFunction[]
*/
public function getFunctions(): array
{
return [
new TwigFunction('impersonate', [$this, 'switchRoute']),
new TwigFunction('impersonateExit', [$this, 'exitRoute']),
new TwigFunction('impersonate', [ImpersonateRuntime::class, 'switchRoute']),
new TwigFunction('impersonateExit', [ImpersonateRuntime::class, 'exitRoute']),
];
}

public function switchRoute(string $username): string
{
if (null === $this->route) {
return '#';
}

return $this->router->generate($this->route, array_merge($this->routeParams, ['_switch_user' => $username]));
}

public function exitRoute(): string
{
return $this->switchRoute('_exit');
}
}
51 changes: 51 additions & 0 deletions src/Twig/ImpersonateRuntime.php
@@ -0,0 +1,51 @@
<?php

/*
* This file is part of the NucleosUserAdminBundle package.
*
* (c) Christian Gripp <mail@core23.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Nucleos\UserAdminBundle\Twig;

use Symfony\Component\Routing\RouterInterface;
use Twig\Extension\RuntimeExtensionInterface;

final class ImpersonateRuntime implements RuntimeExtensionInterface
{
private RouterInterface $router;

private ?string $route;

/**
* @var array<string, mixed>
*/
private $routeParams;

/**
* @param array<string, mixed> $routeParams
*/
public function __construct(RouterInterface $router, ?string $route, array $routeParams)
{
$this->router = $router;
$this->route = $route;
$this->routeParams = $routeParams;
}

public function switchRoute(string $username): string
{
if (null === $this->route) {
return '#';
}

return $this->router->generate($this->route, array_merge($this->routeParams, ['_switch_user' => $username]));
}

public function exitRoute(): string
{
return $this->switchRoute('_exit');
}
}
62 changes: 2 additions & 60 deletions src/Twig/RolesMatrixExtension.php
Expand Up @@ -13,74 +13,16 @@

namespace Nucleos\UserAdminBundle\Twig;

use Nucleos\UserAdminBundle\Security\RolesBuilder\MatrixRolesBuilderInterface;
use Symfony\Component\Form\FormView;
use Twig\Environment;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

final class RolesMatrixExtension extends AbstractExtension
{
private MatrixRolesBuilderInterface $rolesBuilder;

public function __construct(MatrixRolesBuilderInterface $rolesBuilder)
{
$this->rolesBuilder = $rolesBuilder;
}

/**
* @return TwigFunction[]
*/
public function getFunctions(): array
{
return [
new TwigFunction('renderMatrix', [$this, 'renderMatrix'], ['needs_environment' => true]),
new TwigFunction('renderRolesList', [$this, 'renderRolesList'], ['needs_environment' => true]),
new TwigFunction('renderMatrix', [RolesMatrixRuntime::class, 'renderMatrix'], ['needs_environment' => true]),
new TwigFunction('renderRolesList', [RolesMatrixRuntime::class, 'renderRolesList'], ['needs_environment' => true]),
];
}

public function renderRolesList(Environment $environment, FormView $form): string
{
$roles = $this->rolesBuilder->getRoles();
foreach ($roles as $role => $attributes) {
if (isset($attributes['admin_label'])) {
unset($roles[$role]);

continue;
}

$roles[$role] = $attributes;
foreach ($form->getIterator() as $child) {
if ($child->vars['value'] === $role) {
$roles[$role]['form'] = $child;
}
}
}

return $environment->render('@NucleosUserAdmin/Form/roles_matrix_list.html.twig', [
'roles' => $roles,
]);
}

public function renderMatrix(Environment $environment, FormView $form): string
{
$groupedRoles = [];
foreach ($this->rolesBuilder->getRoles() as $role => $attributes) {
if (!isset($attributes['admin_label'])) {
continue;
}

$groupedRoles[$attributes['admin_label']][$role] = $attributes;
foreach ($form->getIterator() as $child) {
if ($child->vars['value'] === $role) {
$groupedRoles[$attributes['admin_label']][$role]['form'] = $child;
}
}
}

return $environment->render('@NucleosUserAdmin/Form/roles_matrix.html.twig', [
'grouped_roles' => $groupedRoles,
'permission_labels' => $this->rolesBuilder->getPermissionLabels(),
]);
}
}

0 comments on commit 717ae24

Please sign in to comment.