chiariello/laravel-api-crud-maker

用于创建具有过滤功能的API CRUD的包

0.1.0 2023-09-24 22:51 UTC

This package is auto-updated.

Last update: 2024-09-24 10:18:02 UTC


README

在Laravel项目中创建具有过滤功能的API CRUD

安装

通过composer

composer require chiariello/laravel-api-crud-maker

在config/app.php中添加FilterServiceProvider和RequestServiceProvider

    'providers' => ServiceProvider::defaultProviders()->merge([
        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        Chiariello\LaravelApiCrudMaker\Providers\FilterServiceProvider::class, // <-- Add This
        Chiariello\LaravelApiCrudMaker\Providers\RequestServiceProvider::class, // <-- Add This
    ])->toArray(),

使用方法

创建新的模型和迁移以及控制器

composer php artisan make:model Flight --migration --controller

根据需要编辑迁移文件

Schema::create('flights', function (Blueprint $table) {
    $table->id();
    $table->string('departure');
    $table->string('destination');
    $table->timestamps();
});

在模型中添加HasFilters特性和fillables属性

namespace App\Models;

use Chiariello\LaravelApiCrudMaker\Traits\HasFilters;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    use HasFactory, HasFilters;

    protected $fillable = [
        'departure',
        'destination'
    ];
}

扩展CrudController并在控制器类中设置 $model 属性

namespace App\Http\Controllers;

use App\Models\Flight;
use Chiariello\LaravelApiCrudMaker\Controllers\CrudController;

class FlightController extends CrudController
{
    protected string $model = Flight::class;
}

在app/Filters目录下创建Filter类,其名称必须为{ModelName}Filter.php(例如FlightFilters.php)。

现在需要设置过滤数组,并为每个过滤属性创建一个方法。

namespace App\Filters;

use Chiariello\LaravelApiCrudMaker\Filters\AbstractFilters;

class FlightFilters extends AbstractFilters
{
    protected array $filters = [
        'departure',
        'destination'
    ];
    
    public function departure(string $departure)
    {
        $this->like('departure', $departure);
    }
    
    public function destination(string $destination)
    {
        $this->like('destination', $destination);
    }
    
}

创建一个名为{{ModelName}}Request.php的表单请求

php artisan make:request FlightRequest

设置验证并创建和更新逻辑。

namespace App\Http\Requests;

use App\Models\Flight;
use Illuminate\Foundation\Http\FormRequest;

class FlightRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            //
        ];
    }

    public function persist(){

        if($this->id){
            return Flight
                ::findOrFail($this->id)
                ->update($this->all());
        }
        return Flight::create($this->all());
    }
}

在api.php中添加路由

use App\Http\Controllers\FlightController;
use Chiariello\LaravelApiCrudMaker\Utils\RouteUtility;

RouteUtility::controllerRoutes(FlightController::class,'flights');

致谢