Slim 3 — обновленные Flash-сообщения, возвращающие два значения массива

Поэтому я недавно решил преобразовать свое приложение Slim2 в более новую 3-ю версию, многие приложения были изменены, и так далее.

Другое дело, что флеш-сообщения были удалены из основной структуры, поэтому я решил пойти и добавить их обратно с помощью composer, я понял, что они тоже изменились, и по какой-то причине я получаю массив с двумя значениями, а не с одним.

$container['flash'] = function ($c) {
return new \Slim\Flash\Messages();
};

$this->app->flash->addMessage('error', 'hello');

$flash = $this->flash->getMessages();
print_r($flash); // returns Array ( [error] => Array ( [0] => hello [1] => hello ) )

Мой шаблон, очевидно, тоже жалуется на это, так как он не того типа

Notice: Array to string conversion in cache\66\664fc695876aa16573ce7a84cfe29c998af42da36e69199f149219a4e821d44a.php on line 80 Array

Как я могу использовать флеш-сообщения так же, как их использовал Slim2? Или я должен даже использовать их, есть ли лучшая альтернатива, которая может сделать ту же работу?

1

Решение

Глядя на источник позвонить getMessages() возвращает массив. Если вы хотите только одно сообщение, вы можете использовать getMessage(), Например getMessage("error"),

0

Другие решения

Для тех, кто столкнулся с этой проблемой: Slim возвращает вложенный массив, и вам нужно перебрать оба.

foreach ($messages as $singlemessage) {
foreach ($singlemessage as $m) {
print("<li>{$m}</li>");
}
}

Это будет принимать каждый набор сообщений, а затем распечатывать каждое сообщение внутри него в отдельности. Ошибка «Примечание: преобразование массива в строку» буквально говорит вам, что вы пытаетесь напечатать массив как строку, а вы не можете.

0

Вам нужно добавить $container['flash'] на ваш view например:twig, Если вы используете TWIG для визуализации представлений, вы добавляете его так $view->getEnvironment()->addGlobal('flash', $container['flash']);

Тогда внутри вас вид {% flash.getMessage('error') %}

0

Попробуй это

$container['flash'] = function ($container) {
return new \Slim\Flash\Messages;
};

$container->flash->addMessage('error', 'hello');

$flash = $container->flash->getMessage('error');

var_dump($flash);

getMessages() возвращает все сообщения и getMessage($key) вернуть только сообщение с определенным $key для этого примера error;

Если вы хотите получить доступ к флеш-объекту в вашей ветке, вы можете сделать для него промежуточное ПО, например: FlashMiddleware

class FlashMiddleware extends Middleware
{
public function __invoke($request, $response, $next)
{
$this->view->getEnvironment()->addGlobal('flash', $this->flash);

return $next($request, $response);
}
}

для базового промежуточного программного обеспечения

class Middleware
{
protected $container;

public function __construct($container)
{
$this->container = $container;
}

public function __get($property)
{
if (isset($this->cotainer->{$property})) {
return $this->cotainer->{$property};
}
// otherwise error
}
}

Наконец, внутри вашей ветки, вы можете сделать это

{% if flash.hasMessage('error') %}
{{ flash.getMessage('error') | first }}
{% endif %}
0
По вопросам рекламы [email protected]