wkasunsampath/laravel-autocrud

在 Laravel 应用程序中自动化 CRUD 操作。

v1.2.9 2023-03-03 03:48 UTC

This package is auto-updated.

Last update: 2024-09-30 01:19:18 UTC


README

Latest Stable Version License PHP Version Require

当开发 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
  1. --m: 模型
  2. --mg: 迁移
  3. --c: 控制器
  4. --p: 策略
  5. --req: 表单请求
  6. --r: 资源
  7. --o: 观察者
  8. --s: 种子

此命令将根据上述文件夹结构创建文件。

索引路由

有关索引路由,有一些有用的方法可以在 autocrud 类中重写。

  1. public function indexMiddlewares(): array:您可以在其中添加索引路由特定的中件件。

  2. public function afterIndexPage(): string:在Web应用中索引操作后的视图重定向,(在API中不可用。)

  3. public function makeIndexRoute(): bool:如果设置为false,则特定模型将不可用索引路由。

  4. public function indexMethod(): string:特定索引路由的方法。默认为"GET"。

  5. public function indexEagerLoad(): array:如果您需要与索引一起预先加载任何关系数据,请在此处添加这些关系。

/**
 * Eager load relationships with index query
 */
public function indexEagerLoad(): array
{
    return ['locations'];
}
  1. public function beforeIndex(Builder $query): Builder:如果您需要修改索引查询,可以在此处进行。 (不要包含->get())

  2. public function afterIndex(Collection $data): JsonResponse | ResourceCollection | View:在将数据发送回用户之前修改检索到的索引数据。

视图路由

在autocrud类中,您可以覆盖与视图路由相关的几个有用的方法。

  1. public function viewMiddlewares(): array:您可以在其中添加视图路由特定中间件。

  2. public function afterViewPage(): string:在Web应用中视图操作后的视图重定向,(在API中不可用。)

  3. public function makeViewRoute(): bool:如果设置为false,则特定模型将不可用视图路由。

  4. public function viewMethod(): string:特定视图路由的方法。默认为“GET”。

  5. public function viewEagerLoad(): array:如果您需要与视图一起预先加载任何关系数据,请在此处添加这些关系。

  6. public function beforeView(Builder $query): Builder:如果您需要修改视图查询,可以在此处进行。 (不要包含 ->get())

  7. public function afterView(Model $model): JsonResponse | JsonResource | View:在将数据发送回用户之前修改检索到的视图数据。

创建路由

在autocrud类中,您可以覆盖与创建路由相关的几个有用的方法。

注意: 表单数据变量名必须与数据库列名相同。

  1. public function createMiddlewares(): array:您可以在其中添加创建路由特定中间件。

  2. public function afterCreatePage(): string:在Web应用中创建操作后的视图重定向,(在API中不可用。)

  3. public function makeCreateRoute(): bool:如果设置为false,则特定模型将不可用创建路由。

  4. public function createMethod(): string:特定创建路由的方法。默认为“POST”。

  5. public function createRequest(): string|null:在此处您可以设置表单请求类的名称。通常,autocrud将在文件夹结构部分遵循约定时自动获取表单请求类。否则,您可以在此处指定该类。您可以通过返回null来跳过表单请求验证。

/**
 * Request class name for create requests
 */
public function createRequest(): string|null
{
    return "\App\UserModule\Requests\UserRequest.php";
}
  1. 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;
}
  1. public function afterCreate(Model $model): JsonResponse | JsonResource | View:在将创建的数据发送回用户之前修改。

更新路由

在autocrud类中,您可以覆盖与更新路由相关的几个有用的方法。

注意: 表单数据变量名必须与数据库列名相同。

  1. public function updateMiddlewares(): array:您可以在其中添加更新路由特定中间件。

  2. public function afterUpdatePage(): string:在Web应用中更新操作后的视图重定向,(在API中不可用。)

  3. public function makeUpdateRoute(): bool:如果设置为false,则特定模型将不可用更新路由。

  4. public function updateMethod(): string:特定更新路由的方法。默认为“PUT”。

  5. public function updateRequest(): string|null: 这里可以设置表单请求类的名称。通常情况下,当你在文件夹结构部分遵循约定时,autocrud 会自动获取表单请求类。否则,您可以在这里具体指定该类。通过返回 null 可以跳过表单请求验证。

  6. public function beforeUpdate(array $data): array: 您可以在保存到数据库之前在这里更改数据。

  7. public function afterUpdate(Model $model): JsonResponse | JsonResource | View: 在将创建的数据发送回用户之前对其进行修改。

删除路由

有关删除路由的几个有用方法,您可以在 autocrud 类内部覆盖它们。

  1. public function deleteMiddlewares(): array: 您可以在这里添加删除路由特定的中间件。

  2. php public function afterDeletePage(): string: 在 Web 应用中删除操作后的视图重定向,(在 API 中不可用。)

  3. public function makeDeleteRoute(): bool: 如果将其设置为 false,则删除路由将不可用。

  4. public function deleteMethod(): string: 特定创建路由的方法。默认是“DELETE”。

  5. public function beforeDelete(Model $model): void: 在删除模型之前做些事情。

  6. public function afterDelete(): JsonResponse | View: 在发送响应给用户之前做些事情。

最佳实践

  1. 尽可能遵循文件夹结构。这样,您就不需要覆盖任何函数。
  2. 不需要为每个创建 Form Request 类、Response 类和 Policy。如果它们可用,Autocrud 会使用它们。否则,它将按照正常的 Laravel 方式进行。但是,建议尽可能使用请求、响应和政策,以避免安全风险。
  3. 为了使 Autocrud 自动发现请求、响应和政策,它们应遵循文件夹结构约定。
  4. 对于创建和更新请求,传入的表单数据变量名必须与相应的数据库列名相等。否则,Autocrud 将无法识别。
  5. 此包不是对路由的完全替代。在执行一些复杂操作时,您仍将需要使用典型的 Laravel 路由和控制器。此包只是一个辅助包,通过自动化正常的 CRUD 操作来加快您的开发速度。

更新日志

有关最近更改的更多信息,请参阅更新日志

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件