Как использовать флеш-сообщения в Symfony 3 (в контроллере и в представлении Twig)

Система, которая не замечает пользователя о том, что он делает, просто отстой. Это основная причина, по которой вам всегда следует внедрять какую-то систему уведомлений в вашем проекте, какой бы она ни была, например, с JavaScript или просто добавляя некоторую дополнительную разметку к вашему документу с вашим любимым языком сервера. В Symfony вы можете использовать полезную флеш-систему, которая позволяет устанавливать пользовательские сообщения с пользовательской категорией в сеансе посетителя.

В вашем контроллере Symfony они довольно полезны для хранения специальных сообщений, которые должны отображаться, когда пользователь посещает представление. Он называется флэш-сообщением, потому что он хранится в сеансе (ему все равно, вошел ли он в систему или нет), и как только пользователь посетит (или перенаправится) другой маршрут вашего проекта, он может быть обработан вами (показано на вид) и тогда оно исчезнет. Короче говоря, они исчезают из сеанса автоматически, как только вы их извлекаете. Эта функция делает «флеш» сообщения особенно полезными для хранения пользовательских уведомлений. В этой статье мы покажем вам, как легко использовать и отображать флэш-сообщения в вашем приложении Symfony 3.

1. Как создавать флеш сообщения

Чтобы добавить флэш-сообщение в сеанс от ваших контроллеров, вам нужно будет использовать $this->addFlash метод. Этот метод уже доступен в вашем классе, если он расширяет класс контроллера Symfony. Метод flash работает следующим образом:

Заметка

Помните, что вы не можете использовать addFlash метод, если сеансы отключены.

/**
* Adds a flash message to the current session for type.
*
* @param string $type    The type
* @param string $message The message
*
* @throws \LogicException
*/
protected function addFlash($type, $message)

В старых версиях Symfony <2.7, необходимо было получить доступ к контейнеру, затем извлечь сеанс, из сеанса извлечь flashBag и, наконец, использовать метод add (который ожидает те же аргументы, что и addFlash так как $this->addFlash просто ярлык процесса, который вам нужно сделать в Symfony <2.7):

// Retrieve flashbag from the controller
$flashbag = $this->get('session')->getFlashBag();
// Add flash message
$flashbag->add($type, $message);

Хотя вы можете использовать addFlash Метод из контроллера, вы можете использовать способ Symfony 2.7 также в недавних проектах.

В следующем примере показано, как добавить несколько флэш-сообщений в вашем контроллере разных типов:

addFlash("success", "This is a success message");
// Adding a warning type message
$this->addFlash("warning", "This is a warning message");
// Adding an error type message
$this->addFlash("error", "This is an error message");
// Adding a custom type message, remember the type is totally up to you !
$this->addFlash("bat-alarm", "Gotham needs Batman");
// 2. Retrieve manually the flashbag
// Retrieve flashbag from the controller
$flashbag = $this->get('session')->getFlashBag();
// Set a flash message
$flashbag->add("other", "This is another flash message with other type");
// Render some twig view
return $this->render("default/index.html.twig");
}
}

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

addFlash("success", "This is the first success message");
$this->addFlash("success", "This is the second success message");
// Adding 2 error type messages
$this->addFlash("error", "This is the first error message");
$this->addFlash("error", "This is the second error message");
// Render some twig view
return $this->render("default/index.html.twig");
}
}

Если вы хотите сразу же узнать, как их показать, перейдите к шагу 3.

2. Как убрать флеш сообщения

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

get('session')->getFlashBag();
// Set a flash message
$flashbag->add("bat-alarm", "Gotham needs Batman");
// Retrieves the value (that isn't being assigned to a variable)
// and therefore is "deleted" from the flashbag
$flashbag->get("bat-alarm");
// Render some twig view
return $this->render("default/index.html.twig");
}
}

Теперь в представлении, bat-alarm type больше не будет отображаться в представлении, так как он был получен ранее (удален).

3. Отображение флеш-сообщений

В зависимости от того, как вы добавили сообщения, существует 2 способа отображения флэш-сообщений:

Новое в Symfony версии 3.3

app.flashes() Функция ветки была введена в Symfony 3.3.

Отображать по типу

В Symfony> 3.3 вы можете указать тип вспышек, которые вы хотите отобразить в виде первого аргумента в функции вспышек приложения:

{% for message in app.flashes('success') %}
{{ message }}
{% endfor %}

В Symfony 3.X < 3.3 you can display all the messages from a predefined type in your view by providing it as first argument to the get function of the Объект в сеансе:

{% for flash_message in app.session.flashBag.get('success') %}
{{ flash_message }}
{% endfor %}

Вам нужно будет только изменить тип и все.

Показать все флеш-сообщения

Лень фильтровать вид сообщений в представлении? Затем автоматизируйте задачу, настроив класс div в качестве категории флэш-сообщения, которое будет отображаться в представлении, а затем перебирать все сообщения флэш-мешка в Twig. Этот пример отлично работает с Bootstrap, так как alert alert- класс, который отображает div оповещения с пользовательскими цветами на странице:

{% for label, messages in app.flashes %}
{% for message in messages %}
{{ message }}
{% endfor %}
{% endfor %}

Если вы используете Symfony 3.X < 3.3, then you can iterate through the объект также:

{% for label, flashes in app.session.flashbag.all %}
{% for flash in flashes %}
{{ flash }}
{% endfor %}
{% endfor %}
Ссылка на основную публикацию
Adblock
detector