david-chamling/laravel-api-crud 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

david-chamling/laravel-api-crud

最新稳定版本:v1.0.1

Composer 安装命令:

composer require david-chamling/laravel-api-crud

包简介

A complete Laravel API CRUD generator with model, controller, service, requests and resources scaffolding

README 文档

README

Laravel PHP GitHub Repo stars

A powerful Laravel package that generates complete CRUD API scaffolding with a single Artisan command.

🚀 Features

  • 🔧 Single-command CRUD scaffolding
  • 🧩 Built-in lifecycle hooks (before/after store/update)
  • 🚪 Custom route macros
  • 🔍 Advanced search and filtering
  • 📄 Pagination support
  • 🛡️ Request validation
  • 🎯 Resource transformation
  • 👤 Automatic user tracking (created_by / updated_by)
  • ⚙️ Customizable stubs

✅ Requirements

  • PHP >= 8.1
  • Laravel >= 9.x

📚 Learn by Example

Want to see it in action? Check out this step-by-step guide where we build a complete Blog API using this package:

👉 Read the full step-by-step tutorial on Medium

📦 Installation

Install via Composer:

composer require david-chamling/laravel-api-crud

(Optional) Publish stub files for customization:

php artisan vendor:publish --tag=crud-stubs

⚡ Basic Usage

Generate full CRUD scaffolding for a model:

php artisan make:crud Product

This will generate:

  • Controller
  • Service class
  • Form requests
  • API resource
  • Model
  • Migration
  • Routes

Define routes in your routes/api.php:

Route::crudResource('products', ProductController::class);

✅ Note: The crudResource() macro is automatically registered by the package.

🔒 Request Validation

For security and data integrity, you must define complete validation rules in your generated request classes.

⚠️ Important: This CRUD system only uses validated data. If you forget to define rules in your request classes, fields like name, price, etc., will be empty or missing from your controller — even if you pass them in the request.

Define validation rules in your generated request classes:

// StoreProductRequest.php

public function rules(): array
{
    return [
        'name' => 'required|string|max:255',
        'price' => 'required|numeric|min:0',
        'category_id' => 'required|exists:categories,id'
    ];
}

🧩 Model Configuration

Ensure your model’s $fillable property includes all the fields:

// Product.php

protected $fillable = [
    'name',
    'price',
    'category_id',
    // Add additional fields here
];

📘 Generated Endpoints

Method Endpoint Description
GET /products Paginated list
GET /products/all Get all records
GET /products/count Count total items
GET /products/{id} Get single record
POST /products Create new record
PUT /products/{id} Update record
DELETE /products/{id} Delete record
GET /products/featured Custom endpoint

🔍 Advanced Query Parameters

Customize search, filters, and pagination in your controller:

protected array $searchableColumns = ['name', 'description'];
protected array $searchableRelations = ['category' => ['name']];
protected int $paginationNumber = 15;

Examples:

GET /products?search=keyboard
GET /products?filter[status]=active
GET /products?sort_by=price&sort_order=desc
GET /products?with=category&fields=id,name
GET /products?per_page=20&page=2

🪝 Lifecycle Hooks

Override lifecycle hooks in your custom CRUD service:

public function beforeStore(array $data, Request $request): array
{
    $data['slug'] = Str::slug($data['name']);
    return $data;
}

public function afterStore(Model $model, Request $request): void
{
    // sending Notification, Sms, Creating logs, Storing into relational table
    // example:
    ActivityLog::create([
        'user_id' => $request->user()->id,
        'action' => 'store',
        'model_id' => $model->id,
        'changes' => $model->getChanges(),
    ]);

    if ($model->wasChanged('status')) {
        Notification::send(
            $model->assignedUsers,
            new StatusUpdatedNotification($model)
        );
    }
}

🔁 API Responses

Use the built-in response helper for consistency:

use DavidChamling\LaravelApiCrud\Utilities\ApiResponse;

return ApiResponse::success($data);         // 200 OK
return ApiResponse::created($newModel);     // 201 Created
return ApiResponse::error('Something went wrong'); // 400/500 Error
return ApiResponse::validationError($errors);      // 422 Unprocessable

🧱 Customization

After publishing stubs, you can customize all generated files:

stubs/crud-controller/
├── controller.stub
├── model.stub
├── service.stub
├── store-request.stub
├── update-request.stub
├── resource.stub

Modify these to fit your code style or architecture.

💡 Example Controller

use DavidChamling\LaravelApiCrud\Controllers\CrudController;
use DavidChamling\LaravelApiCrud\Utilities\ApiResponse;

class ProductController extends CrudController
{
    protected array $searchableColumns = ['name', 'sku'];
    protected array $searchableRelations = [
        'category' => ['name'],
        'manufacturer' => ['name'],
    ];

    public function __construct()
    {
        parent::__construct(
            model: Product::class,
            storeRequest: StoreProductRequest::class,
            updateRequest: UpdateProductRequest::class,
            simpleResource: ProductResource::class,
            detailedResource: ProductDetailResource::class,
            serviceClass: ProductCrudService::class
        );
    }

    public function featured()
    {
        $products = $this->model::featured()->get();
        return ApiResponse::success(ProductResource::collection($products));
    }
}

🛠️ Support

Having issues or suggestions? Open an issue on GitHub:

👉 GitHub Repository

📝 License

MIT Licensed. See LICENSE.

🤝 Contributing

Pull requests and suggestions are welcome! Feel free to open issues for bugs or enhancements.

统计信息

  • 总下载量: 33
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 12
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 11
  • Watchers: 0
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-05-27