재사용 가능한 액션 클래스
app/Actions
디렉토리를 볼 수 있습니다. 이 게시물은 간단하고 재사용 가능한 액션 클래스를 작성하기 위한 것입니다.우리의 행동이 무엇을 해야 하는지 개요를 작성해 봅시다:
위의 4가지 규칙:
<?php
namespace App\Actions;
use App\Contracts\Execute;
use App\Exceptions\ActionException;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
abstract class AbstractAction implements Execute
{
protected array $constrainedBy = [];
protected Model $record;
abstract public function rules(): array;
public function __construct(protected array $inputs)
{
}
public function setInputs(array $inputs): self
{
$this->inputs = $inputs;
return $this;
}
public function setConstrainedBy(array $constrainedBy): self
{
$this->constrainedBy = $constrainedBy;
return $this;
}
public function getConstrainedBy(): array
{
return $this->constrainedBy;
}
public function hasConstrained(): bool
{
return count($this->getConstrainedBy()) > 0;
}
public function getInputs(): array
{
return $this->inputs;
}
public function model(): string
{
if (! property_exists($this, 'model')) {
throw ActionException::missingModelProperty(__CLASS__);
}
return $this->model;
}
public function execute()
{
Validator::make(
array_merge(
$this->getConstrainedBy(),
$this->getInputs()
),
$this->rules()
)->validate();
return $this->record = DB::transaction(function () {
return $this->hasConstrained()
? $this->model::updateOrCreate($this->getConstrainedBy(), $this->getInputs())
: $this->model::create($this->getInputs());
});
}
public function getRecord(): Model
{
return $this->record;
}
}
그리고 커스텀 예외:
<?php
namespace App\Exceptions;
use Exception;
class ActionException extends Exception
{
public static function missingModelProperty($class)
{
return new self("Missing model property in class $class");
}
}
그리고 계약:
<?php
namespace App\Contracts;
interface Execute
{
public function execute();
}
이제 사용 방법을 살펴 보겠습니다. 추상 클래스를 확장하는 클래스를 만듭니다.
<?php
namespace App\Actions\User;
use App\Actions\AbstractAction as Action;
use App\Actions\Fortify\PasswordValidationRules;
use App\Models\User;
class UpdateOrCreate extends Action
{
use PasswordValidationRules;
public $model = User::class;
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => $this->passwordRules(),
];
}
}
사용법:
use \App\Actions\User\UpdateOrCreate as UpdateOrCreateUser;
$data = [
'name' => 'Nasrul Hazim',
'email' => '[email protected]',
'password' => 'password',
'password_confirmation' => 'password',
];
(new UpdateOrCreateUser($data))->execute();
또 다른 예:
<?php
namespace App\Actions\Ushot;
use App\Actions\AbstractAction as Action;
use App\Models\Project;
class CreateOrUpdateProject extends Action
{
public $model = Project::class;
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
];
}
}
사용법:
$project = (new Project(['name' => 'dev.to']))->execute();
// do something with $project->getRecord();
다음을 처리할 수 있습니다.
Reference
이 문제에 관하여(재사용 가능한 액션 클래스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nasrulhazim/reusable-action-class-5f93텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)