在 Symfony 等採用 Twig 模板引擎的專案中,常見需求是根據使用者輸入(JavaScript 變數)動態生成 AJAX 請求 URL。許多開發者嘗試直接在 Twig 的 path() 函式中插入 JS 變數,卻發現無效:
<script>
jQuery(document).ready(function() {
jQuery('#my_input').change(function() {
var value = jQuery('#my_input').val();
// ❌ 錯誤寫法:value 會被當作字面字串 "value" 傳入
jQuery.ajax({
url: "{{ path('ParteAccidentes_ajax', {'emergencia': value}) }}",
// ...
});
});
});
</script>
當 Twig 解析 {{ path(...) }} 時,value 尚不存在,故被視為普通字串 "value",導致生成錯誤 URL。
先用佔位符生成路由模板,再於 JS 中替換為實際變數值:
<script>
jQuery(document).ready(function() {
jQuery('#my_input').change(function() {
var value = jQuery('#my_input').val();
// 1. 先用佔位符 'text' 生成路由模板
var url = "{{ path('ParteAccidentes_ajax', {'emergencia': 'text'}) }}";
// 2. 客戶端替換佔位符為實際 JS 變數
url = url.replace("text", value);
jQuery.ajax({
url: url,
timeout: 5000,
success: function(data) { alert('ok'); },
error: function() { alert('mal'); }
});
});
});
</script>
<!-- Twig 模板 -->
<input id="my_input" type="text" data-route="{{ path('ParteAccidentes_ajax', {'emergencia': ''}) }}" />
<script>
var baseUrl = $('#my_input').data('route');
var url = baseUrl + encodeURIComponent(value);
</script>
<script>
window.AppRoutes = {
parteAccidentesAjax: "{{ path('ParteAccidentes_ajax', {'emergencia': ''}) }}"
};
</script>
// 使用時
var url = AppRoutes.parteAccidentesAjax + encodeURIComponent(value);
若後端 API 支援,建議改用查詢字串傳參,避免路由參數替換複雜度:
var url = "{{ path('ParteAccidentes_ajax') }}?emergencia=" + encodeURIComponent(value);
encodeURIComponent() 防止特殊字元導致 URL 失效