williamsampaio/slim-flash-messages

Slim 框架 Flash 消息服务提供者

0.3.2 2024-08-14 01:07 UTC

This package is auto-updated.

Last update: 2024-09-15 20:46:02 UTC


README

Coveralls Packagist Version Packagist PHP Version Packagist Slim Version Packagist Downloads GitHub License

这个库允许你在 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 进程后,访问

自定义 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 (字符串)。检查存储中是否定义了键。返回 truefalse

  • 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)。有关更多信息,请参阅许可证文件