Symfony 方法在 Twig 模板中的结果

问题描述 投票:0回答:2

问题是——如何从 Twig 模板中的服务中获取结果?

版本: 交响乐 6.1.12 PHP 8.1.6

我有 Navigation 类,它使用 getNavigation() 方法返回 Navigation 数组:

namespace App\Service;

use Symfony\Component\Routing\RouterInterface;

class Navigation
{
    private RouterInterface $router;
    private array $navigation = [];

    public function __construct(RouterInterface $router)
    {
        $this->router = $router;

        $this->setNavigation();
    }

    public function setNavigation(array $nav = []): void
    {
        $this->navigation = $nav;

        if(empty($this->navigation)) {
            $this->navigation = [
                'Home' => $this->router->generate('homepage'),
                'Products' => $this->router->generate('products'),
                'Contacts' => $this->router->generate('contacts'),
            ];
        }
    }
    
    public function getNavigation(): Array
    {
        return $this->navigation;
    }
}

现在它通过调用每个控制器中的类来工作(例如:)

public function __construct(Navigation $navigation)
    {
        $this->navigation = $navigation;
    }

// #[Route('/', name: 'homepage')]
    public function index(): Response
    {
        return $this->render('home/index.html.twig', [
            'navigation' => $this->navigation->getNavigation(),
        ]);
    }

是否有可能在

nav.html.twig template
中访问该服务而无需每次都调用该实例?

我尝试通过

将服务保存在services.yaml中
services:
    app.navigation:
        class: App\Service\Navigation

然后在树枝中通过

{{ app.navigation.getNavigation() }}
获取访问权限,但它不起作用。

提前感谢您的回答。

php symfony twig
2个回答
0
投票

有2种方法。

  1. Twig 全球。您可以将您的服务设置为全局树枝。如果您调用该服务的每个页面都会很好。 Symfony Twig Globals
config/packages/twig.yaml
twig:
#...
globals:
    #the value is the service's id
    navigation: '@App\\Service\\Navigation' // maybe service id app.navigation

在树枝中使用它:

    {{navigation.getNavigation()}}
  1. Twig 运行时。您可以创建运行时类和树枝扩展类。然后懒惰地在你的树枝中调用那个函数 Symfony 懒惰的树枝扩展

我认为你应该改变服务定义方法。看看Symfony服务


0
投票

在我看来最好的方法是写一个树枝扩展并调用服务类

https://symfony.com/doc/current/templates.html#writing-a-twig-extension

// App/Twig/NavigationExtension.php
namespace App\Twig;

use App\Service\Navigation;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;

class NavigationExtension extends AbstractExtension
{
    private $navigation;

    public function __construct(Navigation $navigation)
    {
        $this->navigation = $navigation;
    }

    public function getFilters(): array
    {
        return [];
    }

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

    public function getNavigation()
    {
        return $this->navigation->getNavigation();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.