的一種方法,以便能夠使用{% break %}
或{% continue %}
是寫TokenParser
對於他們。
我在下面的代碼中使用了{% break %}
令牌。您可以在不做太多修改的情況下爲{% continue %}
做同樣的事情。
的appbundle \嫩枝\ AppExtension.php:
namespace AppBundle\Twig;
class AppExtension extends \Twig_Extension
{
function getTokenParsers() {
return array(
new BreakToken(),
);
}
public function getName()
{
return 'app_extension';
}
}
的appbundle \嫩枝\ BreakToken.php:
namespace AppBundle\Twig;
class BreakToken extends \Twig_TokenParser
{
public function parse(\Twig_Token $token)
{
$stream = $this->parser->getStream();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
// Trick to check if we are currently in a loop.
$currentForLoop = 0;
for ($i = 1; true; $i++) {
try {
// if we look before the beginning of the stream
// the stream will throw a \Twig_Error_Syntax
$token = $stream->look(-$i);
} catch (\Twig_Error_Syntax $e) {
break;
}
if ($token->test(\Twig_Token::NAME_TYPE, 'for')) {
$currentForLoop++;
} else if ($token->test(\Twig_Token::NAME_TYPE, 'endfor')) {
$currentForLoop--;
}
}
if ($currentForLoop < 1) {
throw new \Twig_Error_Syntax(
'Break tag is only allowed in \'for\' loops.',
$stream->getCurrent()->getLine(),
$stream->getSourceContext()->getName()
);
}
return new BreakNode();
}
public function getTag()
{
return 'break';
}
}
的appbundle \枝杈\ BreakNode。PHP:
namespace AppBundle\Twig;
class BreakNode extends \Twig_Node
{
public function compile(\Twig_Compiler $compiler)
{
$compiler
->write("break;\n")
;
}
}
然後,你可以簡單地使用{% break %}
走出循環是這樣的:
{% for post in posts %}
{% if post.id == 10 %}
{% break %}
{% endif %}
<h2>{{ post.heading }}</h2>
{% endfor %}
要走得更遠,你可以寫令牌解析器{% continue X %}
和{% break X %}
(其中X是> = 1的整數)至get out/continue multiple loops like in PHP。
@Peter它可以」 t是你的問題的重複,因爲這個問題被問及你的前一年:) –
Touché。我立場糾正。 – Peter
@RupaliPemare看看日期,*你的*鏈接是這個問題的重複:) –