Skip to main content
Version: 11.x

Actions

Definition & Principles#

Read Porto SAP Documentation (#Actions).

Rules#

  • All Actions MUST extend App\Ship\Parents\Actions\Action.

Folder Structure#

 - app    - Containers        - {section-name}            - {container-name}                - Actions                    - CreateUserAction.php                    - DeleteUserAction.php                    - ...

Code Sample#

Action#

class CreateAdminAction extends Action{    public function run(string $email, string $password, string $name, bool $isClient = false): User    {        $admin = app(CreateUserByCredentialsTask::class)->run(            $isClient,            $email,            $password,            $name        );
        app(AssignUserToRoleTask::class)->run($admin, ['admin']);
        return $admin;    }}

Calling multiple Tasks#

class DemoAction extends Action{    public function run($xxx, $yyy, $zzz)    {        $foo = app(Sample111Task::class)->run($xxx, $yyy);        $bar = app(Sample222Task::class)->run($zzz);    }}

Usage from a Controller#

    public function deleteUser(DeleteUserRequest $request)    {        $user = app(DeleteUserAction::class)->run($request);        return $this->deleted($user);    }
tip

The same Action MAY be called by multiple Controllers (Web, Api, Cli).

Transactional Run#

Sometimes, you want to wrap a call into one Database Transaction (see Laravel Documentation).

Consider the following example: You want to create a new Team and automatically assign yourself (i.e., your own User) to this newly created Team. Your CreateTeamAction may call a dedicated CreateTeamTask and a AssignMemberToTeamTask afterwards.

However, if the AssignMemberToTeamTask fails, for unknown reasons, you may want to "rollback" (i.e., remove) the newly created Team from the database in order to keep the database in a valid state.

That's where DB::transactions comes into play!

Apiato provides a transactionalRun(...$arguments) method which internally just wraps the run() method of the action in a DB::Transaction and passes all the parameters as is to it.

If any Exception occurs during the execution of the run(), everything done in this context is automatically rolled-back from the database. However, respective operations on the file system (e.g., you may also have uploaded a profile picture for this Team already) need to be performed manually!

Typically, you may want to use the transactionalRun() on the Controller level!