我有一個 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(對我來說)是一個有趣的方法。