Rumah > Soal Jawab > teks badan
Saya mempunyai kekangan pengesahan Symfony yang mengalih keluar semua tag Twig dengan regex sebelum mengira bilangan aksara dan mengesahkan terhadap had panjang aksara. (Borang saya membenarkan orang ramai memasukkan subset terhad teg Twig ke dalam medan.) Jadi ia melakukan perkara berikut:
$parsedLength = mb_strlen( preg_replace('/{%[^%]*%}/', '', $stringValue) );
...Jika nilai $parsedLength
terlalu panjang, ia adalah pelanggaran binaan.
Ini berfungsi, tetapi ia tidak berkesan untuk saya. Adakah terdapat cara untuk menghantar beberapa jenis perkhidmatan ke dalam kelas pengesahan saya dan kemudian menggunakan perkhidmatan itu untuk memberikan teks tanpa tag Twig? Ini nampaknya cara yang lebih harmoni untuk melakukan sesuatu daripada menggunakan ungkapan biasa.
P粉0381618732024-03-22 18:07:32
Bolehkah anda berkongsi kod anda? Daripada apa yang saya faham, anda menggunakan logik pengesahan di dalam kekangan, tetapi ini harus masuk ke dalam pengesah.
Langkah yang betul untuk mencapai hasil yang diinginkan ialah:
Contoh:
twig_char_lenght_validator: class: ...\TwigCharLengthValidator arguments: - "@your.service"
Dokumentasi rasmi: https://symfony.com/doc/current/validation/custom_constraint.html
P粉8541192632024-03-22 16:44:46
Saya tidak pasti 100% ini adalah perkara yang anda minta, tetapi anda boleh membuat templat berdasarkan input anda dan kemudian memaparkannya. Sudah tentu keluarkan semua cawangan, walaupun saya tidak pasti anda sentiasa tahu apakah pembolehubah itu.
Saya menyemak dan semua contoh kelihatan sangat lama dan saya tidak pasti sama ada perkara masih berfungsi. Saya tidak dapat mencari contoh dalam dokumentasi, walaupun saya pasti ia ada di suatu tempat. Bagaimanapun:
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; } }
Jika tiada yang lain, ini juga membolehkan anda mengesahkan templat sebenar. Tetapi seperti yang telah disebutkan, saya tidak pasti apa maksud parsed length
. Bagaimanapun, createTemplate adalah (bagi saya) kaedah yang menarik.