首頁  >  問答  >  主體

是否有一種與 Symfony 相容的方法可以從字串中刪除所有樹枝標籤?

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

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

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

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

P粉043470158P粉043470158185 天前308

全部回覆(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
  • 取消回覆