Menu

Architecture: User Create = Multiple Actions

Architecture: User Create = Multiple Actions

Architecture: User Create = Multiple Actions

1. Validate Data

2. Create User Record

3. Assign Role

4. Send Welcome Email

5. Log Activity


Folder Structure


app/

 └── Actions/

     └── Users/

         ├── CreateUserAction.php

         ├── AssignUserRoleAction.php

         ├── SendWelcomeEmailAction.php

         └── LogUserActivityAction.php

 └── Flows/

     └── Users/

         └── CreateUserFlow.php   👈 Orchestrator yahan hota hai





Multiple Actions


app/Actions/Users/CreateUserAction.php

<?php

namespace App\Actions\Users;

use App\Models\User;

use Illuminate\Support\Facades\Hash;

class CreateUserAction

{

    public function execute(array $data): User

    {

        return User::create([

            'name'     => $data['name'],

            'email'    => $data['email'],

            'password' => Hash::make($data['password']),

        ]);

    }

}





app/Actions/Users/AssignUserRoleAction.php

<?php

namespace App\Actions\Users;

class AssignUserRoleAction

{

    public function execute($user, string $role): void

    {

        $user->assignRole($role); // Spatie Role Package

    }

}





app/Actions/Users/SendWelcomeEmailAction.php

<?php

namespace App\Actions\Users;

use App\Mail\WelcomeMail;

use Illuminate\Support\Facades\Mail;

class SendWelcomeEmailAction

{

    public function execute($user): void

    {

        Mail::to($user->email)->queue(new WelcomeMail($user));

    }

}





app/Actions/Users/LogUserActivityAction.php

<?php

namespace App\Actions\Users;

use Illuminate\Support\Facades\Log;

class LogUserActivityAction

{

    public function execute($user): void

    {

        Log::info('New user created', [

            'user_id' => $user->id,

            'email'   => $user->email,

        ]);

    }

}





Flows

app/Flows/Users/CreateUserFlow.php

<?php

namespace App\Flows\Users;

use App\Actions\Users\CreateUserAction;

use App\Actions\Users\AssignUserRoleAction;

use App\Actions\Users\SendWelcomeEmailAction;

use App\Actions\Users\LogUserActivityAction;

use Illuminate\Support\Facades\DB;

class CreateUserFlow

{

    public function __construct(

        protected CreateUserAction $createUser,

        protected AssignUserRoleAction $assignRole,

        protected SendWelcomeEmailAction $sendEmail,

        protected LogUserActivityAction $logActivity

    ) {}


    public function execute(array $data)

    {

        return DB::transaction(function () use ($data) {


            $user = $this->createUser->execute($data);


            $this->assignRole->execute($user, 'customer');

            $this->sendEmail->execute($user);

            $this->logActivity->execute($user);

            return $user;

        });

    }

}






Controller (Use It Like This)

use App\Flows\Users\CreateUserFlow;

use Illuminate\Http\Request;

class UserController extends Controller

{

    public function store(Request $request, CreateUserFlow $flow)

    {

        $data = $request->validate([

            'name'     => 'required|string|max:255',

            'email'    => 'required|email|unique:users,email',

            'password' => 'required|min:8',

        ]);

        $user = $flow->execute($data);

        return response()->json($user);

    }

}




Flow-chart laravel

Contact