type
status
date
slug
summary
tags
category
icon
password
electron-egg使用ThinkPHP项目指南
示例demo
electron-egg-tp
jhs1873 • Updated Jan 6, 2025
🧑💻 User
electron-egg 使用thinkphp
🤖 Assistant
在基于
electron-egg
的项目中使用 ThinkPHP,是指将 ThinkPHP 框架作为后端服务,同时通过 electron-egg
提供前端界面和打包能力。具体实现可以参考以下步骤。前置知识
- Electron-egg 是一个结合了 Electron 和 Egg.js 的完整解决方案,用来在桌面端构建全栈应用。
- ThinkPHP 是一个 PHP 框架,用作后端 API 服务,接收来自 Electron 前端 (即 local 客户端) 发出的请求。
主要任务
- 启动 ThinkPHP 后端服务。
- 在 Electron 主进程和渲染进程中与 ThinkPHP API 交互。
- 优化本地调试和打包时的流程。
完整实现步骤
1. 准备环境
确保您已经安装以下工具:
- Node.js v16.20.0 (Electron 使用)
- PHP (至少7.2+,ThinkPHP 依赖)
- Composer (用于安装 ThinkPHP 项目)
2. 创建项目
下拉
electron-egg
:shell
- electron-egg 安装问题查看文档
3. 添加 ThinkPHP 后端服务
将 ThinkPHP 安装到项目中。此处以
api
作为子目录部署 ThinkPHP:shell
设置 PHP 开发服务器
进入
api
目录,启动 PHP 的内置开发服务器 (例如用于调试):shell
此时,ThinkPHP 服务将在默认的
http://127.0.0.1:8000
启动。4. Electron 与 ThinkPHP 通信
修改frontend目录
.env.development修改
shell
frontend\src\views\framework\socket\HttpServer.vue 行91
plain
调用示例
在打开的窗口中 框架->http服务 2. 使用http与服务端通信 点击发送请求按钮
这样,点击页面按钮后便可以通过 Electron 渲染进程调用 ThinkPHP 后端的接口。
5. 生产环境部署
前后端本地通信
由于 Electron 应用会被打包到本地运行,PHP 服务也需要被带到本地运行环境中。可以通过以下两种方式处理:
- PHP 内核 + 本地服务:将 PHP 和 ThinkPHP 服务打包到本地,Electron 启动时通过 Node.js 调用
php
运行内置 Web 开发服务器。
- 使用第三方 API 网关:将 ThinkPHP 的服务托管到外部服务器(如部署在云端),Electron 直接调用云端 API。
实现方式一:本地集成 PHP 服务
在 Electron 主进程中,启动一个 PHP 的子进程 在
electron/service/cross.js
:javascript
electron/preload/index.js 行19 新增
plain
build/extraResources 引入php-7.3程序 在
electron-egg
项目运行时,PHP 服务启动于本地 127.0.0.1:8000
。实现方式二:云端部署 ThinkPHP
简单地把 PHP/ThinkPHP 部署到服务器,然后前端请求地址改成云端的 API 地址 (
http://yourdomain.com/api
)。例如: frontend/.env.production
shell
这样无需捆绑 PHP,减少本地应用的复杂程度。
总结
ThinkPHP
可以作为后端服务,一个本地的 PHP 服务器运行于 Electron 环境。
electron-egg
的前端和后端可以通过 HTTP 请求使用axios
或fetch
和 ThinkPHP API 进行通信。
- 生产环境中可以选择打包 PHP 到离线环境,或直接使用云后端解决方案,取决于具体项目需求。
🧑💻 User
如果使用了thinkphp 那么egg的作用是什么 是不是就不需要了
🤖 Assistant
在使用
ThinkPHP
作为后端框架的同时,如果你已经引入了 electron-egg
(基于 Egg.js),会造成一个问题:系统中已经有两个后端框架(ThinkPHP
和 Egg.js
),导致架构的复杂性增加。因此需要仔细思考和规划系统的实际需求,决定是否真的需要继续保留 Egg.js 的功能。下面分析一下两者的作用,以及哪些情况可以直接移除 Egg.js。
ThinkPHP 和 Egg.js 的主要职责
- ThinkPHP
- ThinkPHP 是一种 PHP 框架,传统上用于开发 Web 应用或 API 服务。
- 如果您已经使用 ThinkPHP 来搭建后端 API,那么意味着所有与业务相关的数据库、逻辑处理、接口输出都会由 ThinkPHP 提供。
- 在
electron-egg
项目中,ThinkPHP 更像是完全独立的后端服务。
- Egg.js
- Egg.js 是 Node.js 的框架,在
electron-egg
中,它默认作为 Electron 框架的本地后端服务。 - Egg.js 服务直接运行于 Electron 进程中,用于管理内部的本地请求、文件读取、提供 API 服务等任务。
- 在某些 Electron 应用中,Egg.js 可用于承担业务逻辑(替代 PHP 或其他 API)。
当你引入 ThinkPHP 时,Egg.js 还能有什么作用?
如果后端服务完全交给 ThinkPHP 来处理,那么 Egg.js 的核心价值可能就大幅下降。但仍然有一些场景下,Egg.js 能发挥作用:
1. 适配自定义 Node.js 功能
Egg.js 本质上是一个 Node.js 框架,可以运行在 Electron 应用的本地环境中。它可以用来处理一些本地功能,而这些功能并非 ThinkPHP 的强项,例如:
- 控制本地文件系统(读写、上传、下载等操作)。
- 调用系统命令行接口(如调用
ffmpeg
转码,或其他本地脚本)。
- 功能性的插件(如 WebSocket 服务、定时任务)。
- 本地数据持久化(如读取、写入配置文件)。
2. 作为 ThinkPHP 服务的代理
Egg.js 可以作为一个中间代理层:
- 当 Electron 渲染进程(前端)发起请求时,Egg.js 可以接收请求并转发到本地运行的 ThinkPHP 服务。
- 这样可以隐藏 ThinkPHP 服务的运行细节,同时提升安全性(前端不知道后端的真实地址或端口)。
- 通过这种方式,你还能灵活地增加请求的拦截器、权限校验、缓存等功能。
3. 提供前后端一体化功能
如果你的桌面应用有多个 API 源:
- 考虑到 ThinkPHP 主要处理数据库相关的核心业务逻辑,Egg.js 可以用来处理一些与 Electron 桌面应用耦合较强的 API(如本地通知、本地用户权限管理等)。
- Egg.js 可以与 Electron 渲染进程使用类似
ipcMain
/ipcRenderer
的机制,提供一种单独的逻辑层。
4. 分工与模块化
在复杂应用中,可能需要多个层次的 API 服务。你可以用 Egg.js 和 ThinkPHP 分工:
- Egg.js:负责本地服务和前后端交互。
- ThinkPHP:负责业务逻辑和数据库处理。
哪些情况可以直接移除 Egg.js?
如果你的项目目标非常简单,例如:
- 纯粹的数据库/业务接口由 ThinkPHP 提供服务,且不涉及任何本地服务逻辑。
- 你的桌面应用功能不需要用到其他本地 API。
- 你的 Electron 应用前后端通信可以直接通过 AJAX 或 WebSocket 与 ThinkPHP 通信(而不是通过 Egg.js 转发)。
这种情况下,Egg.js 服务的作用可以完全由 ThinkPHP 取代,那么直接移除 Egg.js 是完全可以的。
移除 Egg.js 后的架构示例
如果移除了 Egg.js,本地架构会变得简单:
- 后端服务:ThinkPHP 提供所有的后端 API(本地运行的 PHP 内置服务,或远程云端服务)。
- Electron 主进程:
- 负责启动 ThinkPHP 服务(通过
php
子进程)。 - 管理应用生命周期。
- Electron 渲染进程:
- 前端页面直接通过 AJAX 或
fetch
与 ThinkPHP API 通信,获取和推送数据。
整体系统的请求流如下:
plain
保留 Egg.js 的架构示例
如果 ThinkPHP 和 Egg.js 同时存在,你可以定义它们的职责边界,以支持更复杂的需求:
- ThinkPHP:
- 提供主要的业务逻辑(如用户登录、订单管理、数据存储等)。
- ThinkPHP 运行在一个本地的 PHP 服务器上,由 Electron 主进程启动。
- Egg.js:
- 提供本地化服务,比如文件系统操作、调用系统 API 或管理 Electron 的进程、窗口等。
- 作为代理或中间层,将部分请求转发到 ThinkPHP,从而对 ThinkPHP 服务进行“封装”。
请求流示例:
- Electron 前端调用 Egg.js 的接口(本地主机
http://127.0.0.1:7001
)。
- Egg.js 根据请求决定:
- 是否处理请求(如文件操作、通知管理)。
- 或者将请求转发给 ThinkPHP 并返回其响应。
plain
结论
- 移除 Egg.js 的推荐场景:
- 如果 ThinkPHP 可以完全满足您的所有后端 API 需求,并且不需要本地 API 或代理层。
- 您希望项目架构精简,便于维护。
- 保留 Egg.js 的推荐场景:
- 如果项目中有较多本地功能需要实现(本地文件系统、通知、系统调用保护等)。
- 如果需要一个代理层来封装或增强 ThinkPHP 提供的服务。
- 如果打算长期扩展项目,Egg.js 可以兼容未来更多 Node.js 插件或功能。
根据实际需求选择合适的架构,可以大幅降低开发和后续维护成本。
ThinkPHP伪静态
- ThinkPHP 默认支持伪静态,只需结合服务器环境(Apache、Nginx、IIS 或 PHP 内置服务器)配置好对应的 URL 重写规则即可。
- 开发环境中,直接运行
php think run
,伪静态 URL 通常无需额外配置。
- 生产环境中,一般推荐使用 Nginx 或 Apache 配置伪静态,避免暴露入口文件(如
index.php
),从而让 URL 更加优雅、美观,并对 SEO 友好。
使用ai询问,然后手动实践,再修改文档.过程耗时将近2小时.算是初步的electron-egg 可以引入thinkphp来使用了. (electron-egg 引入tp的意义就是在于折腾.)
打包目前只测了win平台.
打包构建前需要把api目录移动到build/extraResources目录下(可以手动移动或者使用命令移动)
php.exe后面可以更换成 static-php-cli
thinkphp构建成phar
php启动动态端口,前端动态获取php执行端口.
当然这些玩法需要折腾,使用内置的node 或者集成好的go也是不错的选择.
- 作者:jhs1873
- 链接:https://blog.wxapp.xyz/posts/ElectronEggThinkPHPGuide
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。