akbarali/action-data

动作数据验证 PHP Laravel

1.4.0 2024-08-30 12:45 UTC

This package is auto-updated.

Last update: 2024-09-30 13:03:06 UTC


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 版本

添加了 setUserisCreategetUserupdatedcreatedfromRequestfromArray 方法

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 版本

添加了 fromJsoncreateFromArray 的错误修复