wkasunsampath / laravel-autocrud
在 Laravel 应用程序中自动化 CRUD 操作。
Requires
- php: ^8.0
- illuminate/contracts: ^8.0|^9.0|^10.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
README
当开发 Laravel 应用程序时,开发人员必须为多个模型编写 CRUD 操作。其中一些操作只是常规的 CRUD 操作,没有任何特殊逻辑。此包旨在自动化这些 CRUD 操作。因此,开发人员可以节省大部分的开发时间。
要为 User 模型创建完整的 CRUD,只需运行以下命令,
php artisan autocrud:create User
您只需做这些。 :) 现在,您的 Laravel 应用已注册以下路由。要查看路由,请运行 php artisan route:list
。
看起来很有趣? :D 好的,让我们继续。
安装
您可以通过 composer 安装此包:(目前仅支持 Laravel 8、9 和 10)
composer require wkasunsampath/laravel-autocrud
您可以使用以下命令发布资产和配置:
php artisan autocrud:install
全部完成。现在您可以在配置文件夹中看到一个名为 autocrud.php
的文件。此外,在 \App\Http
文件夹中还有一个名为 Autocruds 的新文件夹。
用法
让我们假设有一个名为 Office
的模型位于 \App\Models\Company\Office.php
。要为该模型创建完整的 CRUD,只需运行,
php artisan autocrud:create Company/Office
全部完成。您的 CRUD 现在正在运行。不确定吗?好的,只需运行 php artisan route:list
。
注意:建议在 Autocruds 文件夹内保持与模型文件夹内相同的结构。
让我们深入了解。
文档
Autocrud 类
Autocrud 类是在运行 php artisan autocrud:create {class_name}
时生成的文件。通常,这些文件存储在 \App\Http\Autocruds
文件夹中。
Autocruds 类扩展了 BaseCrud 类。此类最重要的设置是 protected string $model
。您可以将需要创建 CRUD 的模型绑定到这里。建议使用模型名作为 Autocrud 类名。
<?php namespace App\Http\Autocruds; use WKasunSampath\LaravelAutocrud\BaseCrud; class User extends BaseCrud { /** * Set whether CRUD operations are related to API or not. */ protected bool $isApi = true; /** * Model instance which CRUD operations relate. */ protected string $model = \App\Models\User::class; /** * Middlewares which are applied to all routes * * Ex: ['auth:sanctum'] */ public function commonMiddlewares(): array { return []; } }
您可以将 protected bool $isApi
设置为 false
,如果特定的 CRUD 与 Laravel Web 应用相关。如果将 protected bool $isApi
设置为 true,则所有 CRUD 路由都将以 "api/" 前缀。
在 public function commonMiddlewares()
内,您可以定义应用于所有 CRUD 路由的中件件。
所有 autocrud 类都必须注册在 App\Http\Autocruds
文件夹内的 Autocruds.php
文件中。然而,在您运行 autocrud:create
命令时,此过程将自动完成。
<?php namespace App\Http\Autocruds; use WKasunSampath\LaravelAutocrud\AutocrudRouter; class Autocruds extends AutocrudRouter { /** * Register all autocrud classes here. */ protected array $autocruds = [ \App\Http\Autocruds\User::class, ]; }
配置
Autocrud 配置文件包含一些对您的应用有用的配置选项。通常,在您运行 php artisan autocrud:install
命令时,此文件会被发布。
文件夹结构
建议在使用 autocrud 库时遵循以下约定。
.
└── Laravel App/
├── App/
│ ├── Http/
│ │ ├── Autocruds/
│ │ │ ├── Autocruds.php
│ │ │ ├── User.php
│ │ │ └── Company/
│ │ │ └── Office.php
│ │ ├── Requests/
│ │ │ ├── UserCreateRequest.php
│ │ │ ├── UserUpdateRequest.php
│ │ │ └── Company/
│ │ │ ├── OfficeCreateRequest.php
│ │ │ └── OfficeUpdateRequest.php
│ │ └── Resources/
│ │ ├── UserResource.php
│ │ ├── UserCollection.php
│ │ └── Company/
│ │ ├── OfficeResource.php
│ │ └── OfficeCollection.php
│ ├── Models/
│ │ ├── User.php
│ │ └── Company/
│ │ └── Office.php
│ └── Policies/
│ ├── UserPolicy.php
│ └── OfficePolicy.php
├── config/
│ └── autocrud.php
└── resources/
└── views/
└── users/
├── index.blade.php
├── view.blade.php
├── create.blade.php
├── update.blade.php
└── delete.blade.php
如您所注意到的,在视图文件夹中创建五个不同的 CRUD 文件有点不正常,并且大多数情况下并不必要。(这仅适用于 Web 应用。)当您为 Web 应用创建 autocrud 类时,将会有函数来覆盖这种行为。
通过将一些选项传递给 artisan 命令,可以通过 Autocrud 类轻松地创建模型、控制器、策略、请求、资源、迁移和观察者。
php artisan autocrud:create Company/Office --m --mg --c --p --req --r --o --s
- --m: 模型
- --mg: 迁移
- --c: 控制器
- --p: 策略
- --req: 表单请求
- --r: 资源
- --o: 观察者
- --s: 种子
此命令将根据上述文件夹结构创建文件。
索引路由
有关索引路由,有一些有用的方法可以在 autocrud 类中重写。
-
public function indexMiddlewares(): array
:您可以在其中添加索引路由特定的中件件。 -
public function afterIndexPage(): string
:在Web应用中索引操作后的视图重定向,(在API中不可用。) -
public function makeIndexRoute(): bool
:如果设置为false,则特定模型将不可用索引路由。 -
public function indexMethod(): string
:特定索引路由的方法。默认为"GET"。 -
public function indexEagerLoad(): array
:如果您需要与索引一起预先加载任何关系数据,请在此处添加这些关系。
/** * Eager load relationships with index query */ public function indexEagerLoad(): array { return ['locations']; }
-
public function beforeIndex(Builder $query): Builder
:如果您需要修改索引查询,可以在此处进行。 (不要包含->get()
) -
public function afterIndex(Collection $data): JsonResponse | ResourceCollection | View
:在将数据发送回用户之前修改检索到的索引数据。
视图路由
在autocrud类中,您可以覆盖与视图路由相关的几个有用的方法。
-
public function viewMiddlewares(): array
:您可以在其中添加视图路由特定中间件。 -
public function afterViewPage(): string
:在Web应用中视图操作后的视图重定向,(在API中不可用。) -
public function makeViewRoute(): bool
:如果设置为false,则特定模型将不可用视图路由。 -
public function viewMethod(): string
:特定视图路由的方法。默认为“GET”。 -
public function viewEagerLoad(): array
:如果您需要与视图一起预先加载任何关系数据,请在此处添加这些关系。 -
public function beforeView(Builder $query): Builder
:如果您需要修改视图查询,可以在此处进行。 (不要包含 ->get()) -
public function afterView(Model $model): JsonResponse | JsonResource | View
:在将数据发送回用户之前修改检索到的视图数据。
创建路由
在autocrud类中,您可以覆盖与创建路由相关的几个有用的方法。
注意: 表单数据变量名必须与数据库列名相同。
-
public function createMiddlewares(): array
:您可以在其中添加创建路由特定中间件。 -
public function afterCreatePage(): string
:在Web应用中创建操作后的视图重定向,(在API中不可用。) -
public function makeCreateRoute(): bool
:如果设置为false,则特定模型将不可用创建路由。 -
public function createMethod(): string
:特定创建路由的方法。默认为“POST”。 -
public function createRequest(): string|null
:在此处您可以设置表单请求类的名称。通常,autocrud将在文件夹结构部分遵循约定时自动获取表单请求类。否则,您可以在此处指定该类。您可以通过返回null来跳过表单请求验证。
/** * Request class name for create requests */ public function createRequest(): string|null { return "\App\UserModule\Requests\UserRequest.php"; }
public function beforeCreate(array $data): array
:您可以在保存到数据库之前在此处更改数据。
/** * Do things before add data to the DB. */ public function beforeCreate(array $data): array { if (array_key_exists('password', $data)) { $data['password'] = Hash::make($data['password']); } if (array_key_exists('profile_picture', $data)) { //Perform file saving here & get $fileName. $data['profile_picture'] = $fileName; } return $data; }
public function afterCreate(Model $model): JsonResponse | JsonResource | View
:在将创建的数据发送回用户之前修改。
更新路由
在autocrud类中,您可以覆盖与更新路由相关的几个有用的方法。
注意: 表单数据变量名必须与数据库列名相同。
-
public function updateMiddlewares(): array
:您可以在其中添加更新路由特定中间件。 -
public function afterUpdatePage(): string
:在Web应用中更新操作后的视图重定向,(在API中不可用。) -
public function makeUpdateRoute(): bool
:如果设置为false,则特定模型将不可用更新路由。 -
public function updateMethod(): string
:特定更新路由的方法。默认为“PUT”。 -
public function updateRequest(): string|null
: 这里可以设置表单请求类的名称。通常情况下,当你在文件夹结构部分遵循约定时,autocrud 会自动获取表单请求类。否则,您可以在这里具体指定该类。通过返回 null 可以跳过表单请求验证。 -
public function beforeUpdate(array $data): array
: 您可以在保存到数据库之前在这里更改数据。 -
public function afterUpdate(Model $model): JsonResponse | JsonResource | View
: 在将创建的数据发送回用户之前对其进行修改。
删除路由
有关删除路由的几个有用方法,您可以在 autocrud 类内部覆盖它们。
-
public function deleteMiddlewares(): array
: 您可以在这里添加删除路由特定的中间件。 -
php public function afterDeletePage(): string
: 在 Web 应用中删除操作后的视图重定向,(在 API 中不可用。) -
public function makeDeleteRoute(): bool
: 如果将其设置为 false,则删除路由将不可用。 -
public function deleteMethod(): string
: 特定创建路由的方法。默认是“DELETE”。 -
public function beforeDelete(Model $model): void
: 在删除模型之前做些事情。 -
public function afterDelete(): JsonResponse | View
: 在发送响应给用户之前做些事情。
最佳实践
- 尽可能遵循文件夹结构。这样,您就不需要覆盖任何函数。
- 不需要为每个创建 Form Request 类、Response 类和 Policy。如果它们可用,Autocrud 会使用它们。否则,它将按照正常的 Laravel 方式进行。但是,建议尽可能使用请求、响应和政策,以避免安全风险。
- 为了使 Autocrud 自动发现请求、响应和政策,它们应遵循文件夹结构约定。
- 对于创建和更新请求,传入的表单数据变量名必须与相应的数据库列名相等。否则,Autocrud 将无法识别。
- 此包不是对路由的完全替代。在执行一些复杂操作时,您仍将需要使用典型的 Laravel 路由和控制器。此包只是一个辅助包,通过自动化正常的 CRUD 操作来加快您的开发速度。
更新日志
有关最近更改的更多信息,请参阅更新日志。
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件。