From a871f230778c5409b06f68ba5d5513d132e84509 Mon Sep 17 00:00:00 2001 From: Khoubza Younes Date: Mon, 7 Dec 2020 04:13:58 +0100 Subject: [PATCH] convert session flash messages into flasher messages --- composer.json | 14 +-- src/Laravel/Middleware/SessionMiddleware.php | 94 +++++++++++++++++++ src/Laravel/Resources/config/config.php | 9 ++ .../ServiceProvider/Providers/Laravel.php | 3 +- ...der.php => FlasherNotyServiceProvider.php} | 2 +- .../ServiceProvider/Providers/Laravel.php | 4 +- .../ServiceProvider/Providers/Laravel4.php | 4 +- .../ServiceProvider/Providers/Lumen.php | 4 +- .../Providers/ServiceProviderInterface.php | 4 +- .../ServiceProviderManager.php | 4 +- src/Noty/Laravel/Tests/TestCase.php | 2 +- src/Noty/Laravel/composer.json | 2 +- .../DependencyInjection/Configuration.php | 12 +++ src/Symfony/EventListener/SessionListener.php | 93 ++++++++++++++++++ src/Symfony/Resources/config/config.yaml | 9 ++ .../Laravel/Resources/config/config.php | 2 +- 16 files changed, 235 insertions(+), 27 deletions(-) create mode 100644 src/Laravel/Middleware/SessionMiddleware.php rename src/Noty/Laravel/{FlasherNotyfServiceProvider.php => FlasherNotyServiceProvider.php} (94%) create mode 100644 src/Symfony/EventListener/SessionListener.php diff --git a/composer.json b/composer.json index a3f4b00b..aa57523e 100644 --- a/composer.json +++ b/composer.json @@ -13,22 +13,12 @@ ], "require": { "php": ">=5.3", - "ext-json": "*", - "illuminate/support": "4.0.*" - }, - "require-dev": { - "phpunit/phpunit": "4.8.36", - "orchestra/testbench": "^2.0|^3.0|^4.0|^5.0|^6.0" + "ext-json": "*" }, "autoload": { "psr-4": { "Flasher\\": "src/" } }, - "minimum-stability": "dev", - "config": { - "platform": { - "php": "5.4" - } - } + "minimum-stability": "dev" } diff --git a/src/Laravel/Middleware/SessionMiddleware.php b/src/Laravel/Middleware/SessionMiddleware.php new file mode 100644 index 00000000..6029f678 --- /dev/null +++ b/src/Laravel/Middleware/SessionMiddleware.php @@ -0,0 +1,94 @@ +config = $config; + $this->flasher = $flasher; + $this->htmlPresenter = $htmlPresenter; + } + + /** + * Run the request filter. + * + * @param \Illuminate\Http\Request $request + * @param \Closure $next + * + * @return mixed + */ + public function handle(Request $request, \Closure $next) + { + if ($request->isXmlHttpRequest() || true !== $this->config->get('auto_create_from_session')) { + return; + } + + /** + * @var Response $response + */ + $response = $next($request); + + foreach ($this->typesMapping() as $alias => $type) { + if (false === $request->session()->has($alias)) { + continue; + } + + $this->flasher->type($type, $request->session()->get($alias))->dispatch(); + } + + + $content = $response->getContent(); + $pos = strripos($content, ''); + $content = substr($content, 0, $pos).$this->htmlPresenter->render().substr($content, $pos); + $response->setContent($content); + + return $response; + } + + /** + * @return array + */ + private function typesMapping() + { + $mapping = array(); + + foreach ($this->config->get('types_mapping', array()) as $type => $aliases) { + if (is_int($type) && is_string($aliases)) { + $type = $aliases; + } + + foreach ((array)$aliases as $alias) { + $mapping[$alias] = $type; + } + } + + return $mapping; + } +} diff --git a/src/Laravel/Resources/config/config.php b/src/Laravel/Resources/config/config.php index 618ceeae..2999fcaa 100644 --- a/src/Laravel/Resources/config/config.php +++ b/src/Laravel/Resources/config/config.php @@ -6,4 +6,13 @@ return array( 'scripts' => array( '/vendor/php-flasher/flasher/assets/js/flasher.js' ), + + 'auto_create_from_session' => true, + + 'types_mapping' => array( + 'success' => array('success'), + 'error' => array('error', 'danger'), + 'warning' => array('warning', 'alarm'), + 'info' => array('info', 'notice', 'alert'), + ), ); diff --git a/src/Laravel/ServiceProvider/Providers/Laravel.php b/src/Laravel/ServiceProvider/Providers/Laravel.php index a24d57f8..df6ea19f 100644 --- a/src/Laravel/ServiceProvider/Providers/Laravel.php +++ b/src/Laravel/ServiceProvider/Providers/Laravel.php @@ -53,7 +53,7 @@ class Laravel implements ServiceProviderInterface public function publishAssets(FlasherServiceProvider $provider) { - $provider->publishes(array(__DIR__.'/../../public' => public_path('vendor/php-flasher/flasher/assets/js')), 'public'); + $provider->publishes(array(__DIR__.'/../../Resources/public' => public_path('vendor/php-flasher/flasher/assets/js')), 'public'); } public function registerServices() @@ -146,6 +146,7 @@ class Laravel implements ServiceProviderInterface $this->app->alias('flasher', 'flasher.factory_manager'); + $this->app->bind('Flasher\Prime\Config\ConfigInterface', 'flasher.config'); $this->app->bind('Flasher\Prime\FlasherInterface', 'flasher'); $this->app->bind('Flasher\Prime\Storage\StorageManagerInterface', 'flasher.storage_manager'); $this->app->bind('Flasher\Prime\Renderer\RendererManagerInterface', 'flasher.renderer_manager'); diff --git a/src/Noty/Laravel/FlasherNotyfServiceProvider.php b/src/Noty/Laravel/FlasherNotyServiceProvider.php similarity index 94% rename from src/Noty/Laravel/FlasherNotyfServiceProvider.php rename to src/Noty/Laravel/FlasherNotyServiceProvider.php index cb6179a7..c7f3e63b 100644 --- a/src/Noty/Laravel/FlasherNotyfServiceProvider.php +++ b/src/Noty/Laravel/FlasherNotyServiceProvider.php @@ -6,7 +6,7 @@ use Illuminate\Container\Container; use Illuminate\Support\ServiceProvider; use Flasher\Noty\Laravel\ServiceProvider\ServiceProviderManager; -final class FlasherNotyfServiceProvider extends ServiceProvider +final class FlasherNotyServiceProvider extends ServiceProvider { public function boot() { diff --git a/src/Noty/Laravel/ServiceProvider/Providers/Laravel.php b/src/Noty/Laravel/ServiceProvider/Providers/Laravel.php index 45506e0b..11c1bc88 100644 --- a/src/Noty/Laravel/ServiceProvider/Providers/Laravel.php +++ b/src/Noty/Laravel/ServiceProvider/Providers/Laravel.php @@ -4,7 +4,7 @@ namespace Flasher\Noty\Laravel\ServiceProvider\Providers; use Flasher\Prime\Flasher; use Flasher\Prime\Renderer\RendererManager; -use Flasher\Noty\Laravel\FlasherNotyfServiceProvider; +use Flasher\Noty\Laravel\FlasherNotyServiceProvider; use Flasher\Noty\Prime\NotyFactory; use Flasher\Noty\Prime\NotyRenderer; use Illuminate\Container\Container; @@ -24,7 +24,7 @@ class Laravel implements ServiceProviderInterface return $this->app instanceof Application; } - public function publishConfig(FlasherNotyfServiceProvider $provider) + public function publishConfig(FlasherNotyServiceProvider $provider) { $source = realpath($raw = __DIR__.'/../../Resources/config/config.php') ?: $raw; diff --git a/src/Noty/Laravel/ServiceProvider/Providers/Laravel4.php b/src/Noty/Laravel/ServiceProvider/Providers/Laravel4.php index 50cb967f..7a09c81d 100644 --- a/src/Noty/Laravel/ServiceProvider/Providers/Laravel4.php +++ b/src/Noty/Laravel/ServiceProvider/Providers/Laravel4.php @@ -2,7 +2,7 @@ namespace Flasher\Noty\Laravel\ServiceProvider\Providers; -use Flasher\Noty\Laravel\FlasherNotyfServiceProvider; +use Flasher\Noty\Laravel\FlasherNotyServiceProvider; use Illuminate\Foundation\Application; final class Laravel4 extends Laravel @@ -12,7 +12,7 @@ final class Laravel4 extends Laravel return $this->app instanceof Application && 0 === strpos(Application::VERSION, '4.'); } - public function publishConfig(FlasherNotyfServiceProvider $provider) + public function publishConfig(FlasherNotyServiceProvider $provider) { $provider->package('php-flasher/flasher-noty-laravel', 'flasher_noty', __DIR__.'/../../Resources'); } diff --git a/src/Noty/Laravel/ServiceProvider/Providers/Lumen.php b/src/Noty/Laravel/ServiceProvider/Providers/Lumen.php index bcc9ad47..b2dbefb6 100644 --- a/src/Noty/Laravel/ServiceProvider/Providers/Lumen.php +++ b/src/Noty/Laravel/ServiceProvider/Providers/Lumen.php @@ -2,7 +2,7 @@ namespace Flasher\Noty\Laravel\ServiceProvider\Providers; -use Flasher\Noty\Laravel\FlasherNotyfServiceProvider; +use Flasher\Noty\Laravel\FlasherNotyServiceProvider; use Laravel\Lumen\Application; final class Lumen extends Laravel @@ -12,7 +12,7 @@ final class Lumen extends Laravel return $this->app instanceof Application; } - public function publishConfig(FlasherNotyfServiceProvider $provider) + public function publishConfig(FlasherNotyServiceProvider $provider) { $source = realpath($raw = __DIR__.'/../../Resources/config/config.php') ?: $raw; diff --git a/src/Noty/Laravel/ServiceProvider/Providers/ServiceProviderInterface.php b/src/Noty/Laravel/ServiceProvider/Providers/ServiceProviderInterface.php index 25803880..226da78c 100644 --- a/src/Noty/Laravel/ServiceProvider/Providers/ServiceProviderInterface.php +++ b/src/Noty/Laravel/ServiceProvider/Providers/ServiceProviderInterface.php @@ -2,13 +2,13 @@ namespace Flasher\Noty\Laravel\ServiceProvider\Providers; -use Flasher\Noty\Laravel\FlasherNotyfServiceProvider; +use Flasher\Noty\Laravel\FlasherNotyServiceProvider; interface ServiceProviderInterface { public function shouldBeUsed(); - public function publishConfig(FlasherNotyfServiceProvider $provider); + public function publishConfig(FlasherNotyServiceProvider $provider); public function registerServices(); diff --git a/src/Noty/Laravel/ServiceProvider/ServiceProviderManager.php b/src/Noty/Laravel/ServiceProvider/ServiceProviderManager.php index 18094f31..5c091f1c 100644 --- a/src/Noty/Laravel/ServiceProvider/ServiceProviderManager.php +++ b/src/Noty/Laravel/ServiceProvider/ServiceProviderManager.php @@ -2,7 +2,7 @@ namespace Flasher\Noty\Laravel\ServiceProvider; -use Flasher\Noty\Laravel\FlasherNotyfServiceProvider; +use Flasher\Noty\Laravel\FlasherNotyServiceProvider; use Flasher\Noty\Laravel\ServiceProvider\Providers\ServiceProviderInterface; final class ServiceProviderManager @@ -20,7 +20,7 @@ final class ServiceProviderManager private $notifyServiceProvider; - public function __construct(FlasherNotyfServiceProvider $notifyServiceProvider) + public function __construct(FlasherNotyServiceProvider $notifyServiceProvider) { $this->notifyServiceProvider = $notifyServiceProvider; } diff --git a/src/Noty/Laravel/Tests/TestCase.php b/src/Noty/Laravel/Tests/TestCase.php index 99dd7a36..cd9d8a77 100644 --- a/src/Noty/Laravel/Tests/TestCase.php +++ b/src/Noty/Laravel/Tests/TestCase.php @@ -20,7 +20,7 @@ class TestCase extends Orchestra { return array( 'Flasher\Laravel\FlasherServiceProvider', - 'Flasher\Noty\Laravel\FlasherNotyfServiceProvider', + 'Flasher\Noty\Laravel\FlasherNotyServiceProvider', ); } diff --git a/src/Noty/Laravel/composer.json b/src/Noty/Laravel/composer.json index a21e7acb..c009b460 100644 --- a/src/Noty/Laravel/composer.json +++ b/src/Noty/Laravel/composer.json @@ -51,7 +51,7 @@ "extra": { "laravel": { "providers": [ - "FlasherNotyfServiceProvider" + "Flasher\\Noty\\Laravel\\FlasherNotyServiceProvider" ] } }, diff --git a/src/Symfony/DependencyInjection/Configuration.php b/src/Symfony/DependencyInjection/Configuration.php index 09be3337..12391d0f 100644 --- a/src/Symfony/DependencyInjection/Configuration.php +++ b/src/Symfony/DependencyInjection/Configuration.php @@ -37,6 +37,18 @@ final class Configuration implements ConfigurationInterface ->prototype('scalar')->end() ->defaultValue(array()) ->end() + ->booleanNode('auto_create_from_session') + ->defaultValue(true) + ->end() + ->arrayNode('types_mapping') + ->prototype('variable')->end() + ->defaultValue(array( + 'success' => array('success'), + 'error' => array('error', 'danger'), + 'warning' => array('warning', 'alarm'), + 'info' => array('info', 'notice', 'alert'), + )) + ->end() ->arrayNode('adapters') ->ignoreExtraKeys(false) ->useAttributeAsKey('name') diff --git a/src/Symfony/EventListener/SessionListener.php b/src/Symfony/EventListener/SessionListener.php new file mode 100644 index 00000000..ff2bc81e --- /dev/null +++ b/src/Symfony/EventListener/SessionListener.php @@ -0,0 +1,93 @@ +config = $config; + $this->flasher = $flasher; + $this->htmlPresenter = $htmlPresenter; + } + + public function onKernelResponse(ResponseEvent $event) + { + $request = $event->getRequest(); + + if (!$event->isMasterRequest() || $request->isXmlHttpRequest() || true !== $this->config->get('auto_create_from_session')) { + return; + } + + $response = $event->getResponse(); + + $mapping = $this->typesMapping(); + + foreach ($request->getSession()->getFlashBag()->all() as $type => $messages) { + if (!isset($mapping[$type])) { + continue; + } + + foreach ($messages as $message) { + $this->flasher->type($mapping[$type], $message)->dispatch(); + } + } + + $content = $response->getContent(); + $pos = strripos($content, ''); + $content = substr($content, 0, $pos).$this->htmlPresenter->render().substr($content, $pos); + $response->setContent($content); + } + + public static function getSubscribedEvents() + { + return array( + 'kernel.response' => 'onKernelResponse' + ); + } + + /** + * @return array + */ + private function typesMapping() + { + $mapping = array(); + + foreach ($this->config->get('types_mapping', array()) as $type => $aliases) { + if (is_int($type) && is_string($aliases)) { + $type = $aliases; + } + + foreach ((array) $aliases as $alias) { + $mapping[$alias] = $type; + } + } + + return $mapping; + } +} diff --git a/src/Symfony/Resources/config/config.yaml b/src/Symfony/Resources/config/config.yaml index 876166ae..2bd2389f 100644 --- a/src/Symfony/Resources/config/config.yaml +++ b/src/Symfony/Resources/config/config.yaml @@ -144,6 +144,15 @@ services: tags: - { name: 'twig.extension' } + flasher.session_listener: + class: Flasher\Symfony\EventListener\SessionListener + arguments: + - '@flasher.config' + - '@flasher' + - '@flasher.presenter.html' + tags: + - { name: 'kernel.event_subscriber' } + Flasher\Prime\Config\Config: '@flasher.config' Flasher\Prime\Flasher: '@flasher' Flasher\Prime\Presenter\PresenterManager: '@flasher.presenter_manager' diff --git a/src/Toastr/Laravel/Resources/config/config.php b/src/Toastr/Laravel/Resources/config/config.php index b92ca1c2..a2bac923 100644 --- a/src/Toastr/Laravel/Resources/config/config.php +++ b/src/Toastr/Laravel/Resources/config/config.php @@ -35,7 +35,7 @@ return array( 'onHidden' => null, 'onShown' => null, 'positionClass' => 'toast-top-right', - 'preventDuplicates' => true, + 'preventDuplicates' => false, 'progressBar' => true, 'progressClass' => 'toast-progress', 'rtl' => false,