如何使用 Twig 创建扩展



我在 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 函数所需的信息

我没有得到

  1. 把我的PHP函数放在哪里?我可以只创建一个名为扩展的文件夹并将导航栏列表功能.php文件放入其中吗?
  2. 在哪里注册函数以便可以从模板调用它? 一些文档说要在app/config/services.yml中注册(我没有这个文件或目录(
  3. 在我把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) { // ...; })
    将执行闭包

最新更新