Поэтому я недавно решил преобразовать свое приложение 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? Или я должен даже использовать их, есть ли лучшая альтернатива, которая может сделать ту же работу?
Глядя на источник позвонить getMessages()
возвращает массив. Если вы хотите только одно сообщение, вы можете использовать getMessage()
, Например getMessage("error")
,
Для тех, кто столкнулся с этой проблемой: Slim возвращает вложенный массив, и вам нужно перебрать оба.
foreach ($messages as $singlemessage) {
foreach ($singlemessage as $m) {
print("<li>{$m}</li>");
}
}
Это будет принимать каждый набор сообщений, а затем распечатывать каждое сообщение внутри него в отдельности. Ошибка «Примечание: преобразование массива в строку» буквально говорит вам, что вы пытаетесь напечатать массив как строку, а вы не можете.
Вам нужно добавить $container['flash']
на ваш view
например:twig
, Если вы используете TWIG для визуализации представлений, вы добавляете его так $view->getEnvironment()->addGlobal('flash', $container['flash']);
Тогда внутри вас вид {% flash.getMessage('error') %}
Попробуй это
$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 %}