在我的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的问题解决这个问题。
答案 0 :(得分:6)
默认情况下,Twig将转义HTML以防止任何注入。
您必须添加一个阻止HTML转义的过滤器。
{{ flashMessage|raw }}
答案 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 %}