GitHub Repository

apiato

Definition & Principles

Read from the Porto SAP Documentation (#Tasks).

Rules

Folder Structure

 - app
    - Containers
        - {container-name}
            - Tasks
                - ConfirmUserEmailTask.php
                - GenerateEmailConfirmationUrlTask.php
                - SendConfirmationEmailTask.php
                - ValidateConfirmationCodeTask.php
                - SetUserEmailTask.php
                - ...

Code Sample

Find User Task by ID:

<?php

namespace App\Containers\User\Tasks;

use App\Containers\User\Contracts\UserRepositoryInterface;
use App\Ship\Parents\Tasks\Task;
use Exception;

class FindUserByIdTask extends Task
{
    private $userRepository;

    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function run($id)
    {
        try {
            $user = $this->userRepository->find($id);
        } catch (Exception $e) {
            throw new UserNotFoundException();
        }

        return $user;
    }

}

Tasks usage from an Action:

<?php

namespace App\Containers\Email\Actions;

use App\Containers\Email\Tasks\ConfirmUserEmailTask;
use App\Containers\Email\Tasks\ValidateConfirmationCodeTask;
use App\Containers\User\Tasks\FindUserByIdTask;
use App\Ship\Parents\Actions\Action;

class ValidateUserEmailByConfirmationCodeAction extends Action
{
    private $validateConfirmationCodeTask;

    private $findUserByIdTask;

    private $confirmUserEmailTask;

    public function __construct(
        ValidateConfirmationCodeTask $validateConfirmationCodeTask,
        FindUserByIdTask $findUserByIdTask,
        ConfirmUserEmailTask $confirmUserEmailTask
    ) {
        $this->validateConfirmationCodeTask = $validateConfirmationCodeTask;
        $this->findUserByIdTask = $findUserByIdTask;
        $this->confirmUserEmailTask = $confirmUserEmailTask;
    }

    public function run($userId, $code)
    {
        $this->validateConfirmationCodeTask->run($userId, $code);
        $user = $this->findUserByIdTask->run($userId);
        $this->confirmUserEmailTask->run($user);
        ...
    }
}