有一种方法可以使PHP__LINE__
等效于Twig
吗?
几乎不可能在谷歌上搜索__LINE__
作为确切的单词。。。
其目的纯粹是为了调试一个包含复杂Js代码中嵌套的twitch代码的长twitch文件,使其成为console.log
it。
我使用的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 #}