chargefield / laravel-savable
Savable 是一个 Laravel 扩展包,可以帮助您组织业务逻辑。
v1.0.0
2021-09-05 16:36 UTC
Requires
- php: ^7.4|^8.0
- illuminate/support: ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.1
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
README
Laravel Savable
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)。有关更多信息,请参阅 许可文件。