akbarali / action-data
动作数据验证 PHP Laravel
1.4.0
2024-08-30 12:45 UTC
Requires
- php: >=8.0
- illuminate/contracts: >=8.10.0
- illuminate/http: >=8.10.0
- illuminate/support: >=7
- illuminate/validation: >=8.10.0
Requires (Dev)
- roave/security-advisories: dev-latest
README
composer require akbarali/action-data
使用说明
Laravel 请求使用
StoreIncomeActionData::createFromRequest($request);
使用数组
StoreIncomeActionData::createFromArray($array);
使用 Json
StoreIncomeActionData::createFromJson($json);
如果您想在函数之间添加新的验证类型
$actionData->addValidationRule('id', 'required|integer'); //To check again $actionData->validateException();
假设您有数组类型的数据。您也可以自己添加值。例如
$userId = Auth::id(); $actionData->set('data', '*.user_id', $userId); $actionData->addValidationRule('data.*.user_id', 'required|integer'); $actionData->validateException();
ActionData 获取数组
$actionData->toArray(); // or $actionData->all(); // or $actionData->toSnakeArray();
如果您只需要该类的一些功能
$actionData->only(['id', 'name']);
如果您想在 Laravel 控制器中直接访问,请将其添加到 /config/app.php
中的 providers
'providers' => [ ... \Akbarali\ActionData\Providers\ActionDataServiceProvider::class, ]
然后您可以在控制器函数中示例使用 ActionData 类
public function store(StoreIncomeActionData $actionData) { //This includes validated information. Otherwise, it returns an ActionDataException. }
0.8 版本
添加 isUpdate()
方法
if($actionData->isUpdate()){ // Update }else{ // Create }
1.0.0 版本
添加了 setUser
、isCreate
、getUser
、updated
、created
、fromRequest
和 fromArray
方法
setUser
方法用于设置
class StorePotentialPartnersActionData extends \Akbarali\ActionData\ActionDataBase { public ?int $id; public ?int $agent_id; public ?string $phone; public ?string $full_name; public ?string $address; public ?string $description; /** @var array<UploadedFile>|null */ public ?array $images = []; public ?array $oldImages = []; protected function prepare(): void { $this->rules = [ 'id' => 'nullable|numeric|exists:potential_partner,id', 'full_name' => 'required', 'address' => 'required', 'description' => 'nullable', "images" => "required_without:oldImages|array", "images.*" => "required|image", "oldImages" => "required_without:images|array", "oldImages.*" => "required|int|exists:potential_partner_images,id", ]; } protected function setUser(): void { $this->user = auth()->user(); } }
updated
方法表示这是一个更新操作。
/** * @param int $id * @param Request $request * @return RedirectResponse * @throws ValidationException */ public function update(int $id, Request $request): RedirectResponse { try { $request->request->set('id', $id); $this->storePotentialPartner(StorePotentialPartnersActionData::fromRequest($request)->updated()); return to_route('page.index')->with('message', trans('all.updated')); } catch (OperationException|ActionDataException|QueryException $e) { return back()->withInput()->withErrors($e->getMessage()); } }
如果您在 fromRequest
之后没有调用 ->updated()
,它将自动通过 id 检查。如果 id 在您的请求中,那么它知道这是一个更新操作
就是这样写的
public function isUpdate(): bool { return $this->updated ?? (isset($this->id) && $this->id > 0); }
created()
是 ->updated()
的对立面
fromRequest
引用 createFromRequest
方法 fromArray
引用 createFromArray
方法
1.0.1 版本
支持只读
class StorePartnersActionData extends \Akbarali\ActionData\ActionDataBase { public readonly int $id; protected function prepare(): void { $this->rules = [ 'id' => 'nullable|numeric|exists:potential_partner,id', ]; } } class PartnerController extends Controller{ public function update(int $id, Request $request): RedirectResponse { try { $request->request->set('id', $id); $this->storePartner(StorePartnersActionData::fromRequest($request)->updated()); return to_route('page.index')->with('message', trans('all.updated')); } catch (OperationException|ActionDataException|QueryException $e) { return back()->withInput()->withErrors($e->getMessage()); } } public function storePartner(StorePotentialPartnersActionData $actionData): RedirectResponse { $actionData->id = 1; // Exception: Error } }
错误:无法修改只读属性 App\ActionData\StorePartnersActionData::$id
1.2.3 版本
$actionData->addValidationRule('pinfl', 'unique:users,pinfl'); $actionData->addValidationRules([ 'pinfl' => 'unique:users,pinfl', 'phone' => 'unique:users,phone', 'passport' => 'unique:users,passport', ]); $actionData->addValidationValue('required', [ 'pinfl', 'passport', 'phone', 'passportIssueDate', 'firstName', 'lastName', 'middleName', 'docType', 'card', ]);
1.4.0 版本
添加了 fromJson
和 createFromArray
的错误修复