PHP tags inside strings cause incorrect rendering of template
Nobody has claimed this yet.
- Dominant language
- PHP
- Stars
- 423
- Forks
- 36
- PR merge metrics
- No merged PRs in 30d
Description
Volt Version
1.6.1
Laravel Version
11.36,1
PHP Version
8.3.6
Database Driver & Version
No response
Description
If the PHP opening or closing tags appear in a string in the template then the template is rendered incorrectly. This stems from a naive regex in the ExtractTemplate precompiler class on line 51
Steps To Reproduce
The following simple Volt component demonstrates the issue.
<?php
use function Livewire\Volt\{state};
state(
title: 'Exmple of ?> causing problems',
message: 'PHP starts with <?php and ends with ?>',
);
?>
<x-layouts.app>
@volt
<div>
<h1>{{ $title }}</h1>
<p>{{ $message }}</p>
</div>
@endvolt
</x-layouts.app>
There is nothing special in the layout component
<!DOCTYPE html>
<html>
<head>
<title>Volt App</title>
</head>
<body>
{{ $slot }}
</body>
</html>
This gives the following output (note the extract of PHP code that has been rendered as part of the template)
causing problems',
message: 'PHP starts with ',
);
?>
<!DOCTYPE html>
<html>
<head>
<title>Volt App</title>
<!-- Livewire Styles --><style >[wire\:loading][wire\:loading], [wire\:loading\.delay][wire\:loading\.delay], [wire\:loading\.inline-block][wire\:loading\.inline-block], [wire\:loading\.inline][wire\:loading\.inline], [wire\:loading\.block][wire\:loading\.block], [wire\:loading\.flex][wire\:loading\.flex], [wire\:loading\.table][wire\:loading\.table], [wire\:loading\.grid][wire\:loading\.grid], [wire\:loading\.inline-flex][wire\:loading\.inline-flex] {display: none;}[wire\:loading\.delay\.none][wire\:loading\.delay\.none], [wire\:loading\.delay\.shortest][wire\:loading\.delay\.shortest], [wire\:loading\.delay\.shorter][wire\:loading\.delay\.shorter], [wire\:loading\.delay\.short][wire\:loading\.delay\.short], [wire\:loading\.delay\.default][wire\:loading\.delay\.default], [wire\:loading\.delay\.long][wire\:loading\.delay\.long], [wire\:loading\.delay\.longer][wire\:loading\.delay\.longer], [wire\:loading\.delay\.longest][wire\:loading\.delay\.longest] {display: none;}[wire\:offline][wire\:offline] {display: none;}[wire\:dirty]:not(textarea):not(input):not(select) {display: none;}:root {--livewire-progress-bar-color: #2299dd;}[x-cloak] {display: none !important;}</style>
</head>
<body>
<div wire:snapshot="{"data":{"title":"Exmple of ?> causing problems","message":"PHP starts with <?php and ends with ?>"},"memo":{"id":"oXiRLjallSrQA1IiUhzv","name":"volt-anonymous-fragment-eyJuYW1lIjoidm9sdC1hbm9ueW1vdXMtZnJhZ21lbnQtNzI1NzhjZjIzMmQ5NTQwYTkxYzkwZTIxNWI3NmVlZWMiLCJwYXRoIjoicmVzb3VyY2VzXC92aWV3c1wvcGFnZXNcL2V4YW1wbGUuYmxhZGUucGhwIn0=","path":"example","method":"GET","children":[],"scripts":[],"assets":[],"errors":[],"locale":"en"},"checksum":"173f579b1442267838c7d014c1a23f7073d6f0133e57bf58e11e805427d1c1b8"}" wire:effects="[]" wire:id="oXiRLjallSrQA1IiUhzv">
<h1>Exmple of ?> causing problems</h1>
<p>PHP starts with <?php and ends with ?></p>
</div>
<!-- Livewire Scripts -->
<script src="[/livewire/livewire.js?id=02b08710](https://livewire.projects.test/livewire/livewire.js?id=02b08710)" data-csrf="80ALUp1mlTldYlewWeaiBgmmEYC2kdNE4IY5kTxx" data-update-uri="/livewire/update" data-navigate-once="true"></script>
</body>
</html>
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with src/Precompilers/ExtractTemplate.php at line 51 and reproduce the issue using the Volt component examples in the report. Trace how PHP opening and closing tags are extracted when they occur inside quoted strings. Done means those strings remain part of the component state and are not rendered as template PHP or markup.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- laravel, php
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 50/100