Skip to content

Commit

Permalink
Redirect path extension
Browse files Browse the repository at this point in the history
  • Loading branch information
loic425 committed Oct 4, 2024
1 parent 12ab4e6 commit af4f90e
Show file tree
Hide file tree
Showing 10 changed files with 225 additions and 9 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"laminas/laminas-stdlib": "^3.18",
"pagerfanta/doctrine-orm-adapter": "^4.6",
"pagerfanta/twig": "^4.6",
"sylius/grid-bundle": "^1.13@alpha",
"sylius/grid-bundle": "^1.13@beta",
"sylius/resource-bundle": "^1.11 || ^1.12@alpha",
"symfony/asset": "^6.4 || ^7.0",
"symfony/config": "^6.4 || ^7.0",
Expand Down
3 changes: 3 additions & 0 deletions src/AdminUi/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@
"twig/twig": "^2.15 || ^3.0"
},
"require-dev": {
"doctrine/doctrine-bundle": "^2.12",
"doctrine/orm": "^2.0",
"matthiasnoback/symfony-dependency-injection-test": "^5.1",
"phpunit/phpunit": "^9.6",
"sylius/grid-bundle": "^1.13@beta",
"symfony/browser-kit": "^6.4 || ^7.0",
"symfony/config": "^6.4 || ^7.0",
"symfony/console": "^6.4 || ^7.0",
Expand Down
28 changes: 28 additions & 0 deletions src/AdminUi/config/services/twig/extension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Symfony\Component\DependencyInjection\Loader\Configurator;

use Sylius\AdminUi\Twig\Extension\RedirectPathExtension;

return function (ContainerConfigurator $configurator): void {
$services = $configurator->services();

$services->set('sylius_twig_extra.twig.extension.redirect_path', RedirectPathExtension::class)
->args([
service('router'),
service('sylius.grid.filter_storage')->nullOnInvalid(),
])
->tag(name: 'twig.extension')
;
};
69 changes: 69 additions & 0 deletions src/AdminUi/src/Twig/Extension/RedirectPathExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\AdminUi\Twig\Extension;

use Sylius\Bundle\GridBundle\Storage\FilterStorageInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

final class RedirectPathExtension extends AbstractExtension
{
private const NUMBER_OF_ROUTE_PROPERTIES = 3;

public function __construct(
private readonly RouterInterface $router,
private readonly ?FilterStorageInterface $filterStorage = null,
) {
}

public function getFunctions(): array
{
return [
new TwigFunction('sylius_generate_redirect_path', [$this, 'generateRedirectPath']),
];
}

public function generateRedirectPath(?string $path): ?string
{
if (null === $path) {
return null;
}

$request = Request::create($path);

try {
$routeInfo = $this->router->match($request->getPathInfo());
} catch (\Throwable) {
return $path;
}

if ([] !== $request->query->all() || $this->hasAdditionalParameters($routeInfo)) {
return $path;
}

$route = $routeInfo['_route'];

return $this->router->generate($route, $this->filterStorage?->all() ?? []);
}

/**
* @param mixed[] $routeInfo
*/
private function hasAdditionalParameters(array $routeInfo): bool
{
return count($routeInfo) > self::NUMBER_OF_ROUTE_PROPERTIES;
}
}
3 changes: 3 additions & 0 deletions src/AdminUi/tests/Functional/.application/.env
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ APP_ENV=dev
APP_SECRET=c9570eaa5cbfadf33ad1a93f95c2e42a
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
###< doctrine/doctrine-bundle ###
2 changes: 2 additions & 0 deletions src/AdminUi/tests/Functional/.application/config/bundles.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@
Sylius\TwigHooks\SyliusTwigHooksBundle::class => ['all' => true],
Sylius\Bundle\ResourceBundle\SyliusResourceBundle::class => ['all' => true],
Sylius\AdminUi\Symfony\SyliusAdminUiBundle::class => ['all' => true],
Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
];
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'

# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '16'

profiling_collect_backtrace: '%kernel.debug%'
use_savepoints: true
orm:
auto_generate_proxy_classes: true
enable_lazy_ghost_objects: true
report_fields_where_declared: true
validate_xml_mapping: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
mappings:
App:
type: attribute
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App

when@test:
doctrine:
dbal:
# "TEST_TOKEN" is typically set by ParaTest
dbname_suffix: '_test%env(default::TEST_TOKEN)%'

when@prod:
doctrine:
orm:
auto_generate_proxy_classes: false
proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
query_cache_driver:
type: pool
pool: doctrine.system_cache_pool
result_cache_driver:
type: pool
pool: doctrine.result_cache_pool

framework:
cache:
pools:
doctrine.result_cache_pool:
adapter: cache.app
doctrine.system_cache_pool:
adapter: cache.system
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Tests\Sylius\AdminUi\Functional\Twig\Extension;

use Sylius\AdminUi\Twig\Extension\RedirectPathExtension;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\HttpFoundation\Request;

final class RedirectPathExtensionTest extends KernelTestCase
{
private RedirectPathExtension $redirectPathExtension;

protected function setUp(): void
{
$container = self::getContainer();

$session = $container->get('session.factory')->createSession();
$request = new Request();
$request->setSession($session);
$container->get('request_stack')->push($request);

$this->redirectPathExtension = $container->get('sylius_twig_extra.twig.extension.redirect_path');
$container->get('sylius.grid.filter_storage')->set(['criteria' => ['enabled' => true]]);
}

public function testItReturnsRedirectPathWithFiltersFromStorageApplied(): void
{
// Note, it requires an existing route path.
$redirectPath = $this->redirectPathExtension->generateRedirectPath('/books');

$this->assertSame('/books?criteria%5Benabled%5D=1', $redirectPath);
}

public function testItReturnsGivenPathIfRouteHasSomeMoreConfiguration(): void
{
// TODO ask internal core team member to reproduce this route with "some more configuration"
$redirectPath = $this->redirectPathExtension->generateRedirectPath('/admin/ajax/products/search');

$this->assertSame('/admin/ajax/products/search', $redirectPath);
}

public function testItReturnsGivenPathIfRouteIsNotMatched(): void
{
$redirectPath = $this->redirectPathExtension->generateRedirectPath('/invalid-path');

$this->assertSame('/invalid-path', $redirectPath);
}

public function testItReturnsNullIfThePathIsNullAsWell(): void
{
$redirectPath = $this->redirectPathExtension->generateRedirectPath(null);

$this->assertNull($redirectPath);
}
}
2 changes: 1 addition & 1 deletion src/BootstrapAdminUi/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"php": "^8.1",
"pagerfanta/twig": "^4.6",
"sylius/admin-ui": "dev-main",
"sylius/grid-bundle": "^1.13@alpha",
"sylius/grid-bundle": "^1.13@beta",
"sylius/resource-bundle": "^1.11 || ^1.12@alpha",
"sylius/twig-extra": "dev-main",
"sylius/twig-hooks": "^0.3 || dev-main",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,9 @@

{% set configuration = hookable_metadata.context.configuration %}

{#{% set index_url = sylius_generate_redirect_path(app.request.headers.get('referer')|default(path(#}
{# configuration.vars.index.route.name|default(configuration.getRouteName('index')),#}
{# configuration.vars.index.route.parameters|default(configuration.vars.route.parameters|default({}))#}
{#))) %}#}

{% set index_url = path(
{% set index_url = sylius_generate_redirect_path(app.request.headers.get('referer')|default(path(
configuration.vars.index.route.name|default(configuration.getRouteName('index')),
configuration.vars.index.route.parameters|default(configuration.vars.route.parameters|default({}))
) %}
))) %}

{{ button.cancel(sylius_test_form_attribute('cancel-changes-button')|merge({ text: 'sylius.ui.cancel'|trans, url: index_url, class: 'btn' })) }}

0 comments on commit af4f90e

Please sign in to comment.