Какой у вас опыт использования Smarty в Symfony-проектах?

Ответ

Я работал с интеграцией Smarty в Symfony при поддержке legacy-проекта, который изначально был написан на чистом PHP со Smarty и постепенно мигрировал на Symfony. Основные шаги по интеграции: 1. Установка бандла `smarty/smarty-bundle` через Composer. 2. Настройка в `config/packages/smarty.yaml`: ```yaml smarty: options: template_dir: '%kernel.project_dir%/templates/' compile_dir: '%kernel.project_dir%/var/cache/smarty/compile/' cache_dir: '%kernel.project_dir%/var/cache/smarty/cache/' ``` 3. Использование в контроллере аналогично Twig: ```php // src/Controller/ProductController.php class ProductController extends AbstractController { public function show(int $id): Response { $product = $this->getDoctrine()->getRepository(Product::class)->find($id); return $this->render('product/show.tpl', [ 'product' => $product, 'features' => $product->getFeaturesAsArray() ]); } } ``` **Пример шаблона `templates/product/show.tpl`:** ```smarty {extends file='layout/base.tpl'} {block name='title'}Детали товара: {$product.name}{/block} {block name='content'}

{$product.name|escape}

Цена: {$product.price|number_format:2} руб.

{if !empty($features)}

Характеристики:

    {foreach $features as $key => $value}
  • {$key|capitalize}: {$value}
  • {/foreach}
{/if} {include file='partials/add_to_cart.tpl' product_id=$product.id} {/block} ``` **Сложности и выводы:** * Интеграция с системой форм Symfony не такая глубокая, как у Twig. Приходилось больше работать вручную. * Нет встроенной поддержки Webpack Encore для тегов `{{ asset() }}` или `{{ encore_entry_script_tags() }}`, что усложняло управление активами. * Хотя Smarty знаком команде, для новых Symfony-проектов я бы однозначно выбрал **Twig** из-за его бесшовной интеграции, лучшей безопасности (автоматическое экранирование) и активного сообщества.

Ответ 18+ 🔞

Давай разберем эту историю, как я Smarty в Symfony впихивал. Ситуация была пиздопроебибна, честно говоря. У нас был легаси-проект, древний, как хуй с горы, написанный на чистом PHP, а шаблоны — все на Smarty. И вот пришла команда: «А давайте мигрируем на Symfony, но шаблоны переписывать — овердохуища работы, давайте интегрируем». Ну, думаю, ёпта, а что, бывает и такое. Полез гуглить. Оказалось, есть даже готовый бандл, `smarty/smarty-bundle`. Установил через Composer — вроде живой. Дальше настройка в `config/packages/smarty.yaml`. Всё стандартно, в рот меня чих-пых, указал пути к папкам с шаблонами, куда компилить и кешировать. ```yaml smarty: options: template_dir: '%kernel.project_dir%/templates/' compile_dir: '%kernel.project_dir%/var/cache/smarty/compile/' cache_dir: '%kernel.project_dir%/var/cache/smarty/cache/' ``` В контроллере, кстати, всё выглядит почти как с Twig, даже приятно. Никакой магии. ```php // src/Controller/ProductController.php class ProductController extends AbstractController { public function show(int $id): Response { $product = $this->getDoctrine()->getRepository(Product::class)->find($id); return $this->render('product/show.tpl', [ 'product' => $product, 'features' => $product->getFeaturesAsArray() ]); } } ``` А вот сам шаблон — это отдельная песня. Смотри, какой привет из двухтысячных. ```smarty {extends file='layout/base.tpl'} {block name='title'}Детали товара: {$product.name}{/block} {block name='content'}

{$product.name|escape}

Цена: {$product.price|number_format:2} руб.

{if !empty($features)}

Характеристики:

    {foreach $features as $key => $value}
  • {$key|capitalize}: {$value}
  • {/foreach}
{/if} {include file='partials/add_to_cart.tpl' product_id=$product.id} {/block} ``` Вроде логично, вроде работает. Но вот когда начал вникать глубже — тут-то и началось веселье, ёперный театр. **Сложности, блядь, и выводы:** Первое — интеграция с формами Symfony. С Twig ты просто `{{ form_start(form) }}` и поехали. А тут, сука, приходится всё вручную размечать, атрибуты прописывать. Доверия к этой связке — ебать ноль, постоянно подозреваешь, что где-то накосячил. Второе — работа с ассетами. В Twig есть удобные `{{ asset() }}` и `{{ encore_entry_script_tags() }}`. А тут — хуй с винтом. Пришлось свои хелперы писать или пути в лоб прописывать, чувствуешь себя как будто на дворе 2002-й год. В общем, вывод, чувак, простой. Если проект уже на Smarty и его надо поддержать — связка рабочая, выкрутиться можно. Но если начинаешь новый проект на Symfony с нуля и думаешь, какой шаблонизатор выбрать... Да похуй, что ты там думаешь, бери **Twig** и не мучайся. У него интеграция — огонь, безопасность на уровне (экранирование само работает), и сообщество огромное. Не изобретай велосипед, а то получится мартышлюшка какая-то, а не архитектура.