1. Go to this page and download the library: Download lumosolutions/actionable library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
lumosolutions / actionable example snippets
// ❌ The old way - Fat controllers, messy code
class UserController extends Controller
{
public function register(Request $request)
{
// Validation logic...
// User creation logic...
// Email sending logic...
// Queue processing...
// 200 lines later...
}
}
// ✅ The Actionable way - Clean, focused, reusable
RegisterUser::run($userData);
class SendWelcomeEmail
{
use IsRunnable;
public function handle(string $email, string $name): void
{
Mail::to($email)->send(new WelcomeEmail($name));
}
}
class CalculateOrderTotal
{
use IsRunnable;
public function handle(Order $order): float
{
return $order->items->sum(fn($item) => $item->price * $item->quantity);
}
}
// Usage
$total = CalculateOrderTotal::run($order);
class ProcessVideoUpload
{
use IsRunnable, IsDispatchable;
public function handle(Video $video): void
{
// Heavy processing logic here
}
}
// Run synchronously
ProcessVideoUpload::run($video);
// Or dispatch to queue
ProcessVideoUpload::dispatch($video);
// Use a specific queue
ProcessVideoUpload::dispatchOn('video-processing', $video);
class ProductData
{
use ArrayConvertible;
public function __construct(
public string $name,
public float $price,
public int $stock
) {}
}
// From request data
$product = ProductData::fromArray($request->validated());
// To API response
return response()->json($product->toArray());
class UserResponse
{
use ArrayConvertible;
public function __construct(
#[FieldName('user_id')]
public int $userId,
#[FieldName('full_name')]
public string $fullName
) {}
}
class EventData
{
use ArrayConvertible;
public function __construct(
#[DateFormat('Y-m-d')]
public DateTime $date,
#[DateFormat('H:i')]
public DateTime $startTime
) {}
}
class ShoppingCart
{
use ArrayConvertible;
public function __construct(
#[ArrayOf(CartItem::class)]
public array $items
) {}
}
class UserAccount
{
use ArrayConvertible;
public function __construct(
public string $email,
#[Ignore]
public string $password,
#[Ignore]
public string $apiSecret
) {}
}
// The DTO
class OrderData
{
use ArrayConvertible;
public function __construct(
#[FieldName('customer_email')]
public string $customerEmail,
#[ArrayOf(OrderItemData::class)]
public array $items,
#[FieldName('discount_code')]
public ?string $discountCode = null
) {}
}
// The Action
class ProcessOrder
{
use IsRunnable, IsDispatchable;
public function handle(OrderData $orderData): Order
{
$order = DB::transaction(function () use ($orderData) {
$order = Order::create([...]);
// Process items
foreach ($orderData->items as $item) {
$order->items()->create([...]);
}
// Apply discount
if ($orderData->discountCode) {
ApplyDiscount::run($order, $orderData->discountCode);
}
return $order;
});
// Queue follow-up actions
SendOrderConfirmation::dispatch($order);
UpdateInventory::dispatch($order);
return $order;
}
}
// Usage - It's this simple!
$orderData = OrderData::fromArray($request->validated());
$order = ProcessOrder::run($orderData);
class RegisterUser
{
use IsRunnable;
public function handle(RegistrationData $data): User
{
$user = CreateUser::run($data);
SendWelcomeEmail::dispatch($user);
NotifyAdmins::dispatch($user);
TrackRegistration::dispatch($user, $data->referralSource);
return $user;
}
}