有没有一种Symfony友好的方法可以从字符串中删除所有的twig标签?

pkbketx9  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(108)

我有一个Symfony验证约束,它在计算字符数和基于字符长度限制进行验证之前删除所有带有正则表达式的Twig标签。(我的表单允许人们在字段中输入Twig标签的有限子集。)所以它做了如下事情:

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

...如果$parsedLength值太长,则会构建冲突。
这是可行的,但我不太适应。有没有一种方法可以将某种类型的服务传递到我的验证类中,然后使用该服务来呈现不带Twig标签的文本?这似乎是一种更symonic的方式来做事情,而不是使用正则表达式。

a14dhokn

a14dhokn1#

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

wqsoz72f

wqsoz72f2#

你能分享一下你的代码吗?据我所知,你在约束中应用了验证逻辑,但那应该在验证器中。
实现预期结果的正确步骤是:
1.创建不包含验证逻辑的自定义约束
1.为该约束创建一个自定义验证器,并将其配置为服务。验证器应接受您的服务作为构造函数参数。
举个例子:

twig_char_lenght_validator:
    class: ...\TwigCharLengthValidator
    arguments:
        - "@your.service"

1.使用注入的服务完成Validator逻辑。
官方文件:https://symfony.com/doc/current/validation/custom_constraint.html

相关问题