是否可以在Flash消息中添加链接?

时间:2015-09-29 13:52:47

标签: php symfony

在我的Symfony控制器中,我通过FlashBag提供错误消息,如下所示:

$this->get('session')->getFlashBag()->add('error', 'The code you provided didn\'t match what we expected.');

这会呈现预期的输出,是否可以添加链接?所以我可以输出如下信息:

  

您提供的代码与我们的预期不符,如果您遇到问题,请考虑查看common problems and how to solve them.

我已经尝试使用markdown和HTML语法添加它,但这些都不起作用,the documentation on the feature没有说明它是否可行,并且目前没有关于SO的问题解决这个问题。

3 个答案:

答案 0 :(得分:6)

默认情况下,Twig将转义HTML以防止任何注入。

您必须添加一个阻止HTML转义的过滤器。

{{ flashMessage|raw }}

http://twig.sensiolabs.org/doc/filters/raw.html

答案 1 :(得分:2)

除了在一个实例中手动创建一个安全字符串,然后为您的Flash消息使用> Task :app:installDebug FAILED Skipping device 'emulator-5554' (emulator-5554): Device is OFFLINE. FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installDebug'. > com.android.builder.testing.api.DeviceException: No online devices found. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 6m 5s 28 actionable tasks: 1 executed, 27 up-to-date Could not install the app on the device, read the error above for details. Make sure you have an Android emulator running or a device connected and have set up your Android development environment: https://facebook.github.io/react-native/docs/getting-started.html 过滤器来处理 all 之外,您还可以创建一个Twig_Markup对象(例如,参见{ {3}}和this StackOverflow答案),然后将其放入Flash包中。

(下面的代码是Chris答案的扩展。)

错误:使用raw(适用于所有即时消息)

raw
// PHP Controller
$newPageUrl = $this->generateUrl('core_page_id',['id'=>$page->getId()]);
$this->addFlash('success',
    sprintf('Page updated! <a href="%s">View page</a>', $newPageUrl)
);

更好:使用<!-- your Twig template --> {% for message in app.flashes('success') %} <div class="flash-notice alert alert-success"><i class="fa fa-check"></i> {{ message|raw }}</div> {% endfor %}

这种方法通常不会绕过Twig的转义机制 ,它可以使控制器逻辑和模板设计更加清晰地分离。

PHP代码中没有内置HTML标记:

Twig_Markup

您可以将所有您熟悉和喜爱的Twig功能用于您的Flash消息:

// PHP Controller
$this->addFlash('success',
    new Twig_Markup($this->renderView('flashes/page_update.html.twig', ['page' => $page]), 'UTF-8')
);

基本模板保留了干净的消息显示逻辑,并且仍具有自动转义功能:

<!-- flashes/page_update.html.twig -->
Page updated! <a href="{{ path('core_page_id', {id:page.id}) }}">View page</a>

答案 2 :(得分:0)

来自控制器的完整示例。

/**
 * @Route("/page/{id}/edit", name="core_page_edit")
 * @param Request $request
 * @param Page $page
 *
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function editAction(Request $request, Page $page)
{
    $pageForm = $this->createForm(PageType::class,$page);

    $pageForm->handleRequest($request);
    if($pageForm->isSubmitted() && $pageForm->isValid()){
        /** @var Page $page */
        $page = $pageForm->getData();
        $page->setAuthor($this->getUser());
        $page->setCreatedOn(new \DateTime('now'));
        $em = $this->getDoctrine()->getManager();
        $em->persist($page);
        $em->flush();

        $newPageUrl = $this->generateUrl('core_page_id',['id'=>$page->getId()]);
        // Create success messsage
        $this->addFlash( 'success',
            sprintf('Page updated! <a href="%s">View page</a>', $newPageUrl)
        );

    }

    return $this->render(':core/frontend/pages:edit.html.twig',[
        'pageForm'=>$pageForm->createView(),
        'pageDetails'=>$page
    ]);
}

然后在twig文件中,像这样处理原始HTML。

{% for message in app.flashes('success') %}
    <div class="flash-notice alert alert-success"><i class="fa fa-check"></i> {{ message|raw }}</div>
{% endfor %}