Установите локальный путь файла от имени шаблона TWIG

StackOverflow https://stackoverflow.com/questions/9330170

  •  27-10-2019
  •  | 
  •  

Вопрос

Каковы программные шаги, чтобы повернуть эту строку:

AcmeProjectBundle::home.html.twig

в это?

/path/Symfony/src/Acme/ProjectBundle/Resources/views/home.html.twig
Это было полезно?

Решение

Если вы хотите получить путь от контроллера, вы можете использовать этот код:

$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

Другие советы

(Чтобы расширить ответ молекулярного человека)

Для людей, нуждающихся в этом в Symfony 4:

Сервис templating.name_parser больше не зарегистрирован как таковой по умолчанию, и вам нужна зависимость 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'));
        //...
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top