chargefield/laravel-savable

Savable 是一个 Laravel 扩展包,可以帮助您组织业务逻辑。

v1.0.0 2021-09-05 16:36 UTC

This package is auto-updated.

Last update: 2024-09-06 09:22:48 UTC


README

Social Icon of Laravel Savable

Laravel Savable

Latest Stable Version Total Downloads License Tests

Savable 是一个 Laravel 扩展包,可以帮助您组织业务逻辑。

安装

您可以通过 composer 安装此包

composer require chargefield/laravel-savable

使用

Savable 特性

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Chargefield\Savable\Traits\IsSavable;

class Post extends Model
{
    use IsSavable;
}

示例

控制器中存储记录的简单示例

namespace App\Http\Controllers;

use App\Models\Post;
use Chargefield\Savable\Fields\SlugField;
use Chargefield\Savable\Fields\StringField;
use Illuminate\Http\Request;

class PostController
{
    public function store(Request $request)
    {
        $post = Post::make()->savable($request->all())->columns([
            StringField::make('title'),
            SlugField::make('slug')->fromField('title'),
            StringField::make('body'),
        ])->save();
    }
}

Savable 列

设置列

$post = Post::make()->savable([...])->columns([
    StringField::make('title'),
    SlugField::make('slug')->fromField('title'),
    StringField::make('body'),
])->save();

或者,您可以在模型中设置可保存的列

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Chargefield\Savable\Fields\Field;
use Chargefield\Savable\Traits\IsSavable;
use Chargefield\Savable\Fields\JsonField;
use Chargefield\Savable\Fields\SlugField;
use Chargefield\Savable\Fields\FileField;
use Chargefield\Savable\Fields\StringField;
use Chargefield\Savable\Fields\BooleanField;
use Chargefield\Savable\Fields\IntegerField;
use Chargefield\Savable\Fields\DatetimeField;

class Post extends Model
{
    use IsSavable;

    /**
     * @return Field[]
     */
    public function savableColumns(): array
    {
        return [
            StringField::make('title')->rules('required|string'),
            SlugField::make('slug')->fromField('title'),
            StringField::make('body')->rules('required|string'),
            FileField::make('image')->nullable()->rules('nullable|image'),
            BooleanField::make('is_featured')->rules('required|boolean'),
            IntegerField::make('order')->strict()->rules('required|integer|min:1'),
            JsonField::make('options')->nullable(),
            DatetimeField::make('published_at')->nullable(),
        ];
    }
}

注意: savableColumns() 将会被 columns([...]) 覆盖

Savable 数据

设置数据

$post = Post::make()->savable(request()->all())->columns([...])->save();

$post = Post::make()->savable()->data(request()->all())->columns([...])->save();

从请求中设置数据

$post = Post::make()->savable()->fromRequest()->columns([...])->save();

从给定的请求中设置数据

$post = Post::make()->savable()->fromRequest(request())->columns([...])->save();

验证

在保存前验证 (抛出 Illuminate\Validation\ValidationException):

$post = Post::make()->savable()->data([...])->columns([...])->validate()->save();

不抛出异常的验证

Post::make()->savable()->data([...])->columns([...])->hasErrors();
// return bool

Post::make()->savable()->data([...])->columns([...])->getErrors();
// return Illuminate\Support\MessageBag

注意: 字段 必须设置 rules([...]) 以便验证其数据。

字段

字符串字段

StringField::make('title');

别名字段

SlugField::make('slug')->fromField('title')->separateBy('-');

文件字段

FileField::make('image')->disk('local')->path('images')->withOriginalName();

布尔字段

BooleanField::make('is_featured');

整数字段

IntegerField::make('age')->strict();

JSON 字段

JsonField::make('options')->pretty()->depth(512);

日期时间字段

DatetimeField::make('published_at');

其他方法

设置列名和默认值

StringField::make('title', 'Default Title');

StringField::make('title')->value('Default Title');

如果与列名不同,则设置字段名

StringField::make('title')->fieldName('name');

设置可空标志,如果值为空/空/异常,则返回 null

StringField::make('title')->nullable();

设置字段的验证规则(Laravel 验证规则

StringField::make('user_id')->rules('required|exists:users,id');

StringField::make('user_id')->rules([
    'required',
    Rule::exists('users', 'id'),
]);

设置一个闭包以转换值

StringField::make('title')->transform(function ($fieldName, $fieldValue, $fieldsData) {
    return Str::title($fieldValue);
});

自定义字段

您可以使用 artisan 命令轻松创建自定义字段。

php artisan make:field CustomField

输出

namespace App\Fields;

use Chargefield\Savable\Fields\Field; 

class CustomField extends Field
{
    /**
     * @param array $data
     * @return mixed
     */
    public function handle(array $data = [])
    {
        if (empty($this->value) && $this->nullable) {
            return null;
        }
        
        // Logic goes here

        return $this->value;
    }
}

测试自定义字段

Field::assertHandle

$field = CustomField::fake('title');
$field->value('Example Title');
$field->assertHandle('Example Title'); // passed
$field->assertHandle('Not The Same'); // failed

Field::assertTransform

$field = CustomField::fake('title');
$field->value('Example Title');
$field->transform(function ($name, $value, $data) {
    return "{$data['prefix']} {$value}";
});
$field->assertTransform('Prefixed Example Title', ['prefix' => 'Prefixed']); // passed
$field->assertTransform('Example Title', ['prefix' => 'Prefixed']); // failed

Field::assertValidation

$field = CustomField::fake('title');
$field->rules('required|string');
$field->assertValidation('Example Text'); // passed
$field->assertValidation(''); // failed

测试

您可以使用以下命令运行测试:

vendor/bin/phpunit

更新日志

请参阅 CHANGELOG 了解最近的变化。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 support@chargefield.com 而不是使用问题跟踪器。

鸣谢

许可

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