是否有一種與 Symfony 相容的方法可以從字串中刪除所有樹枝標籤?
P粉043470158
P粉043470158 2024-03-22 00:03:19
0
2
395

我有一個 Symfony 驗證約束,它會在計算字元數並根據字元長度限制進行驗證之前刪除所有帶有正則表達式的 Twig 標籤。 (我的表單允許人們在欄位中輸入 Twig 標籤的有限子集。)因此它會執行以下操作:

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

...如果 $parsedLength 值太長,則建構違規。

這可行,但它不適合我。有沒有一種方法可以將某種服務傳遞到我的驗證類別中,然後使用該服務來渲染沒有 Twig 標籤的文字?這似乎是比使用正規表示式更和諧的做事方式。

P粉043470158
P粉043470158

全部回覆(2)
P粉038161873

可以分享一下你的程式碼嗎?據我了解,您正在約束內應用驗證邏輯,但這應該進入驗證器內部。

實現預期結果的正確步驟是:

  1. 建立不包含驗證邏輯的自訂約束
  2. 為該約束建立自訂驗證器並將其配置為服務。驗證器應該接受您的服務作為建構函式參數。

一個例子:

twig_char_lenght_validator:
    class: ...\TwigCharLengthValidator
    arguments:
        - "@your.service"
  1. 使用注入的服務完成您的驗證器邏輯。

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

#
P粉854119263

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板