Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否有任何方法可以在不在每个操作中传递变量的情况下向基本模板添加内容?_Php_Symfony_Twig - Fatal编程技术网

Php 是否有任何方法可以在不在每个操作中传递变量的情况下向基本模板添加内容?

Php 是否有任何方法可以在不在每个操作中传递变量的情况下向基本模板添加内容?,php,symfony,twig,Php,Symfony,Twig,在Python的Django中,有一种称为上下文处理器的东西,它在每个请求之前被调用。例如,通过这种方式,可以从数据库加载动态导航。当然,此导航显示在每个页面上,没有人希望手动为每个页面执行此操作 Symfony中是否有与这些上下文处理器等价的处理器 我的一个想法是使用ajax发出请求,但这似乎并不十分专业。在Symfony中,我们有一些侦听器正在侦听事件 你可以在这里获得更多信息 如果需要将一些数据从数据库传递到每个细枝模板,则可以创建细枝扩展。比如说 <?php namespace

在Python的Django中,有一种称为
上下文处理器的东西,它在每个请求之前被调用。例如,通过这种方式,可以从数据库加载动态导航。当然,此导航显示在每个页面上,没有人希望手动为每个页面执行此操作

Symfony中是否有与这些上下文处理器等价的处理器


我的一个想法是使用ajax发出请求,但这似乎并不十分专业。

在Symfony中,我们有一些侦听器正在侦听事件 你可以在这里获得更多信息

如果需要将一些数据从数据库传递到每个细枝模板,则可以创建细枝扩展。比如说

<?php

namespace App\Twig;

use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class SomeExtension extends AbstractExtension
{
    private $repository;

    public function __construct(SomeRepository $repository)
    {
        $this->repository = $repository;
    }

    public function getFunctions()
    {
        return [
            new TwigFunction('getWhatEver', [$this, 'getWhatEver']),
        ];
    }

    public function getWhatEver(): array
    {
        return $this->repository->getWhatEver();
    }
}

因此,您不想将不属于控制器函数的内容传递给控制器,只想将其传递给渲染函数/返回视图

例如,Symfony为twig定义了几个默认变量:
app
就是其中之一

它还定义了一个过滤器
trans
,它显然不是twig的一部分

请看一下如何使用。为它提供构建导航所需的参数(通过依赖项注入),定义并添加返回导航数据的细枝函数。确保自动加载细枝扩展,然后使用该函数检索导航数据并在模板中构建导航,而无需将任何内容从控制器传递到模板。(您可能希望将app.request传递给您创建的细枝函数,或者传递一些其他内容,但这超出了此处的范围)

替代解决方案:

symfony内核事件的事件监听器,它向包含数据的细枝(或检索数据的对象)添加全局变量


我不认为这是一个干净的解决方案,因为这个侦听器也请求/创建导航数据,即使调用只检索JSON/二进制/…来自api控制器或其他东西的数据。(如果不是在每个请求上构建数据,而是等待模板请求数据,则不太明显)

您应该将您的实体声明为服务并使用自定义标记(),通过这样做,您应该缩写为列出所有实体。通过扩展,您可以创建动态导航