我在 Ubuntu 17.04 上运行 apache 和 php 我正在使用树枝。我像这样安装了 Twig。
cd /var/www/html/my-new-website
composer install twig/twig
composer require twig/twig
在这一点上,我一直在使用Twig的方式是:首先我创建一个php文件并做一些事情,创建一个数组并使用数组数据渲染模板。接下来,我将页面的各个部分分开并将它们放在模板中。
下面是一个示例索引.php它创建一个目录数组,然后使用位于模板目录中的 files.html.twig 呈现它。
<?php
require_once 'vendor/autoload.php';
$loader = new Twig_Loader_Filesystem('templates');
$twig = new Twig_Environment($loader, array(
'cache' => 'cache',
));
$dir = "path/to/dir";
$exclude = array( ".","..",".*","index.php" );
$files = array_diff(scandir($dir), $exclude);
/*
echo ''; print_r($files);
*/
$template = $twig->loadTemplate('files.html.twig');
echo $template->render(['files' => $files]);
?>
这是文件.html.twig,它扩展了"base.html.twig">
{% extends "base.html.twig" %}
{% block title %}
My Directory Listing
{% endblock %}
{% block content %}
{% for file in files %}
<li><a href="{{ file | url_encode }}">{{ file }}</a></li>
{% endfor %}
{% endblock %}
基.html.twig 包含带有导航栏和页脚的主包装器。这一切都按预期工作。
现在我的 base.html.twig 中有导航栏,它只是 html,我必须在其中编辑项目。
我做了一个php函数来获取在模板(navbar.html.twig(中工作的导航栏数组,但问题是我必须在我创建的每个页面中放置或包含这个php函数。我希望我的导航栏.html.twig 模板直接从 php 函数中获取数组。
我相信我需要创建一个树枝扩展(php 函数(并注册它。 我已经阅读了有关此的文档(似乎都是为了完整的symfony安装,我只使用树枝(。
我认为这篇文章走在正确的道路上,但没有给我理解从 Twig 模板调用 PHP 函数所需的信息
我没有得到
- 把我的PHP函数放在哪里?我可以只创建一个名为扩展的文件夹并将导航栏列表功能.php文件放入其中吗?
- 在哪里注册函数以便可以从模板调用它? 一些文档说要在app/config/services.yml中注册(我没有这个文件或目录(
- 在我把php函数放在一个可识别的地方后,然后正确注册它,...如何在模板导航栏中调用返回的数组.html.twig?
来自评论
如果你没有使用像symfony这样的框架,那么根据你如何处理这种情况,它有点味道。我,我自己,我正在我的项目中使用命名空间来启用作曲家的自动加载。我的树结构只遵循我的命名空间,例如My/Project/Twig/Extensions
扩展Twig
的"最佳"方法是使用Twig_Extension
类 只需使用适当的名称在您创建的文件夹中放置一个新文件
注意:从Twig 2.X关闭,功能getName()
不再是强制性的
My/Project/Twig/Extensions/ProjectTwigExtension.twig
namespace My/Project/Twig/Extensions
class ProjectTwigExtension extends Twig_Extension {
public function getFunctions() {
return array(
new Twig_SimpleFunction('twig_function_name', array($this, 'getTwigFunctionName')),
new Twig_SimpleFunction('twig_function_foo', array($this, 'getTwigFunctionFoo')),
//and so on....,
);
}
public function getFilters() {
return array(
new Twig_SimpleFilter('twig_filter_name' , array($this, 'getTwigFilterName')),
new Twig_SimpleFilter('twig_filter_foo' , array($this, 'getTwigFilterFoo')),
//and so on....,
);
}
public function getName() {
return 'ProjectTwigExtension'; //this is mandatory for twig < 2.0
}
}
通过使用扩展类,您可以轻松地对所有函数/过滤器/节点/全局/...创建此类后,您需要做的就是在Twig
中注册该类。由于我不知道您需要在项目中查看
$twig = new Twig_Environment($loader);
要注册类,只需使用以下行,
$twig->addExtension(new ProjectTwigExtension());
扩展类可以有一个函数getFunctions
,在这里你可以定义你想要的所有函数。
new Twig_SimpleFunction('twig_function_name', $callable)
第一个参数定义如何在树枝模板中调用函数,第二个参数是可调用的
new Twig_SimpleFunction('twig_function_name', array($this, 'method'))
将在当前扩展类中调用method
函数new Twig_SimpleFunction('twig_function_name', 'trim')
将调用全局函数trim
new Twig_SimpleFunction('twig_function_name', array($obj, 'method'))
将调用实例的函数method
$obj
new Twig_SimpleFunction('twig_function_name', array('MyClass', 'method'))
将从MyClass
调用静态函数method
new Twig_SimpleFunction('twig_function_name', function($arg1, $arg2) { // ...; })
将执行闭包