ebalo / easycrud
Requires
- php: ^8.0
- illuminate/support: ^8.0
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
README
此包旨在避免在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)。请参阅许可证文件获取更多信息。