Symfony:如何让变量在每个页面上工作?

Symfony: How to make variable work on every page?

我对我的 Symfony 项目有疑问。

我有这段代码显示给定数据库中的行数 table:

// BudgetRepository
public function countBudgets()
{
  $qb = $this->createQueryBuilder('budget');
  return $qb
    ->select('count(budget.id)')
    ->getQuery()
    ->getSingleScalarResult();
}
// BudgetController
public function all(EntityManagerInterface $entityManager)
{
  $repository = $entityManager->getRepository(Budget::class);
  $count = $repository->countBudgets();
  return $this->render("budget/budget.html.twig", ['numberOfBudgets' => $count]);
}

有效,但仅在 budget/budget.html.twig 内有效 {{ numberOfBudgets }}

我怎样才能让它在每个页面上工作(具体来说,我想把它放在我名为 _sidebar.html.twig 的文件中?现在,如果我将 {{ numberOfBudgets }} 放在 _sidebar.html.twig 上,我会得到此错误消息“变量“numberOfBudgets”不存在”。

我该如何重写代码?

我会选择会话变量,查看 Symfony Session 以访问您的计数变量,但如果发生任何更改,请确保在会话中更新此变量。

public function index(EntityManagerInterface $em) 
{
    $count = $em->getRepository(Budget::class)->countBudgets();

    $session = $this->requestStack->getSession();
    $session->set('budgetCount', $count);
}

要访问您的 Twig 模板中的会话变量,请查看 App global variable

<p>Total budgets: {{ app;session.budgetCount }}</p>

您应该使用全局树枝变量。 将您的代码移至服务:

class BudgetService
{
    public function all(EntityManagerInterface $entityManager)
    {
        $repository = $entityManager->getRepository(Budget::class);
        return $repository->countBudgets();
    }
}

然后在twig配置中注册全局变量(config/packages/twig.yaml):

twig:
  globals:
    budget: '@App\Services\BudgetService'

然后您可以在任何模板中使用它,例如:

Total: {{ budget.all }}