1. Go to this page and download the library: Download samushi/domion 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/ */
namespace App\Domain\Orders\Actions;
use Samushi\Domion\Actions\ActionFactory;
use App\Domain\Orders\Dto\CreateOrderDto;
use App\Domain\Orders\Repository\OrderRepository;
class CreateOrderAction extends ActionFactory
{
public function __construct(
protected OrderRepository $orderRepository
) {}
public function handle(CreateOrderDto $dto): Order
{
return $this->orderRepository->create($dto->toArray());
}
}
// Static call (recommended)
$order = CreateOrderAction::run($dto);
// Or with error handling
$result = CreateOrderAction::runSafe($dto);
if ($result['success']) {
// Handle success
}
namespace App\Domain\Orders\Dto;
use App\Support\DataObjects;
class CreateOrderDto extends DataObjects
{
public function __construct(
public readonly int $customerId,
public readonly array $items,
public readonly float $total,
) {}
}
// In Controller
$dto = CreateOrderDto::fromRequest($request);
// The base DataObjects class automatically maps validated() data to constructor properties
namespace App\Domain\Orders\Repository;
use App\Domain\Orders\Models\Order;
use App\Support\Repositories;
use Illuminate\Database\Eloquent\Model;
class OrderRepository extends Repositories
{
protected function getModel(): Model
{
return new Order();
}
// Optional: Define domain-specific filters
protected function getFilters(): array
{
return [
new \App\Domain\Orders\Filters\StatusFilter(),
new \App\Domain\Orders\Filters\CustomerFilter(),
];
}
}
$repository->all(); // Get all records
$repository->paginate(15); // Paginate results
$repository->find($id); // Find by ID
$repository->findOrFail($id); // Find or throw exception
$repository->findBy('email', $email); // Find by column
$repository->findWhere(['status' => 'active']); // Find with conditions
$repository->create($data); // Create record
$repository->update($data, $id); // Update record
$repository->delete($id); // Delete record
$repository->exists($id); // Check existence
$repository->count(); // Count records
namespace App\Domain\Orders\Filters;
use Samushi\QueryFilter\Filter;
class StatusFilter extends Filter
{
public function applyFilter($builder)
{
return $builder->where('status', $this->getValue());
}
}
// Request: GET /orders?status=pending&search=john
$orders = $orderRepository->paginate(15);
// Automatically filtered by status and searched!
namespace App\Domain\Orders\Controllers;
use App\Support\Controllers\ApiControllers as Controller;
class OrderController extends Controller
{
public function index(OrderRepository $repository)
{
return $this->success($repository->paginate());
}
public function store(CreateOrderRequest $request)
{
$dto = CreateOrderDto::fromRequest($request);
$order = CreateOrderAction::run($dto);
return $this->success($order, 'Order created', 201);
}
}
namespace App\Domain\Orders\Controllers;
use App\Support\Controllers\InertiaControllers as Controller;
class OrderController extends Controller
{
public function index(OrderRepository $repository)
{
return $this->render('Orders/Index', [
'orders' => $repository->paginate()
]);
}
}