【问题标题】:Resolve local file path from Twig template name从 Twig 模板名称解析本地文件路径
【发布时间】:2012-03-08 23:11:15
【问题描述】:

转这个字符串的程序步骤是什么:

AcmeProjectBundle::home.html.twig

喜欢这个吗?

/path/Symfony/src/Acme/ProjectBundle/Resources/views/home.html.twig

【问题讨论】:

  • 您要的是使用的算法吗?或者对于您可以调用的实际功能?请记住,这一切都是在“编译”阶段完成的,结果存储在缓存中。不是您通常会在运行时处理的事情。
  • twig/symfony 中使用的函数。
  • 查看 Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser
  • 嗯,vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/Loader/TemplateLocator.php 看起来很有希望
  • 我可以从控制器访问内核对象,或者至少可以引导我访问它吗?

标签: symfony twig


【解决方案1】:

如果您想从控制器中检索路径,您可以使用以下代码:

$parser = $this->container->get('templating.name_parser');
$locator = $this->container->get('templating.locator');

$path = $locator->locate($parser->parse('AcmeProjectBundle::home.html.twig'));

欲了解更多信息,请查看以下代码:

  • Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser::parse
  • Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator::locate

【讨论】:

    【解决方案2】:

    (扩大分子人的答案)

    对于在 Symfony 4 中需要此功能的人:

    默认情况下,templating.name_parser 服务不再注册,您需要 Composer 中的依赖项 symfony/templating 才能使用它。
    另外,现在建议不要直接使用容器来获取服务(更不用说新的 AbstractController 没有提供所有的服务),而是通过类型提示进行依赖注入。

    那么,让它与 Symfony 4 一起工作的方法:

    //...
    use Symfony\Bundle\FrameworkBundle\Templating\Loader\TemplateLocator;
    use Symfony\Bundle\FrameworkBundle\Templating\TemplateNameParser;
    
    class DefaultController extends AbstractController
    {
        public function indexAction(TemplateNameParser $parser, TemplateLocator $locator)
        {
            $path = $locator->locate($parser->parse('AcmeProjectBundle::home.html.twig'));
            //...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 2020-03-14
      • 2014-01-16
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      相关资源
      最近更新 更多