我有一个 Symfony 验证约束,它会在计算字符数并根据字符长度限制进行验证之前删除所有带有正则表达式的 Twig 标签。 (我的表单允许人们在字段中输入 Twig 标签的有限子集。)因此它会执行以下操作:
$parsedLength = mb_strlen( preg_replace('/{%[^%]*%}/', '', $stringValue) );
...如果 $parsedLength
值太长,则构建违规。
这可行,但它不适合我。有没有一种方法可以将某种服务传递到我的验证类中,然后使用该服务来渲染没有 Twig 标签的文本?这似乎是比使用正则表达式更和谐的做事方式。
P粉0381618732024-03-22 18:07:32
你能分享一下你的代码吗?据我了解,您正在约束内应用验证逻辑,但这应该进入验证器内部。
实现预期结果的正确步骤是:
一个例子:
twig_char_lenght_validator: class: ...\TwigCharLengthValidator arguments: - "@your.service"
官方文档:https://symfony.com/doc/current/validation/ custom_constraint.html
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(对我来说)是一个有趣的方法。