gpt4 book ai didi

php - 从 Symfony/Twig 中的覆盖版本访问父模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:13 24 4
gpt4 key购买 nike

我有一个第三方包 OriginalBundle,我想自定义其中的一些模板。

为此,我使用 the override method shown in the Symfony docs 设置了一个 Symfony 包 MyCustomBundle .

<?php

namespace My\CustomBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyCustomBundle extends Bundle
{
public function getParent()
{
return 'OriginalBundle';
}
}

然后我使用 MyCustomBundle 从 OriginalBundle 创建一些 Twig 模板的覆盖版本。但是,我希望能够从我的版本访问原始模板(例如扩展它)并覆盖一些 block 。

但是,如果我尝试做这样的事情:

{# MyCustomBundle:Foo:bar.html.twig #}

{% extends 'OriginalBundle:Foo:bar.html.twig' %}

{% block xyz %}
{# ... code in here ... #}
{% endblock %}

然后我得到一个白屏死机。我猜它会导致某种递归,因为 Symfony 正在将 extends 回调路由回自定义文件?

原始包的模板如下所示:

{# OriginalBundle:Foo:bar.html.twig #}

{% block abc %}
{% block xyz %}
{# ... code in here ... #}
{% endblock %}
{% endblock %}

所以问题...

当存在相同模板的覆盖版本时,是否有任何方法可以访问原始模板文件?

我基本上是在寻找与 parent::doSomething() 等价的 Twig/模板。

如果没有这种对父级的访问,我发现自己逐字复制整个原始模板文件,然后更新其中的一小部分,这感觉不对。

最佳答案

有一个解决方案。Symfony 默认搜索第一个匹配的资源并返回它。要更改此行为,您需要指定一些额外的语法。我用 ”!”达到第二场比赛。

{% extends '!OriginalBundle:Foo:bar.html.twig' %}

{% block xyz %}
{# ... code in here ... #}
{% endblock %}

覆盖文件可以在 app/Resources/OriginalBundle/views/Foo/bar.html.twig

要激活此系统,您需要覆盖原始内核以:

<?php
namespace Webility\Bundle\WebilityBundle\HttpKernel;

use Symfony\Component\HttpKernel\Kernel as BaseKernel;

abstract class Kernel extends BaseKernel
{
public function getBundle($name, $first = true)
{
$get_next = false;
if($name[0] == '!' && $first){
$name = substr($name, 1);
$first = false;
$get_next = true;
}

$bundles = parent::getBundle($name, $first);

if($get_next){
return isset($bundles[1]) ? $bundles[1] : $bundles[0];
} else {
return $bundles;
}
}

public function locateResource($name, $dir = null, $first = true)
{
$get_next = false;
if($name[0] == '@' && $name[1] == '!' && $first){
$name = '@'.substr($name, 2);
$first = false;
$get_next = true;
}

$files = parent::locateResource($name, $dir, $first);

if($get_next){
return isset($files[1]) ? $files[1] : $files[0];
} else {
return $files;
}
}
}

并在app/AppKernel.php中使用

class AppKernel extends \Webility\Bundle\WebilityBundle\HttpKernel\Kernel

关于php - 从 Symfony/Twig 中的覆盖版本访问父模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25038221/

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