ebalo / easycrud

1.0.2 2021-04-28 09:15 UTC

This package is auto-updated.

Last update: 2024-09-28 16:46:42 UTC


README

Latest Version on Packagist Total Downloads

此包旨在避免在Laravel应用程序中创建标准CRUD端点的重复性工作,最终目标是让您在不到一分钟内创建标准CRUD端点,而无需担心所有重复性任务。

安装

您可以通过composer安装此包

composer require ebalo/easycrud

然后使用以下命令初始化包:

php artisan easy-crud:install

如果您想手动为所有控制器安装特性或只为部分控制器安装,则应

  • 在需要特性的控制器中包含 use Ebalo\EasyCRUD\EasyCRUD;
  • 在控制器体内包含 use EasyCRUD;

用法

此包提供两种方法来访问所有功能

  • 推荐的方法是通过使用EasyCRUD特性,在完成安装时自动插入到您的顶级控制器中
  • 第二种方法是通过使用辅助函数

通过特性使用

该特性公开四个主要函数,这些是

  • easyCrud 它执行基本的CRUD操作,这是最灵活的方法,也是所有其他方法的基础。
  • easyStore 它专门设计用于存储新的模型实例。
  • easyUpdate 它专门设计用于更新现有的模型实例。
  • easyDelete 它专门设计用于删除现有的模型实例。

存储和更新过程依赖于rules数组从请求中检索参数。 rules数组是一个标准的Laravel验证数组,类似于在Validator::create方法或控制器类的标准validate方法中使用的数组。

示例用法

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
// ...

class CategoryController extends Controller
{
    // Validation rules array, inherited from the EasyCRUD trait
    protected array $rules = [
        "name" => "required|string|max:255|unique:categories,name",
        "icon" => "required|string",
        // ...
    ];
    
    public function store(Request $request): RedirectResponse
    {
        return $this->easyStore(
            $request,               // Request to validate
            Category::class,        // Model to create
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
    
    public function update(Request $request, Category $category): RedirectResponse
    {
        return $this->easyUpdate(
            $request,               // Request to validate
            $category,              // Model to update
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
    
    public function destroy(Category $category): RedirectResponse
    {
        return $this->easyDelete(
            $category,              // Model to update
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
    
    // ...
}

您可能已经注意到规则对name参数有唯一性检查,在更新阶段自动删除此检查,以便您轻松更新模型而无需任何警告。
所有上述方法都可以使用标准且更灵活的easyCrud函数编写,请参阅以下示例。

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
// ...

class CategoryController extends Controller
{
    // Validation rules array, inherited from the EasyCRUD trait
    protected array $rules = [
        "name" => "required|string|max:255|unique:categories,name",
        "icon" => "required|string",
        // ...
    ];
    
    public function store(Request $request): RedirectResponse
    {
        return $this->easyCrud(
            $request,               // Request to validate
            Category::class,        // Model to create
            "create",               // Creation function
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
    
    // ...
}

您可以看到easyCrud与前面的示例没有太大区别。

通过辅助函数使用

有四个辅助函数,这些是

  • easyCrud 它执行基本的CRUD操作,这是最灵活的方法,也是所有其他方法的基础。
  • easyStore 它专门设计用于存储新的模型实例。
  • easyUpdate 它专门设计用于更新现有的模型实例。
  • easyDelete 它专门设计用于删除现有的模型实例。

存储和更新过程依赖于rules数组从请求中检索参数。 rules数组是一个标准的Laravel验证数组,类似于在Validator::create方法或控制器类的标准validate方法中使用的数组。
如您所见,名称与特性中可用的函数名称完全相同,这样做是为了让您只需记住一个函数名称。

示例用法

示例用法比前面的示例要复杂和繁琐,请查看以下相同方法的实现示例。

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
// ...

class CategoryController extends Controller
{
    // Note the that $rules now is marked as private
    private array $rules = [
        "name" => "required|string|max:255|unique:categories,name",
        "icon" => "required|string",
        // ...
    ];

    public function store(Request $request): RedirectResponse
    {
        return easyStore(
            $this,                  // Instance of the caller class
            $request,               // Request to validate
            $this->rules,           // Array of validation rules
            Category::class,        // Model to create
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }

    public function update(Request $request, Category $category): RedirectResponse
    {
        return easyUpdate(
            $this,                  // Instance of the caller class
            $request,               // Request to validate
            $this->rules,           // Array of validation rules
            $category,              // Model to update
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }

    public function destroy(Category $category): RedirectResponse
    {
        return easyDelete(
            $category,              // Model to delete
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
}

所有上述方法都可以使用标准且更灵活的easyCrud函数编写,请参阅以下示例。

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
// ...

class CategoryController extends Controller
{
    // Validation rules array, inherited from the EasyCRUD trait
    protected array $rules = [
        "name" => "required|string|max:255|unique:categories,name",
        "icon" => "required|string",
        // ...
    ];
    
    public function store(Request $request): RedirectResponse
    {
        return easyCrud(
            $this,                  // Instance of the caller class
            $request,               // Request to validate
            $this->rules,           // Array of validation rules
            Category::class,        // Model to create
            "create",               // Creation function
            "categories-index"      // Redirect if validation and creation ends successfully
        );
    }
    
    // ...
}

附加功能

由于创建CRUD路由几乎总是复制粘贴之前创建的代码,因此该包附带了一个CRUD辅助函数,可以轻松地从您的路由中调用。请参阅以下示例。

use App\Http\Controllers\CategoryController;
// ...

CRUD(
    "categories",                   // Route path prefix
    CategoryController::class,      // Controller class to call
    "category",                     // Route name prefix
    "category"                     // Parameter name for the routes that requires one
);
// ...

上述代码与以下代码完全一样。

use App\Http\Controllers\CategoryController;
// ...

Route::prefix("/categories")->group(function() {
     Route::get("/", [CategoryController::class, "index"])->name("category-list");
     Route::get("/{category}", [CategoryController::class, "show"])->name("category-show");
     
     Route::get("/create", [CategoryController::class, "create"])->name("category-create");
     Route::post("/create", [CategoryController::class, "store"])->name("category-store");
     
     Route::get("/edit/{category}", [CategoryController::class, "edit"])->name("category-edit");
     Route::put("/edit/{category}", [CategoryController::class, "update"])->name("category-update");
     
     Route::delete("/delete/{category}", [CategoryController::class, "destroy"])->name("category-delete");
});
// ...

如果您不想生成所有预定义的CRUD路由,还可以传递一个额外的关联数组,如下例所示。

use App\Http\Controllers\CategoryController;
// ...

CRUD(
    "categories",                   // Route path prefix
    CategoryController::class,      // Controller class to call
    "categories",                   // Route name prefix
    "category",                     // Parameter name for the routes that requires one
    [                               // Array of crud functionalities to register
        "create" => true,           // Register the creation endpoints
        "read" => false,            // Don't register the reading endpoints
        "update" => false,          // Don't register the updating endpoints
        "delete" => true           // Don't register the deletion endpoints
    ]
);
// ...

上述代码与以下代码相同。

use App\Http\Controllers\CategoryController;
// ...

Route::prefix("/categories")->group(function() {     
     Route::get("/create", [CategoryController::class, "create"])->name("categories-create");
     Route::post("/create", [CategoryController::class, "store"])->name("categories-store");
     
     Route::delete("/delete/{category}", [CategoryController::class, "destroy"])->name("categories-delete");
});
// ...

还有另一种调用CRUD函数的方法,它允许您在路由执行后更改要调用的函数,请参阅最后一个示例。

use App\Http\Controllers\CategoryController;
// ...

CRUD(
    "categories",                   // Route path prefix
    CategoryController::class,      // Controller class to call
    "categories",                   // Route name prefix
    "category",                     // Parameter name for the routes that requires one
    [                               // Array of crud functionalities to register
        "create" => true,           // Register the creation endpoints
        "read" => false,            // Don't register the reading endpoints
        "update" => false,          // Don't register the updating endpoints
        "delete" => false            // Don't register the deletion endpoints
    ],
    $functions = [
        "list" => "list_function",
        "read" => "read_function",
        "create" => "creation_function",
        "store" => "store",
        "edit" => "edit",
        "update" => "update",
        "delete" => "destroy"
    ]
);
// ...

上述代码与以下代码相同。

use App\Http\Controllers\CategoryController;
// ...

Route::prefix("/categories")->group(function() {     
     Route::get("/create", [CategoryController::class, "creation_function"])->name("categories-create");
     Route::post("/create", [CategoryController::class, "store"])->name("categories-store");
});
// ...

更新日志

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

贡献

有关详细信息,请参阅贡献指南

安全

如果您发现任何安全相关的问题,请使用问题跟踪器。

致谢

许可证

MIT许可证(MIT)。请参阅许可证文件获取更多信息。