# symfony-example
**Repository Path**: siburuxue/symfony-example
## Basic Information
- **Project Name**: symfony-example
- **Description**: symfony 后台 模板项目
- **Primary Language**: PHP
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-08-24
- **Last Updated**: 2024-04-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# symfony 后台模板项目
## 初始化:
```shell
# init.sh
npm install ali-oss --save
composer install
php bin/console assets:install --symlink public
npm install
npm run dev
```
## 生成CURD:
```shell
# src/Command/CreateCurdCommand.php
# 新建表之后执行 ./sync.sh 同步数据库,生成Entity(getter/setter), 与对应的Repository.php文件
# --title=测试 页面功能名字
# --table=test_dict 为指定表创建CURD
# --service=TestDict 生成/指定Service文件
# --controller=TestDict 生成/指定Controller文件
# --extra=test_dict.json 扩展属性 比如每一列对应的中文描述,每个列对应的html控件
# --group="" 父菜单名字
# --icon="" 父菜单图标
# --readonly 只生成查询
# --export 添加导出功能
# test_dict.json 结构:
# table: 出现在列表查询中的列,同样也会作为查询条件出现在列表页
# columnText: 在数据库中,除去id, is_del, create_user, create_time, update_user, update_time之外的列,与其对应的文言
# type: 指定某个列为指定的控件类型,默认text,目前支持date, datetime, radio, select(multiple), checkbox四种类型
# source: 指多选的数据来源,目前只支持从dict表取数据 type: dict表中的type字段
# 在数据来源这里,从原则上可以指定多处来源,比如常量数组,但是为了规范开发过程,所以去掉其他情况,只支持dict,如果需要添加多个选项,请更新数据库
{
"table": {
"type": "类型",
"d_key": "键",
"d_value": "值",
"u_key": "唯一标识",
"remark": "备注"
},
"columnText": {
"type": "类型",
"d_key": "键",
"d_key1": "键1",
"d_key2": "键2",
"d_value": "值",
"u_key": "唯一标识",
"remark": "备注"
},
"type": {
"d_value": "date",
"u_key": "datetime",
"d_key1": {
"source": "dict",
"type": "course_type",
"element": "radio"
},
"d_key2": {
"source": "dict",
"type": "course_type",
"element": "checkbox"
},
"d_key3": {
"source": "dict",
"type": "course_type",
"element": "checkbox"
},
"d_key4": {
"source": "dict",
"type": "course_type",
"element": "select",
"option": "multiple"
},
"d_key": {
"source": "dict",
"type": "course_type",
"element": "select"
}
}
}
php bin/console create:curd --title=测试 --table=test_dict --service=TestDict --controller=TestDict --extra=test_dict.json --group="" --icon=""
php bin/console create:curd --title=测试 --table=test_dict --service=TestDict --controller=TestDict --extra=test_dict.json --group="" --icon="" --readonly
php bin/console create:curd --title=测试 --table=test_dict --service=TestDict --controller=TestDict --extra=test_dict.json --group="" --icon="" --readonly --export
```
## 手动添加路由:
```shell
# src/Command/AddRouteCommand.php
# test-menu 路由名字
# 测试菜单 功能名字
# /test/menu 路由地址
# App\\Controller\\TestController::menu 路由对应的文件名和方法名
# --group="" 父菜单名字
# --icon="" 父菜单图标
# --menu=1 是否是左侧菜单中的页面 0否1是 如果是0 代表页面中的某个按钮功能
# --parent=0 父节点ID 0表示为左侧菜单树中的页面 不为0表是某个页面的按钮功能
# --default=0 是否为默认权限 0否1是 即新建用户没有配置任何权限登陆系统可以使用的功能,比如首页,加载左侧树菜单
php bin/console add:route test-menu 测试菜单 /test/menu App\\Controller\\TestController::menu --group="" --icon="" --menu=1 --parent=0 --default=0
```
## 同步配置文件中的路由与数据库中的路由:
```shell
# src/Command/SyncRouteCommand.php
php bin/console sync:route
```
## 去掉表前缀:
```shell
# src/Command/SyncTableWithoutPrefixCommand.php
# 为文件添加表前缀以达到表前缀的目的
php bin/console sync:table:without:prefix
# 强制修改文件名 EqDict.php => Dict.php
php bin/console sync:table:without:prefix --force
# 指定表名忽略表前缀
php bin/console sync:table:without:prefix --table=eq_dict
```
## 生成Service文件:
```shell
# src/Command/MakeServiceCommand.php
# Test 生成TestService文件
# --entities="Dict User" 需要依赖注入的Entity App\Entity\Dict, App\Entity\User
# --di="Logger Mailer" 需要依赖注入的类名,不同namespace下提供选项
php bin/console make:service Test --entities="Dict User" --di="Logger Mailer"
php bin/console make:service Test -en="Dict User" -d="Logger Mailer"
```
## 为每一个Entity生成Repository:
```shell
# src/Command/MakeEntityRepositoryCommand.php
# User 为src/Entity/User.php 生成 src/Repository/UserRepository.php
# 一般不单独用 用法详见 ./sync.sh
php bin/console make:entity-repository User
php bin/console make:entity-repository
```
## 同步数据库信息:
```shell
# sync.sh
php bin/console doctrine:mapping:import App\\Entity annotation --path=src/Entity
php bin/console make:entity --regenerate App
php bin/console make:entity-repository
```
## ali-oss 配置:
详见:[oss-upload.md](https://gitee.com/siburuxue/symfony-example/blob/master/oss-upload.md)
### 常量文件:
```php
# 详见 src/Lib/Constant/Oss.php
```
### js上传文件:
```
public/assets/js/logic/extend.js
public/assets/js/logic/logic.js
public/assets/js/tool.js
```
### html标签
- 控件属性要同时有id和name
- data-upload: 已经上传文件
- data-uploading: 正在上传文件
- data-oss-upload: 是否用ali-oss上传文件
- true: 自动上传, 并且该控件与其他[data-oss-upload=true]的控件使用统一回到函数: `logic.js:83`
- 如果未指定属性,单独设置上传后的回调函数: `extend.js:22`
- data-file-input="true" 控件初始化
- data-id="19": 父表ID/外键ID 与 data-url-prefix 共同构成 oss-url 前缀
- data-url-prefix: oss-url前缀 文件类型「video/audio/image...」(如果是video类型,会截取视频第一帧作为视频封面)
- 文件上传成功后 oss-url: https://[bucket-name].oss-cn-beijing.aliyuncs.com/video/19/20230831130034_OwGHo20VGk.mp4
- 封面 oss-url:https://[bucket-name].oss-cn-beijing.aliyuncs.com/thumb/19/20230831130035_qJl9FaUVXc.jpg
- 每次上传成功后都会重新生成隐藏变量存储多个文件上传结果(origin_name为视频文件原文件名,尽量简洁,不要有特殊符号影响保存/查询)
```html
```