【问题标题】:Converting spaghetti code to Twig将意大利面条代码转换为 Twig
【发布时间】:2017-04-20 14:17:13
【问题描述】:

需要将带有“意大利面条代码”的脚本转换为 Twig。阅读 Twig 文档并获得基础知识。但是,我需要有关如何正确执行所有操作的建议,因此以后不需要重新转换。假设当前脚本如下所示:

文件索引.php:

<?php
$page_message="do it";

function display_dropdown($max)
    {
    for ($i=0; $i<$max; $i++)
        {
        echo "<option value='$i'>Option $i</option>";
        }
    }
?>
<!DOCTYPE html>
<html>
<body>
<h1><?php echo $page_message; ?></h1>
<form method="post" action="<?php echo basename($_SERVER["SCRIPT_FILENAME"]); ?>">
<select name="whatever"><?php display_dropdown(10); ?></select>
<input type="submit" value="go">
<?php include("footer.php");?>
</body>
</html>

footer.php 看起来:

<?php
$footer_text="blah blah";
?>
<footer><?php echo $footer_text; ?></footer>

据我了解,我的 index.php 转换为 Twig 后应该是这样的:

<?php
$page_message="do it";

function display_dropdown($max)
    {
    for ($i=0; $i<$max; $i++)
        {
        echo "<option value='$i'>Option $i</option>";
        }
    }



$twig_params_array=array("page_message"=>$page_message, "footer_text"=>"blah blah");

require_once("../lib/Twig/Autoloader.php");
Twig_Autoloader::register();
$loader=new Twig_Loader_Filesystem("templates");
$twig=new Twig_Environment($loader);


echo $twig->render("index_template.html", $twig_params_array);
?>

然后我应该使用以下代码创建index_template.htmlfooter_template.html(或其他):

index_template.html

<!DOCTYPE html>
<html>
<body>
<h1>{{ page_message }}</h1>
<form method="post" action="{{ _self }}>">
<select name="whatever"><?php display_dropdown(10); ?></select>
<input type="submit" value="go">
{{ include('footer_template.html') }}
</body>
</html>

footer_template.html

<footer>{{ footer_text }}</footer>

如果我理解正确,也可以在 Twig 模板中“包含”函数(在模板中进行一些调整),所以我不需要重写现有的 PHP 函数,如 display_dropdown()。因为下拉菜单暂时没有显示...

我关心的是带有变量的数组(传递给 Twig render 函数)。我错过了什么,还是真的需要在 Twig 工作之前手动定义每个变量(如$page_message$footer_text)?

这似乎有很多工作要做,因为在“意大利面条代码”中,如果我在某处定义变量,我可以随时使用echo 函数访问它。现在,看起来我需要查看 PHP 代码中存在的每个变量,并手动将其传递给 Twig 参数数组。真的吗?

【问题讨论】:

    标签: symfony twig


    【解决方案1】:

    由于没有提供解决方案,我自己找到了。您所要做的就是使用这样一行代码,因此您在 PHP 文件中的所有变量(包括包含的文件)都可以在 Twig 模板中使用,并且在添加新变量时无需重新编写任何内容稍后到 PHP 文件(它们也自动在 Twig 中可用):

    echo $twig->render("template_file_name.extension", get_defined_vars());
    

    【讨论】:

    • 你能分享更多关于你是如何做到这一点的吗?我正在尝试做同样的事情,但没有完全遵循您的解决方案。
    【解决方案2】:

    Mindaugas,仅仅改变你用来渲染视图的技术并不会减少代码的纠结。

    我认为您应该更进一步,通过使用 MVC 框架(例如 Symfony,它使用 Twig 作为其默认模板语言)来划分职责。

    祝你好运!

    【讨论】:

    • 感谢您的意见。我现在没有迫切需要使用 Symfony 框架,但是将当前脚本转换为 Twig 确实已经有所作为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2012-01-26
    • 2011-10-13
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多