Skip to content

Commit

Permalink
feature #678 Add flash from event (loic425)
Browse files Browse the repository at this point in the history
This PR was merged into the poc-new-resource-metadata branch.

Discussion
----------

| Q               | A
| --------------- | -----
| Bug fix?        | no
| New feature?    | yes
| BC breaks?      | no
| Deprecations?   | no
| Related tickets | partially #677
| License         | MIT


Commits
-------

b56e164 Add flash from event
  • Loading branch information
lchrusciel authored Jun 20, 2023
2 parents ad90e19 + b56e164 commit 5ad1d7d
Show file tree
Hide file tree
Showing 3 changed files with 134 additions and 18 deletions.
63 changes: 46 additions & 17 deletions src/Component/Symfony/Session/Flash/FlashHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Sylius\Component\Resource\Humanizer\StringHumanizer;
use Sylius\Component\Resource\Metadata\BulkOperationInterface;
use Sylius\Component\Resource\Metadata\Operation;
use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
Expand All @@ -32,44 +33,72 @@ public function __construct(

public function addSuccessFlash(Operation $operation, Context $context): void
{
$this->addFlash($operation, $context, 'success');
$this->addFlashFromOperation($operation, $context, 'success');
}

private function addFlash(Operation $operation, Context $context, string $type): void
public function addFlashFromEvent(GenericEvent $event, Context $context): void
{
$request = $context->get(RequestOption::class)?->request();
$message = $this->buildEventMessage($event);

if (null === $request) {
return;
}
$this->addFlash($message, $event->getMessageType(), $context);
}

$message = $this->buildMessage($operation, $type);
private function addFlashFromOperation(Operation $operation, Context $context, string $type): void
{
$message = $this->buildOperationMessage($operation, $type);

/** @var FlashBagInterface $flashBag */
$flashBag = $request->getSession()->getBag('flashes');
$this->addFlash($message, $type, $context);
}

$flashBag->add($type, $message);
private function buildEventMessage(GenericEvent $event): string
{
$message = $event->getMessage();
$parameters = $event->getMessageParameters();

if (!$this->translator instanceof TranslatorBagInterface) {
return $this->translator->trans($message, $parameters, 'flashes');
}

if ($this->translator->getCatalogue()->has($message, 'flashes')) {
return $this->translator->trans($message, $parameters, 'flashes');
}

return $message;
}

private function buildMessage(Operation $operation, string $type): string
private function buildOperationMessage(Operation $operation, string $type): string
{
$resource = $operation->getResource();
Assert::notNull($resource);

$specifyKey = sprintf('%s.%s.%s', $resource->getApplicationName() ?? '', $resource->getName() ?? '', $operation->getShortName() ?? '');
$defaultKey = sprintf('sylius.resource.%s', $operation->getShortName() ?? '');
$key = sprintf('%s.%s.%s', $resource->getApplicationName() ?? '', $resource->getName() ?? '', $operation->getShortName() ?? '');
$fallbackKey = sprintf('sylius.resource.%s', $operation->getShortName() ?? '');

$parameters = $this->getTranslationParameters($operation);

if (!$this->translator instanceof TranslatorBagInterface) {
return $this->translator->trans($defaultKey, $parameters, 'flashes');
return $this->translator->trans($fallbackKey, $parameters, 'flashes');
}

if ($this->translator->getCatalogue()->has($specifyKey, 'flashes')) {
return $this->translator->trans($specifyKey, $parameters, 'flashes');
if ($this->translator->getCatalogue()->has($key, 'flashes')) {
return $this->translator->trans($key, $parameters, 'flashes');
}

return $this->translator->trans($defaultKey, $parameters, 'flashes');
return $this->translator->trans($fallbackKey, $parameters, 'flashes');
}

private function addFlash(string $message, string $type, Context $context): void
{
$request = $context->get(RequestOption::class)?->request();

if (null === $request) {
return;
}

/** @var FlashBagInterface $flashBag */
$flashBag = $request->getSession()->getBag('flashes');

$flashBag->add($type, $message);
}

private function getTranslationParameters(Operation $operation): array
Expand Down
3 changes: 3 additions & 0 deletions src/Component/Symfony/Session/Flash/FlashHelperInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@

use Sylius\Component\Resource\Context\Context;
use Sylius\Component\Resource\Metadata\Operation;
use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent;

interface FlashHelperInterface
{
public function addSuccessFlash(Operation $operation, Context $context): void;

public function addFlashFromEvent(GenericEvent $event, Context $context): void;
}
86 changes: 85 additions & 1 deletion src/Component/spec/Symfony/Session/Flash/FlashHelperSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
namespace spec\Sylius\Component\Resource\Symfony\Session\Flash;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Sylius\Component\Resource\Context\Context;
use Sylius\Component\Resource\Context\Option\RequestOption;
use Sylius\Component\Resource\Metadata\BulkDelete;
use Sylius\Component\Resource\Metadata\Create;
use Sylius\Component\Resource\Metadata\Resource;
use Sylius\Component\Resource\Symfony\EventDispatcher\GenericEvent;
use Sylius\Component\Resource\Symfony\Session\Flash\FlashHelper;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
Expand Down Expand Up @@ -64,7 +66,7 @@ function it_adds_success_flashes_with_specific_message(
$this->addSuccessFlash($operation, $context);
}

function it_adds_success_flashes_with_default_message(
function it_adds_success_flashes_with_fallback_message(
Request $request,
SessionInterface $session,
FlashBagInterface $flashBag,
Expand Down Expand Up @@ -158,4 +160,86 @@ function it_adds_success_flashes_with_humanized_message_and_plural_name_on_bulk_

$this->addSuccessFlash($operation, $context);
}

function it_translates_flashes_from_event_when_translator_is_not_a_bag(
Request $request,
SessionInterface $session,
FlashBagInterface $flashBag,
TranslatorInterface $translator,
GenericEvent $event,
): void {
$context = new Context(new RequestOption($request->getWrappedObject()));

$request->getSession()->willReturn($session);

$session->getBag('flashes')->willReturn($flashBag);

$event->getMessage()->willReturn('app.admin_user.banned');
$event->getMessageType()->willReturn('success');
$event->getMessageParameters()->willReturn(['%admin_user%' => 'Darth Vader']);

$translator->trans('app.admin_user.banned', ['%admin_user%' => 'Darth Vader'], 'flashes')->willReturn('Darth Vader was banned successfully.')->shouldBeCalled();

$flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled();

$this->addFlashFromEvent($event, $context);
}

function it_translates_flashes_from_event_when_translator_is_a_bag(
Request $request,
SessionInterface $session,
FlashBagInterface $flashBag,
TranslatorBagInterface $translator,
MessageCatalogueInterface $messageCatalogue,
GenericEvent $event,
): void {
$context = new Context(new RequestOption($request->getWrappedObject()));

$request->getSession()->willReturn($session);

$session->getBag('flashes')->willReturn($flashBag);

$event->getMessage()->willReturn('app.admin_user.banned');
$event->getMessageType()->willReturn('success');
$event->getMessageParameters()->willReturn(['%admin_user%' => 'Darth Vader']);

$translator->getCatalogue()->willReturn($messageCatalogue);

$messageCatalogue->has('app.admin_user.banned', 'flashes')->willReturn(true)->shouldBeCalled();

$translator->trans('app.admin_user.banned', ['%admin_user%' => 'Darth Vader'], 'flashes')->willReturn('Darth Vader was banned successfully.')->shouldBeCalled();

$flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled();

$this->addFlashFromEvent($event, $context);
}

function it_does_not_translate_event_message_when_translator_is_a_bag_and_does_not_contains_the_key(
Request $request,
SessionInterface $session,
FlashBagInterface $flashBag,
TranslatorBagInterface $translator,
MessageCatalogueInterface $messageCatalogue,
GenericEvent $event,
): void {
$context = new Context(new RequestOption($request->getWrappedObject()));

$request->getSession()->willReturn($session);

$session->getBag('flashes')->willReturn($flashBag);

$event->getMessage()->willReturn('Darth Vader was banned successfully.');
$event->getMessageType()->willReturn('success');
$event->getMessageParameters()->willReturn([]);

$translator->getCatalogue()->willReturn($messageCatalogue);

$messageCatalogue->has('Darth Vader was banned successfully.', 'flashes')->willReturn(false)->shouldBeCalled();

$translator->trans(Argument::cetera())->shouldNotBeCalled();

$flashBag->add('success', 'Darth Vader was banned successfully.')->shouldBeCalled();

$this->addFlashFromEvent($event, $context);
}
}

0 comments on commit 5ad1d7d

Please sign in to comment.