首页  >  问答  >  正文

是否有一种与 Symfony 兼容的方法可以从字符串中删除所有树枝标签?

我有一个 Symfony 验证约束,它会在计算字符数并根据字符长度限制进行验证之前删除所有带有正则表达式的 Twig 标签。 (我的表单允许人们在字段中输入 Twig 标签的有限子集。)因此它会执行以下操作:

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

...如果 $parsedLength 值太长,则构建违规。

这可行,但它不适合我。有没有一种方法可以将某种服务传递到我的验证类中,然后使用该服务来渲染没有 Twig 标签的文本?这似乎是比使用正则表达式更和谐的做事方式。

P粉043470158P粉043470158235 天前346

全部回复(2)我来回复

  • 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

    回复
    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(对我来说)是一个有趣的方法。

    回复
    0
  • 取消回复