You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Vite和Twig将Symfony控制器数据传给Vue3组件

解决方案:Symfony 5.4 + Vue 3 组件渲染与Props传递

问题核心

  • Twig模板中无法直接通过Vue语法传递props
  • 自定义Vue组件在#app容器内无法正常渲染

步骤1:修复自定义组件渲染问题

当前App.vue是完整布局组件,挂载后不会解析Twig中#app内的自定义组件,因为模板缺少插槽来接收外部内容。

修改App.vue添加插槽

<script setup lang="ts">
import BaseLayout from "./layout/BaseLayout.vue";
import StickyBanner from "./patterns/StickyBanner.vue";
</script>
<template>
  <BaseLayout>
    <template #header>
      <h1>Header</h1>
      <StickyBanner />
    </template>
    <template #main>
      <!-- 添加插槽,接收Twig传入的组件 -->
      <slot></slot>
    </template>
    <template #footer>
      <h1>Footer</h1>
    </template>
  </BaseLayout>
</template>
<style lang="scss" scoped></style>

调整组件注册时机

在app.ts中先注册组件再挂载Vue实例,同时遵循HTML自定义元素规范使用短横线命名组件:

import {createApp} from "vue";
import App from "./vue/App.vue";
import ModeSwitcher from "./vue/patterns/ModeSwitcher.vue";

const app = createApp(App);
// 先注册组件,再挂载实例
app.component('mode-switcher', ModeSwitcher);
app.mount('#app');

步骤2:从Symfony控制器传递数据到Vue组件

方法一:通过HTML属性绑定Props

1. 控制器传递数据

在Symfony控制器中将数据转为JSON并传入Twig:

// src/Controller/VueController.php
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class VueController extends AbstractController
{
    #[Route('/vue', name: 'app_vue')]
    public function index(): Response
    {
        $componentData = [
            'username' => 'SymfonyVueUser',
            'theme' => 'dark'
        ];
        
        return $this->render('vue/index.html.twig', [
            'componentData' => json_encode($componentData)
        ]);
    }
}

2. Twig模板绑定Props

使用v-bind(简写:)绑定JSON数据,通过|raw过滤器避免Twig转义:

{% extends 'base.html.twig' %}

{% block title %}Hello VueController!{% endblock %}

{% block body %}
<div>
    <div id="app">
        <mode-switcher :component-data="{{ componentData|raw }}"></mode-switcher>
    </div>
</div>
{% endblock %}

3. Vue组件接收Props

在ModeSwitcher.vue中定义并使用props:

<template>
  <div ref="themeToggleBtn" @click="console.log(componentData)">
    <button>Hello {{ componentData.username }}</button>
  </div>
</template>
<script setup lang="ts">
import { defineProps } from 'vue';

const props = defineProps({
  componentData: {
    type: Object,
    required: true
  }
});
</script>

方法二:通过全局window对象传递数据

适合多组件共享或大数据场景,在Twig中挂载数据到全局:

{% block body %}
<script>
window.symfonyData = {{ componentData|raw }};
</script>
<div>
    <div id="app">
        <mode-switcher></mode-switcher>
    </div>
</div>
{% endblock %}

在Vue组件中直接调用全局数据:

<script setup lang="ts">
const symfonyData = window.symfonyData;
</script>

步骤3:验证配置

确保vite.config.ts中symfonyPlugin和vue插件已启用,无配置冲突。重启Vite和Symfony服务器后,组件即可正常渲染并接收控制器数据。


内容的提问来源于stack exchange,提问作者LaFllamme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:47:10