Heim  >  Fragen und Antworten  >  Hauptteil

Gibt es eine Symfony-kompatible Möglichkeit, alle Twig-Tags aus einem String zu entfernen?

Ich habe eine Symfony-Validierungsbeschränkung, die alle Twig-Tags mit einem regulären Ausdruck entfernt, bevor die Anzahl der Zeichen gezählt und anhand der Zeichenlängenbeschränkung validiert wird. (Mein Formular ermöglicht es Benutzern, eine begrenzte Teilmenge von Twig-Tags in Felder einzugeben.) Es bewirkt also Folgendes:

$parsedLength = mb_strlen(
        preg_replace('/{%[^%]*%}/', '', $stringValue)
    );

...Wenn der $parsedLength-Wert zu lang ist, liegt ein Build-Verstoß vor.

Das funktioniert, aber bei mir funktioniert es nicht. Gibt es eine Möglichkeit, einen Dienst an meine Validierungsklasse zu übergeben und diesen Dienst dann zu verwenden, um den Text ohne die Twig-Tags darzustellen? Dies scheint eine harmonischere Vorgehensweise zu sein als die Verwendung regulärer Ausdrücke.

P粉043470158P粉043470158235 Tage vor345

Antworte allen(2)Ich werde antworten

  • P粉038161873

    P粉0381618732024-03-22 18:07:32

    你能分享一下你的代码吗?据我了解,您正在约束内应用验证逻辑,但这应该进入验证器内部。

    实现预期结果的正确步骤是:

    1. 创建不包含验证逻辑的自定义约束
    2. 为该约束创建自定义验证器并将其配置为服务。验证器应该接受您的服务作为构造函数参数。

    一个例子:

    twig_char_lenght_validator:
        class: ...\TwigCharLengthValidator
        arguments:
            - "@your.service"
    1. 使用注入的服务完成您的验证器逻辑。

    官方文档:https://symfony.com/doc/current/validation/ custom_constraint.html

    Antwort
    0
  • P粉854119263

    P粉8541192632024-03-22 16:44:46

    我并不是 100% 这就是您所要求的,但您可以根据您的输入创建一个模板,然后渲染它。当然要去掉所有的树枝,尽管我不确定你是否总是知道变量是什么。

    我查了一下,所有的例子看起来都很旧,我不确定事情是否仍然有效。尽管我确信它在某个地方,但甚至在文档中找不到示例。无论如何:

    use Twig\Environment;
    
    #[AsCommand(
        name: 'app:twig',
        description: 'Add a short description for your command',
    )]
    class TwigCommand extends Command
    {
        public function __construct(private Environment $twig)
        {
            parent::__construct();
        }
    
        protected function execute(InputInterface $input, OutputInterface $output): int
        {
            $input = '{{ hello }}';
            // This is the important line
            $template = $this->twig->createTemplate($input);
            $rendered = $template->render(['hello' => 'Hello World']);
            echo $rendered . "\n";
    
            return Command::SUCCESS;
        }
    }

    如果不出意外的话,这也可以让您验证实际的模板。但正如已经提到的,我不太确定 parsed length 的含义。无论如何,createTemplate(对我来说)是一个有趣的方法。

    Antwort
    0
  • StornierenAntwort