---
url: /docs/5.0/server/generate.md
---
# 代码生成

**代码生成** 真的是每个项目都必备的了！代码生成一般都是为了减少`curd`的重复工作。因为后台管理的`curd`真的是必备的，所以代码生成还是很有必要的。目前代码生成可以自动生成以下文件

* 控制器 Controller
* 表单验证请求
* 模型 Model
* 自动写入 restful 路由
* 数据库文件(migration)
* 前端列表页面
* 前端表单页面
* 自动生成权限菜单

:::warning

* 因为项目是前后端分离的，所以代码生成只能在开发环境使用
* 代码生成工具并不是智能工具，它是根据已有信息渲染对应的模板
  :::

## 基本使用

### 模块

众所周知，`CatchAdmin` 是模块化的，那么首先需要干什么呢？没错，就是新增模块。如下图所示
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202506091612109.png)
点击新增按钮，按照提示信息输入模块信息，然后点击创建模块。

模块创建之后回生成如下文件，以本地 Test 模块为例，如下图所示
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202506091613914.png)
来解释下具体文件信息
:::code-group

```php [TestServiceProvider.php]
// 模块服务，用于加载模块的配置和事件的，在[模块化]章节有详细介绍
class TestServiceProvider extends CatchModuleServiceProvider
{
    /**
     * route path
     *
     * @return string
     */
    public function moduleName(): string
    {
        // TODO: Implement path() method.
        return 'test';
    }
}

```

```php [route.php]
// 模块路由
Route::prefix('test')->group(function () {
    Route::adminResource('pay/order/refunds', PayOrderRefundsController::class);

    Route::adminResource('admin/users', AdminUsersController::class);
    //next
});
```

```php [Installer.php]
// 模块安装器，在[模块化]章节有详细介绍
class Installer extends ModuleInstaller
{
    protected function info(): array
    {
        // TODO: Implement info() method.
        return [
            'title' => '测试',
            'name' => 'test',
            'path' => 'Test',
            'keywords' => 'test',
            'description' => 'test',
            'provider' => TestServiceProvider::class,
        ];
    }

    protected function requirePackages(): void
    {
        // TODO: Implement requirePackages() method.
    }

    protected function removePackages(): void
    {
        // TODO: Implement removePackages() method.
    }
}

```

:::

模块创建完成之后，然后在创建 `Schema`，这里所谓的 `schema` 就是数据库的表，支持新建表，也支持已有表创建。

### 新建表

![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202512071101828.png)
按照提示填写表信息，然后点击下一步
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202512071102650.png)
如图，需要在这里添加表字段，完成之后，点击创建即可。如下图
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202512071103790.png)

### 已有表创建

从已有表里面创建对应生成表记录
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202506091622871.png)

## 代码生成

在 `schema` 管理页面的点击对应记录生成代码按钮之后，进入到生成代码的页面
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202506111042294.png)

### 参数

生成代码页面有几个比较重要的参数

* `模块` 是必选的，这保证代码生成到某个模块中
* `控制器` 名称是必填的，会在模块的 `Http` 目录下 `Controller` 文件
* `模型名称` 是默认根据表名称生成模型名称，是大驼峰的命名方式
* `菜单名称` 填写了菜单名称会自动生成权限管理的菜单，不填则不生成
* `模型关联关系` 支持生成模型关联关系
* `操作`
* 分页是否支持分页
* 是否生成表单
* 是否使用动态表单，动态表单相关[文档](https://form-builder.catchadmin.vip)

### 表格和表单生成

:::info
注意代码生成的字段是支持拖拽的，你可以拖拽到合适的位置
:::

### 表单组件

普通的自带组件这里就不多做解释了。来看看 catchadmin 新增的和后台强制绑定的组件

#### 字典组件

![CatchAdmin  代码生成 字典组件 - Laravel Admin](https://image.catchadmin.com/202506091650123.png)
生成的效果如下
![CatchAdmin  代码生成 字典组件 - Laravel Admin](https://image.catchadmin.com/202506091714665.png)

#### 附件上传组件

![CatchAdmin  代码生成 附件上传组件 - Laravel Admin](https://image.catchadmin.com/202506091725566.png)

#### 单图/多图上传组件

![CatchAdmin  代码生成 单图/多图上传组件 - Laravel Admin](https://image.catchadmin.com/202506091726558.png)

#### 单文件/多文件上传组件

![CatchAdmin  代码生成 单文件/多文件上传组件 - Laravel Admin](https://image.catchadmin.com/202506091725907.png)

#### 远程级联组件

远程组件需要选择数据源，如下图，其他远程组件类似，如果需要支持树形的话，要选择父级字段。
![CatchAdmin  代码生成 远程级联组件 - Laravel Admin](https://image.catchadmin.com/202506091654120.png)

生成后的效果
![CatchAdmin  代码生成 远程级联组件 - Laravel Admin](https://image.catchadmin.com/202506091715773.png)

#### 远程下拉组件

![CatchAdmin  代码生成 远程下拉组件 - Laravel Admin](https://image.catchadmin.com/202506091724707.png)

#### 远程树形组件

![CatchAdmin  代码生成 远程下拉组件 - Laravel Admin](https://image.catchadmin.com/202506091724974.png)

#### 远程树形下拉组件

![CatchAdmin  代码生成 远程树形下拉组件 - Laravel Admin](https://image.catchadmin.com/202506091729938.png)

#### 图标选择组件

![CatchAdmin  代码生成 图标选择组件 - Laravel Admin](https://image.catchadmin.com/202506091714910.png)

#### 下拉

类似这种下拉选项的可以支持动态添加，例如 radio checkbox 等
![CatchAdmin  代码生成 下拉 - Laravel Admin](https://image.catchadmin.com/202506091706997.png)

### 验证规则

:::info
验证规则是 Laravel 内置的验证规则，只支持部分前端规则
:::

#### 以下是前端验证的规则

* `required` 必须填写
* `string` 必须是字符串类型
* `url` URL 格式不正确
* `number` 必须是数字类型
* `email` 邮箱格式不正确
* `boolean` 必须是布尔类型
* `date` 日期格式

验证规则会生成在，如下图
![CatchAdmin  代码生成 - Laravel Admin](https://image.catchadmin.com/202506091647938.png)

## 后端

### 枚举

如果你使用的是下拉选项之类的，就是包含`options`选项的组件，后端会自动识别，并且生成文本返回。
例如状态字段，它的 options 选项如下

```json
[
  {
    "label": "正常",
    "value": "1"
  },
  {
    "label": "禁用",
    "value": "2"
  }
]
```

那么模型会生成如下面的代码

```php
/**
 * status 字段转换器
 *
 * @return Attribute
 */
public function statusText(): Attribute
{
    $text = [2 => '禁用', 1 => '正常'];

    return Attribute::make(get: fn ($value) => $text[$this->status] ?? '');
}
```

前端的状态字段也会自动使用`status_text`字段来渲染

### 图片

多图的情况下，会自动生成下面的代码，这里使用`avatar`字段演示

```php
 /**
 * avatar 转换
 *
 * @return Attribute
 */
public function avatar(): Attribute
{
    return Attribute::make(
    get: fn ($value) => ! $value ? [] : array_map(fn ($item) => $item ? url($item) : '', json_decode($value, true)),
    set: fn ($value) => json_encode(array_map(fn ($value) => remove_app_url($value), $value))
    );
}
```

![CatchAdmin  代码生成，前端会自动生成图片展示 - Laravel Admin](https://image.catchadmin.com/202506091831480.png)

### Switch 组件

首先会在前端表格内生成一个`switch`组件，用于字段值切换
![CatchAdmin  代码生成，Switch 组件 - Laravel Admin](https://image.catchadmin.com/202506091835857.png)
还会在对应的控制器生成如下代码，因为是 `status` 字段，所以生成下面的默认代码

```php
public function enable(mixed $id): mixed
{
    return $this->model->toggleBy($id);
}
```

如果是其他非`status`字段则生成如下代码

```php
public function enable(mixed $id, Request $request): mixed
{
    $field = $request->get('field');

    return $this->model->toggleBy($id, $field);
}
```

:::warning
这里需要注意的是，系统内置的状态切换的值，并不是 0 和 1。而是 `1 是` 和 `2 否`，如果不是这么做的，需要你自己再模型重写 `toggleBy` 方法
:::

### 导出

如图，选择你需要导出的字段
![CatchAdmin  代码生成，导出 组件 - Laravel Admin](https://image.catchadmin.com/202506111045226.png)
最终代码生成一个导出得文件 `modules/Test/Excel/Export/xxxxExport.php`，文件内容如下

```php

/**
 * 导出数据
 *
 *
 * @class Excel\Export\AdminUsersExport
 */
class AdminUsersExport extends Export
{
    protected array $header = [
        'id',
        '字典选择器',
        '图标选择',
        '远程树形',
        '文件上传',
        '但附件',
        '多附件上传',
        '图片上传',
        '多图片上传',
        '创建时间',
        '更新时间',
    ];

    /**
     * @return array
     */
    public function array(): array
    {
        return AdminUsers::query()->get()->select([
            'id',
            'username',
            'password',
            'avatar',
            'remember_token',
            'department_id',
            'status_text',
            'login_ip',
            'login_at',
            'created_at',
            'updated_at',
        ])->toArray();
    }
}

```

这里主要注意的是。代码生成器会在转换上面的枚举值，将对应的枚举值转换成中文说明

### 导入

跟导出是一样的，选择字段进行导入
![CatchAdmin  代码生成，导入 组件 - Laravel Admin](https://image.catchadmin.com/202506111049536.png)
最终代码生成一个导出得文件 `modules/Test/Excel/Export/xxxxImport.php`，文件内容如下

```php

/**
 * 导入数据
 *
 *
 * @class Excel\Import\AdminUsersImport
 */
class AdminUsersImport extends Import
{
    /**
     * 导入数据
     *
     *
     * @param  Collection  $rows
     * @return void
     */
    public function collection(Collection $rows): void
    {
        $rows->each(function ($row) {
            $model = new AdminUsers;
            $model->id = $row[0];
            $model->username = $row[1];
            $model->password = $row[2];
            $model->mobile = $row[3];
            $model->email = $row[4];
            $model->save();
        });
    }
}

```

CatchAdmin 还自动生成了一个模板文件，根据选择字段`label`值。模板文件存放在`storage/static/importTemplates/xxxx导入模板.xlsx`。

:::warning
实际导入业务比较复杂，可以自行修改导入类
:::
