gpt4 book ai didi

php - 如何使用 Twig 创建扩展

转载 作者:行者123 更新时间:2023-12-05 05:19:40 24 4
gpt4 key购买 nike

我在 Ubuntu 17.04 上运行 apache 和 php我正在使用 Twig 。我是这样安装 Twig 的。

cd /var/www/html/my-new-website
composer install twig/twig
composer require twig/twig

此时我使用 Twig 的方式是:首先我创建一个 php 文件并做一些事情,创建一个数组并使用数组数据渲染模板。接下来,我将页面的各个部分分开,并将它们放入模板中。

这里是一个示例 index.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]);
?>

这里是 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 %}

base.html.twig 包含带有导航栏和页脚的主包装器。这一切都按预期工作。

现在我的 base.html.twig 中有导航栏,它只是我必须编辑项目的 html。

我已经创建了一个 php 函数来获取在模板 (navbar.html.twig) 中工作的导航栏数组,但问题是我必须在我创建的每个页面中放置或包含此 php 函数。我希望我的 navbar.html.twig 模板直接从 php 函数获取数组。

我相信我需要创建一个 Twig 扩展(php 函数)并注册它。我已经阅读了这方面的文档(似乎都是针对完整的 symfony 安装,我只使用 twig)。

我认为这篇文章走在正确的道路上,但没有提供我需要理解的信息Call PHP function from Twig template

我不明白

  1. 将我的 php 函数放在哪里?我可以只创建一个名为 extensions 的文件夹并在其中放置一个 navbar-list-funtion.php 文件吗?
  2. 在哪里注册函数以便从模板中调用它?一些文档说要在 app/config/services.yml 中注册(我没有这个文件或目录)
  3. 将 php 函数放在可识别的位置,然后正确注册后,...我将如何在模板 navbar.html.twig 中调用返回的数组?

最佳答案

来自评论

如果您没有使用像 symfony 这样的框架,那么根据您处理这种情况的方式,它会有点 flavor 。我,我自己,我在我的项目中使用命名空间来启用 composer 的自动加载。我的树结构仅遵循我的命名空间,例如我的/Project/Twig/Extensions

扩展 Twig 的“最佳”方法是使用 Twig_Extension 类只需将新文件放入您创建的文件夹中,并使用适当的名称


注意:从 Twig 2.X 开始,函数 getName() 不再是强制性的

我的/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);

要注册类(class),只需使用以下行,

$twig->addExtension(new ProjectTwigExtension());

因为你可以扩展类有一个函数getFunctions,在这里你可以定义你想要的所有函数。

new Twig_SimpleFunction('twig_function_name', $callable)

第一个参数定义函数在 twig 模板中的调用方式,第二个参数是 callable

  • new Twig_SimpleFunction('twig_function_name', array($this, 'method'))
    将调用当前扩展类中的函数方法
  • new Twig_SimpleFunction('twig_function_name', 'trim')
    会调用全局函数trim
  • new Twig_SimpleFunction('twig_function_name', array($obj, 'method'))
    会调用$obj实例的函数method
  • new Twig_SimpleFunction('twig_function_name', array('MyClass', 'method'))
    将从MyClass
  • 调用静态函数 方法
  • new Twig_SimpleFunction('twig_function_name', function($arg1, $arg2) {//...; })
    将执行闭包

关于php - 如何使用 Twig 创建扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com