Подтвердить что ты не робот

Silex: перенаправление с данными Flash

Мне нужно перенаправить одну страницу на другую с сообщением в Silex. Надеюсь, это ларавелезский способ сделать это, но я очень сомневаюсь в этом:

$app->redirect('/here', 301)->with('message', 'text');

Затем я хочу отобразить сообщение в своем шаблоне:

{{ message }}

Если нет, есть ли другой способ?

Update

Я вижу, что метод getFlashBag в Symfony - это то, что я должен использовать? В частности, я использую систему управления содержанием Bolt.

4b9b3361

Ответ 1

Да, FlashBag - правильный путь. Установите флеш-сообщение в контроллере (вы можете добавить несколько сообщений):

$app['session']->getFlashBag()->add('message', 'text');
$app->redirect('/here', 301)

И напечатайте его в шаблоне:

{% for message in app.session.getFlashBag.get('message') %}
    {{ message }}
{% endfor %}

Ответ 2

Я создал этот простой FlashBagTrait, который может быть полезен:

<?php
use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;

trait FlashBagTrait
{
    /**
     * @return FlashBagInterface
     */
    public function getFlashBag() {
        return $this['session']->getFlashBag();
    }
}

Просто добавьте его в класс Application, и он будет делать вещи когда-нибудь немного проще!

$app->getFlashBag()->add('message',array('type'=>"danger",'content'=>"You shouldn't be here"));

{% if app.flashbag.peek('message') %}
<div class="row">
    {% for flash in app.flashbag.get('message') %}
        <div class="bs-callout bs-callout-{{ flash.type }}">
            <p>{{ flash.content }}</p>
        </div>
    {% endfor %}
</div>
{% endif %}

Его основное преимущество заключается в том, что подсказка типа будет работать в PhpStorm.

Вы также можете добавить его как поставщика услуг,

$app['flashbag'] = $app->share(function (Application $app) {
    return $app['session']->getFlashBag();
});

Что делает его более удобным для использования с PHP (но вы теряете подсказку типа):

$app['flashbag']->add('message',array('type'=>"danger",'content'=>"You shouldn't be here"));