PHP __LINE__ equivalent for twig



有一种方法可以使PHP__LINE__等效于Twig吗?

几乎不可能在谷歌上搜索__LINE__作为确切的单词。。。

其目的纯粹是为了调试一个包含复杂Js代码中嵌套的twitch代码的长twitch文件,使其成为console.logit。

我使用的trick版本是2.12.5

感谢

第一件事:

如PHP文档中所示,(magic(常量将返回文件的当前行号
;"问题";这里是CCD_ 6将模板转换为CCD_。

这意味着,如果你真的能够在模板中使用__LINE__,无论你是否启用了缓存,它都会从临时PHP文件或缓存的PHP文件中报告行号。

TLDR:在模板内使用__LINE__将报告";false"/无用的信息。


然而,您可以轻松地扩展twig,甚至引入新的标签,然后可以在模板中使用这些标签。这些自定义标记允许您修改/更改模板的PHP文件的编译。

这里有趣的部分是;编译器";能够提供您的自定义标记,该标记是在哪一行上调用的。

我们甚至可以创建一个自定义标记,将其注册到twig,并让标记返回解析模板中的行号。

步骤1-创建一个TokenParser

TokenParser负责解析模板,并允许您为标签选择一个名称。下面的代码将负责创建一个名为line的简单空标签

<?php
namespace MyProjectBaseTwigTokenParser;
use MyProjectBaseTwigNodeLine as LineNode;
class Line extends Twig_TokenParser {
public function parse(Twig_Token $token)
{
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
return new LineNode(new Twig_Node(), $token->getLine(), $this->getTag());
}
public function getTag()
{
return 'line';
}
}

步骤2-创建节点

Node负责将模板代码转换为实际的PHP代码

<?php
namespace MyProjectBaseTwigNode;
class Line extends Twig_Node {
public function __construct(Twig_NodeInterface $body, $lineno, $tag = null) {
parent::__construct(['body' => $body,], array(), $lineno, $tag);
}
public function compile(Twig_Compiler $compiler) {
$compiler->write('echo '.$this->getLine().';')
->write(PHP_EOL);
}
}

步骤3-使用twig注册标签

<?php
namespace MyProjectBaseTwig;
class MyProjectTwigExtension extends Twig_Extension {
public function getTokenParsers() {
return [
new CMS4UBaseTwigTokenParserLine(),
];
}
public function getName() {
return 'MyProjectTwigExtension';
}
}
<?php
$twig->addExtension(new MyProjectBaseTwigMyProjectTwigExtension());

如果一切正常,您现在可以在任何模板中的任何位置使用自定义标记{% line %}

Foo
Bar
FooBar
Current line number is {% line %} {# 4 #}

最新更新