{% raw %}

Symfony Vue 教程

原文: http://zetcode.com/symfony/vue/

Symfony Vue 教程展示了如何使用 Vue 前端创建一个简单的 Symfony 应用。

Symfony

Symfony 是一组可重用的 PHP 组件和一个用于 Web 项目的 PHP 框架。 Symfony 于 2005 年发布为免费软件。Fabien Potencier 是 Symfony 的原始作者。 Symfony 的灵感来自 Ruby on Rails,Django 和 Spring 框架。

Symfony Encore 是 JavaScript 库,用于在 Symfony 应用中管理 CSS 和 JavaScript。 Encore 使将 Webpack 集成到 Symfony 应用中变得更加容易。 它包装了 Webpack,并提供了一个干净而强大的 API,用于捆绑 JavaScript 模块,预处理 CSS 和 JavaScript 以及编译和缩小项目。

Vue

Vue 是用于构建用户界面和单页应用的开源 JavaScript 框架。 它是 Angular 和 React 的替代方案。

Symfony Vue 示例

在下面的示例中,我们创建了一个简单的 Symfony 应用,该应用在模板中发送数据。 数据由 Vue 处理并显示在组件中。

除了 PHP,我们还需要安装 Node.js。 看看 ZetCode 的 Node.js 教程了解更多详细信息。

设置项目

我们展示了如何使用 Vue 设置 Symfony。

  1. $ composer create-project symfony/skeleton symvue

使用composer,我们创建一个新的 Symfony 骨架项目。

  1. $ cd symvue

我们转到项目目录。

  1. $ composer require maker --dev

另外,我们安装了 maker 组件。 maker包提供了脚手架。

  1. $ composer require server --dev

我们安装开发 Web 服务器。

  1. $ composer require encore
  2. $ npm install

我们安装了 Symfony Encore。 这将安装并启用 WebpackEncoreBundle,添加assets目录,创建webpack.config.js文件,并将node_modules添加到.gitignore

  1. $ npm i vue vue-loader vue-template-compiler

我们安装 Vue 及其库。

项目文件

我们显示了重要的项目文件。

webpack.config.js

  1. var Encore = require('@symfony/webpack-encore');
  2. Encore
  3. .setOutputPath('public/build/')
  4. .setPublicPath('/build')
  5. .enableVueLoader()
  6. .addEntry('app', './assets/js/app.js')
  7. .splitEntryChunks()
  8. .enableSingleRuntimeChunk()
  9. .cleanupOutputBeforeBuild()
  10. .enableBuildNotifications()
  11. .enableSourceMaps(!Encore.isProduction())
  12. .enableVersioning(Encore.isProduction())
  13. ;
  14. module.exports = Encore.getWebpackConfig();

webpack.config.js文件中,我们启用 Vue 加载程序并设置公共路径和构建路径。

assets/js/app.js

  1. import Vue from 'vue';
  2. import App from './components/App';
  3. new Vue({
  4. el: '#app',
  5. render: h => h(App)
  6. });

这是启动 Vue 的主要 Vue 文件。

Symfony 将静态文件(如 CSS 和 JavaScript)存储在assets目录中。

assets/js/components/App.vue

  1. <template>
  2. <div>
  3. <h2 class="center">My Application</h2>
  4. <div v-text="message"></div>
  5. {{ message }}
  6. <ul>
  7. <li :key="word.id" v-for="word in words">{{ word }}</li>
  8. </ul>
  9. </div>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. message: "A list of words",
  16. words: []
  17. };
  18. },
  19. mounted() {
  20. let el = document.querySelector("div[data-words]");
  21. let mywords = el.dataset.words.split(",");
  22. this.words.push.apply(this.words, mywords);
  23. }
  24. };
  25. </script>
  26. <style>
  27. .center {
  28. text-align: center;
  29. }
  30. </style>

这是 Vue 组件。 Vue 应用由组件组成。 一个组件由三部分组成:模板,脚本和样式。

  1. <div v-text="message"></div>
  2. {{ message }}

在 Vue 中有两种输出变量的方法: 第二个与 Twig 相同。

  1. <ul>
  2. <li :key="word.id" v-for="word in words">{{ word }}</li>
  3. </ul>

使用v-for指令,我们遍历words数组并显示列表项中的每个元素。 :key指令可帮助 Vue 渲染列表。 它包含元素的 ID。

数据来自 Symfony Twig 模板; 它由 JavaScript 处理,最后在 Vue 组件中与v-for输出。

  1. data() {
  2. return {
  3. message: "A list of words",
  4. words: []
  5. };
  6. },

data()函数中,我们启动一个消息变量和words数组。

  1. mounted() {
  2. let el = document.querySelector("div[data-words]");
  3. let mywords = el.dataset.words.split(",");
  4. this.words.push.apply(this.words, mywords);
  5. }

words数组在mounted()函数中填充了数据,该函数解析元素数据集中的数据。 它以字符串形式存储在此; 我们将字符串分成单词。 数据将插入 Symfony 的 Twig 模板内的数据集中。

assets/css/style.css

  1. body {
  2. background-color: lightgray;
  3. }

style.css中有一些基本的 CSS。

  1. $ php bin/console make:controller HomeController

HomeController由 Symfony 制造商创建。

src/Controller/HomeController.php

  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. class HomeController extends AbstractController
  6. {
  7. /**
  8. * @Route("/home", name="home")
  9. */
  10. public function index()
  11. {
  12. $words = ['sky', 'cloud', 'wood', 'rock', 'forest',
  13. 'mountain', 'breeze'];
  14. return $this->render('home/index.html.twig', [
  15. 'words' => $words
  16. ]);
  17. }
  18. }

控制器方法将单词列表发送给客户端。

  1. return $this->render('home/index.html.twig', [
  2. 'words' => $words
  3. ]);

我们渲染向其发送单词的index.html.twig模板。

templates/home/index.html.twig

  1. {% extends 'base.html.twig' %}
  2. {% block title %}Home page{% endblock %}
  3. {% block body %}
  4. <div ref="words" data-words="{{ words|join(',') }}">
  5. </div>
  6. <div id="app">
  7. <app></app>
  8. </div>
  9. {% endblock %}

在模板中,我们将单词数组添加到data-words属性。 使用 Twig join过滤器将数组连接成字符串。 HTMLElement接口上的dataset属性提供对在元素上设置的所有自定义数据属性(data-*)的读/写访问。

  1. <div id="app">
  2. <app></app>
  3. </div>

这是主要 Vue 组件的入口点。

templates/base.html.twig

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{% block title %}Welcome!{% endblock %}</title>
  6. {% block stylesheets %}
  7. {{ encore_entry_link_tags('app') }}
  8. {% endblock %}
  9. </head>
  10. <body>
  11. {% block body %}{% endblock %}
  12. {% block javascripts %}
  13. {{ encore_entry_script_tags('app') }}
  14. {% endblock %}
  15. </body>
  16. </html>

这是基本模板文件。

  1. {{ encore_entry_link_tags('app') }}

CSS 文件加载有encore_entry_link_tags

  1. {{ encore_entry_script_tags('app') }}

JavaScript 文件加载有encore_entry_script_tags

构建项目

我们需要构建项目。

  1. $ npm run dev

使用npm run dev命令为开发环境构建项目。

运行应用

我们启动开发服务器并找到应用页面。

  1. $ php bin/console server:run

我们启动开发服务器。 然后我们找到localhost:8000/home页面。

在本教程中,我们创建了一个在前端使用 Vue 的 Symfony 应用。

您可能也对以下相关教程感兴趣: Symfony 简介Doctrine DBAL QueryBuilder教程Symfony 表单教程Symfony 翻译教程PHP 教程

{% endraw %}