Могут ли макросы веток возвращать значения? - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать шаблон в Twig . Внутри него я бы хотел выполнить некоторые манипуляции со строковыми данными, поступающими из контроллера. В частности, есть распространенная манипуляция (преобразование из underscore_case в CamelCase), которую я хотел бы выделить в отдельную функцию. Затем позже я могу использовать его несколько раз, как {% set x = magic(a) ~ magic(b) %}. Однако я не могу найти, как сделать такую ​​многоразовую функцию внутри самого шаблона. Есть макросы, но они не могут возвращать значения. Фильтры - это еще один вариант, который, кажется, отвечает всем требованиям, но я могу определить их только на стороне PHP.

Можно ли это сделать? Или я должен делать все продвинутые операции на стороне контроллера? Такое ощущение, что я тяну туда части логики дисплея; вещи, которые должны быть в поле зрения.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Веточка для вывода данных.Если вам нужно «преобразовать» данные, то вам нужно это сделать перед отправкой их на веточку или вам нужно расширить веточку

В идеале все данные, которые вы отправляете на веточку, являются просто переменнымии массивы, которые нуждаются в наименьшем количестве манипуляций самостоятельно.

Когда вы на самом деле «в ветке», обработка данных может считаться «выполненной» и должна выводиться только в соответствующих местах.с минимальной логикой для определения стилей интерфейса пользователя.

Так что пересмотрите свою логику и лучше подготовьте свои данные перед отправкой в ​​веточку.

Пример расширения класса инструментария, который содержит наши магические методы для выполнениянастоящее волшебство.

class CustomToolkit 
{
    public function magic_a($a) 
    {
        return strtolower($a);    }

    public function magic_b($b) 
    {
        return camel_case($b);
    }

    public function magic_tidle($a, $b) 
    {
        return $this->magic_a($a) ~ $this->magic_b($b);
    }
}

Затем вы добавляете это в свой экземпляр ветки.Я добавил здесь полный цикл создания экземпляров.если у вас есть поставщик услуг, вы можете просто взять экземпляр оттуда и добавить его к этому.

$twig = new Twig_Environment(new Twig_Loader_Array([
                                                      'html' => $contents
                                                   ]),[
                                                      'auto_reload' => true,
                                                      'debug' => false,
                                                   ]);
$twig->addExtension('toolkit', new CustomToolkit ());
echo $twig->render('html', $values);

Тогда в вашем коде ветки вы сможете сделать что-то вроде

{% set x = toolkit.magic_tidle("value","value_b") %} 
0 голосов
/ 12 сентября 2018

Вы правы, у макросов нет возвращаемых значений, и вы не можете заставить их иметь какие-либо.Все, что они делают, это выводят строки.

Тем не менее, вы можете захватить вывод строки, используя set: https://twig.symfony.com/doc/2.x/tags/set.html
Синтаксис выглядит примерно так:

{% set var %}
    {{ call.macro() }}
{% endset %}

выходные данные вызова макроса затем сохраняются внутри var.Возможно, вы захотите удалить пробелы.

Но тогда подумайте над тем, чтобы пересмотреть то, что вы делаете.Это все еще логика представления, или ваш контроллер просто «слишком ленив», чтобы преобразовать строки перед передачей их ветке?Если это действительно логика представления, простое добавление фильтра веток путем расширения веток, безусловно, стоит хлопот.Не только потому, что ваш код становится тестируемым.

0 голосов
/ 12 сентября 2018

Можно ли это сделать?

Да! Тем не менее, шаблоны Twig не являются идеальным местом для запуска логики. По крайней мере, мы должны сделать все возможное, чтобы избежать этого. Вместо этого, контроллер должен вернуть то, что нужно шаблону Twig. Логика должна работать в Service, Utility, Helper (вы называете это) и т. Д., И Controller возвращает его Twig. Затем Twig просто отображает его.

Могут ли макросы веток возвращать значения?

Да! Посмотрите на этот пример . Он принимает параметры и возвращает (не настоящая вещь "возврата", но вы поняли) что-то обратно.

Пример:

Предполагая, что данные, которыми вы пытаетесь манипулировать, являются чем-то простым.

use Doctrine\Common\Inflector\Inflector;

Controller
{
   action() {
      $data = Inflector::camelize('hello_world'); // This will become helloWorld

      return ....;
   }
}

Загляните в класс Inflector. У него есть полезные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...