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);
}
}