williamsampaio / slim-flash-messages
Slim 框架 Flash 消息服务提供者
0.3.2
2024-08-14 01:07 UTC
Requires (Dev)
- php-coveralls/php-coveralls: ^0.1.0
- php-di/php-di: ^7.0
- phpunit/phpunit: ^11.3
- slim/twig-view: ^3.4
- symfony/var-dumper: ^7.1
README
这个库允许你在 Slim 项目中使用临时消息。它可以通过一个扩展轻松集成到 Twig 模板系统中,该扩展提供了在模板中抓取和使用函数的功能。它不仅限于创建简单的消息字符串,还允许使用其他数据类型,如数组。
安装
composer require williamsampaio/slim-flash-messages
使用示例(Slim 4)
// app/dependencies.php //... use SlimFlashMessages\Flash; use SlimFlashMessages\FlashProviderInterface; return function (ContainerBuilder $containerBuilder) { $containerBuilder->addDefinitions([ //... FlashProviderInterface::class => function () { return Flash::getInstance(); }, ]); };
// app/middleware.php //... // use SlimFlashMessages\FlashMiddleware; use SlimFlashMessages\FlashTwigExtension; return function (App $app) { //... // Optional if you are working with dependency injection, // using the middleware is only useful if you need to obtain the Flash instance from request. // $app->add(FlashMiddleware::createFromContainer($app)); // With Twig $twig = Twig::create(__DIR__ . '/../templates', ['cache' => false]); $twig->addExtension(FlashTwigExtension::createFromContainer($app)); $app->add(TwigMiddleware::create($app, $twig)); };
// Your controller //... use Slim\Views\Twig; // use SlimFlashMessages\FlashProvider; use SlimFlashMessages\FlashProviderInterface; class YourController { private $flash; private $view; public function __construct(FlashProviderInterface $flash, Twig $view) { $this->flash = $flash; $this->view = $view; } public function index(ServerRequestInterface $request, ResponseInterface $response) { // If you are working with middleware instead of dependency injection it will be this way. // $flash = FlashProvider::fromRequest($request); $this->flash->add('messages', 'Hello!'); return $this->view->render($response, 'template.twig'); } //... }
{# template.twig #} {% for msg in flash('messages') %} {{ msg }} {% endfor %}
最简单的示例
如本示例所示,Twig 集成不是必需的,因为我们的重点是展示消息提供者 API。
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; use SlimFlashMessages\Flash; use SlimFlashMessages\FlashMiddleware; use SlimFlashMessages\FlashProvider; require __DIR__ . '/../vendor/autoload.php'; // Important! if the storage is not passed to the constructor, // $_SESSION will be used $flash = Flash::getInstance(); // Create App $app = AppFactory::create(); $app->setBasePath('/example1'); // Optional // Add FlashMiddleware $app->add(new FlashMiddleware($flash)); $app->addErrorMiddleware(true, true, true); $app->get('/', function (Request $request, Response $response, $args) { // Get FlashProvider from request // FlashMiddleware previously took care of adding the FlashProvider to the request $flash = FlashProvider::fromRequest($request); // Clear all stored values $flash->clearAll(); // The 'add' method allows you to add a flash message or data (as an array, if you prefer!) $flash->add('simple', 'Hello World! 1'); $flash->add('messages', [ 'status' => 'success', 'text' => '1. PHP is the best!' ]); echo '<pre>'; var_dump($flash->getAll()); // Checks if the key is defined in the storage var_dump($flash->has('messages')); // Clear a key defined $flash->clear('messages'); var_dump($flash->getAll()); var_dump($flash->has('messages')); $flash->add('simple', 'Hello World! 2'); $flash->add('simple', 'Hello World! 3'); var_dump($flash->getAll()); // Get first item from key var_dump($flash->get_first('simple')); // or to pick up and remove first item. // var_dump($flash->get_first('simple', true)); // Get last item from key // var_dump($flash->get_last('simple')); // or to pick up and remove last item. var_dump($flash->get_last('simple', true)); var_dump($flash->get('simple')); return $response; }); $app->run();
使用容器
本示例使用 php-di 容器和 slim/twig-view。
<?php use DI\Container; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; use Slim\Views\Twig; use Slim\Views\TwigMiddleware; use SlimFlashMessages\Flash; use SlimFlashMessages\FlashMiddleware; use SlimFlashMessages\FlashProvider; use SlimFlashMessages\FlashProviderInterface; use SlimFlashMessages\FlashTwigExtension; require __DIR__ . '/../vendor/autoload.php'; // Create a new DI Container $container = new Container(); // Add a FlashProvider to the container $container->set(FlashProviderInterface::class, function () { // Important! if the storage is not passed to the constructor, // $_SESSION will be used return Flash::getInstance(); }); // Set container to create App with on AppFactory AppFactory::setContainer($container); $app = AppFactory::create(); $app->setBasePath('/example2'); // Optional // Add FlashMiddleware from container $app->add(FlashMiddleware::createFromContainer($app)); // Create Twig and add FlashTwigExtension $twig = Twig::create(__DIR__ . '/templates', ['cache' => false]); $twig->addExtension(FlashTwigExtension::createFromContainer($app)); // Add Twig-View Middleware $app->add(TwigMiddleware::create($app, $twig)); $app->addErrorMiddleware(true, true, true); $app->get('/', function (Request $request, Response $response, $args) { // Get Twig and FlashProvider from request $view = Twig::fromRequest($request); // FlashMiddleware previously took care of adding the FlashProvider to the request $flash = FlashProvider::fromRequest($request, 'flash'); $alerts = ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark']; // The 'add' method allows you to add a flash message or data (as an array, if you prefer!) $flash->add('simple', 'Hello World!'); $flash->add('messages', [ 'alert' => $alerts[array_rand($alerts)], 'text' => '1. PHP is the best!' ]); $flash->add('messages', [ 'alert' => $alerts[array_rand($alerts)], 'text' => '2. Slim Framework is amazing!' ]); $flash->add('messages', [ 'alert' => $alerts[array_rand($alerts)], 'text' => '3. Lorem ipsum!' ]); return $view->render($response, 'template.html.twig', [ 'page' => 'Slim Flash Messages', ]); }); $app->run();
在模板中
{% for msg in flash('messages') %} <div class="alert alert-{{ msg.alert }} alert-dismissible fade show" role="alert"> {{ msg.text }} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> {% endfor %}
运行这些示例
运行这些示例的最简单方法是使用 Docker。
git clone https://github.com/WilliamSampaio/Slim-Flash-Messages.git
cd Slim-Flash-Messages
docker compose up -d --build
当完成 up 进程后,访问
- 示例 1: https://:8080/example1/
- 示例 2: https://:8080/example2/
- 代码覆盖率: https://:8080/coverage/index.html
自定义 Twig 函数
FlashTwigExtension
为你的 Twig 模板提供以下函数。
flash()
它接受两个可选参数,key
(字符串/null = null) 和 clear
(布尔 = true)。
key
: 如果未指定,将返回包含存储中所有数据的数组,否则只返回按键值索引的数据数组。clear
: 如果为 false,则函数调用后不会从存储中删除项目。
{% for msg in flash('messages', false) %} <div class="alert alert-{{ msg.alert }} alert-dismissible fade show" role="alert"> {{ msg.text }} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> {% endfor %}
flash_first()
它接受两个参数,key
(字符串) 和 remove
(布尔 = true)。
key
: 返回数组中按键值索引的第一个项目。remove
(可选): 如果为 false,则函数调用后不会从存储中删除项目。
{% set first = flash_first('messages') %} <div class="alert alert-{{ first.alert }} alert-dismissible fade show" role="alert"> {{ first.text }} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div>
flash_last()
它接受两个参数,key
(字符串) 和 remove
(布尔 = true)。
key
: 返回数组中按键值索引的最后一个项目。remove
(可选): 如果为 false,则函数调用后不会从存储中删除项目。
{% set last = flash_last('messages') %} <div class="alert alert-{{ last.alert }} alert-dismissible fade show" role="alert"> {{ last.text }} <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div>
flash_has()
它接受一个参数,key
(字符串)。检查存储中是否定义了键。返回 true
或 false
。
key
: 将要检查的键。
{{ flash_has('messages') ? 'exists!' : "it doesn't exist..." }}
flash_clear()
它接受一个可选参数,key
(字符串)。从存储中删除数据。返回 void
。
key
(可选): 将要删除的键。如果未定义,则删除存储中的所有数据。
{{ flash_clear('messages') }}
测试
要执行测试套件,您需要克隆存储库并安装依赖项。
git clone https://github.com/WilliamSampaio/Slim-Flash-Messages.git cd Slim-Flash-Messages composer install composer test # Or # composer coverage
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件。