将 VueJS 与 CakePHP 3 集成的最佳实践

Best practice to integrate VueJS with CakePHP 3

我想知道在 CakePHP 3 应用程序中集成 Vue.js 框架的最佳方式是什么?

我希望有一种方法可以从 VueCLI(webpack 等)附带的所有工具中获益,同时无需在 CakePHP 应用程序中复制生成的文件即可继续工作。

那么在同一项目中使用 CakePHP 3 作为后端和 Vue.js 作为前端开发应用程序的最简化过程是什么。

非常感谢!

除非您不关心文件大小和加载时间,否则您不复制文件就无法逃脱。只需将所有内容放入您的 webroot/js 然后在您的视图中加载所有需要的文件就可以了。 Vue 是 JS,只是 JS,仅此而已。我也不明白为什么自动发生的应对方式不好。

IMO JS 应用程序是通过构建脚本以某种方式粘在一起的巨大混乱。

如果您关心优化构建,请使用 npm 和 webpack 并配置 Webpack 以构建您的 Vue 应用程序并将您的 webroot 定义为目标文件夹。 Webpack 将允许您 auto-split files 并在文件变大时向您发出警告。

我们已将所有前端内容放入 /resources/js 和 /scss 等位置并构建它并启用热重载,因此我们可以在点击保存后立即看到更改。这只是为了发展。当部署到我们的实时系统时,JS 是在实时系统上构建的,我们不会将任何构建添加到我们的 git 存储库。

但是,如果您不坚持使用 100% 纯 JS 前端应用程序,前端的 "building" JS 应用程序将是一件令人头疼的事情。没有真正的标准方法来做到这一点。即使 "import" 也有它的怪癖,感觉更像是 hack 而不是解决问题的好方法,也没有解决打包文件以减少请求和文件大小的问题。

一旦你把所有的废话粘在一起,它通常会很好地工作,但真的很遗憾,在 2018 年没有为 Web 应用程序构建 JS 的推荐标准。我真的希望今天做事的方式很快就会消失,取而代之的是 Web Assembly。

如果你不想使用 Webpack,还有 require.js 和其他的,但对我们来说 webpack 效果最好。

好的,这是一个快速设置:

1) 在 webroot 的子目录中安装 vuejs (如 webroot/vuedev)

2) 配置你的 vue 路由器使用历史模式:

export default new Router({
  mode:'history',
  routes: [

3) 在webroot/vuedev/config/index.js

中将build zone的assetsPublicPath改为assetsPublicPath: '',

4) 因为在开发模式下,您的应用程序在 localhost:8080 上 运行 并且您的 ajax 调用 [=69= .dev 你会遇到 CORS 问题。将 header 添加到您的 ajax 通话中:

axios.get(url,{headers: {"Access-Control-Allow-Origin": "*"}}).then...

为您的 ajax 调用使用前缀 "api":your-domain.xxx/api/controller/action...

5) 更改 cakePHP 的路由以使用 REST api: 在 config/routes.php 中:

// add api prefix

Router::prefix('api', function ($routes) {
    $routes->fallbacks(DashedRoute::class);
});

// change default route :

Router::scope('/', function (RouteBuilder $routes) {

    $routes->connect('/:page',['controller'=>'Pages','action'=>'display']); 

    $routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
    $routes->fallbacks(DashedRoute::class);
});

Ajax 调用 your-domain.xxx/api/controller/action 将正常进行。 每次调用 your-domain.com/xxx 将被转移到控制器页面,操作显示。

6) 将 webroot/vuedev 的 index.html 内容复制到模板主页 (src/Template/Pages/home.ctp) 并添加到控制器的显示操作中。

$this->viewBuilder()->setLayout(false); 

7) 对于生产: 启动构建过程:

npm run build. 

复制 webroot/vuedev/dist/static 到 webroot/static

复制webroot/vuedev/dist/index.html的内容到你的src/Template/Pages/home.ctp

如果有人手动调用特定页面或刷新浏览器(即:your-domain.xxx/Products),您的页面控制器将发送 index.html 内容。 您可以将 te param :page 添加到您的 template/Pages/home.ctp 中的全局 var in 脚本标记中以供路由器使用:

<script>var routeToJump=<?php echo $yourvar;?>; </script>

在你的 App.vue 中:

export default {
  name: 'App',
  created() {
    this.$router.push(routeToJump);
    ...

以下是我遵循的步骤:

  1. 在主应用程序目录中使用 vuejs 创建一个项目。

  2. 添加vue router、vuex等插件

    vue create bos-vue
    vue add vuex
    vue add router
    
  3. 您可以使用以下命令运行应用程序:

    npm run serve

  4. 安装项目所需的节点模块:

    npm install --save axios vue-axios

  5. cakephp服务器的所有数据都会通过axios请求获取json格式

    axios.get(http://localhost/cakeapp/articles/getdata)

  6. 以上调用会导致 CORS 问题。解决开发中的CORS问题:

在.htaccess中添加headers,启用apache的headers模块,在application.php

中禁用CSRF中间件
  1. 身份验证,请求cakephp服务器登录,并将用户信息存储在本地存储中(以供前端使用)。使用导航守卫检查每个axios调用响应中是否存在session。

  2. 对于部署,运行:npm run build

  3. 将 dist 目录中的所有内容(index.html 除外)复制到 webroot。在default.ctp

  4. 中复制index.html

现在 cakephp 中的一切都会 运行 照常。