Skip to main content

Controllers

Controllers are the entry point for your application logic. They handle incoming HTTP requests, validate data, delegate business logic to services or actions, and return formatted responses. In the Droip Ecommerce system, controllers are plain PHP classes that leverage dependency injection and adhere to a standard structure for consistency.

Standard Controller Structure​

While controllers are plain classes, they typically follow a RESTful resource pattern. Below are the standard methods you should implement for a resource controller.

Constructor & Dependency Injection​

Initialize the controller with necessary dependencies.

Description:

The __construct() method is used to inject dependencies such as Services and Repositories. The Service Container automatically resolves these dependencies when the controller is instantiated. This promotes loose coupling and makes testing easier.

Method Signature:

public function __construct(Service $service, Repository $repository)

Parameters:

  • $service - The service class responsible for business logic.
  • $repository - The repository class responsible for data access.

Examples:

namespace Ecommerce\App\Controllers\API;

use Ecommerce\App\Services\ProductService;
use Ecommerce\App\Repositories\ProductRepository;

class ProductController
{
protected $service;
protected $repository;

public function __construct(ProductService $service, ProductRepository $repository)
{
$this->service = $service;
$this->repository = $repository;
}
}
// In OrderController
public function __construct(OrderService $service)
{
$this->service = $service;
}

List Resources​

Retrieve a paginated list of resources.

Description:

The get() method handles requests to list resources. It typically accepts filter parameters via the request, delegates fetching to a service, and returns a paginated response using a Resource collection.

Method Signature:

public function get(Request $request): JsonResponse

Parameters:

  • $request - The Ecommerce\Contracts\Request instance containing query parameters.

Examples:

use Ecommerce\Contracts\Request;
use Ecommerce\DTO\ListFilterDTO;
use Ecommerce\App\Resources\Product\ProductListResource;
use Ecommerce\Core\Database\Query\Paginator;
use Ecommerce\Constants\Pagination;

public function get(Request $request)
{
// Convert request params to DTO
$params = ListFilterDTO::from_array($request->all());

if ((int) $params->limit === Pagination::ALL) {
$data = $this->service->all($params);
$paginator = new Paginator($data, $data->count(), $data->count(), 1);

return droip_response()->json([
'data' => ProductListResource::paginated($paginator),
'message' => __('Products retrieved successfully.', 'droip'),
]);
}

$data = $this->service->paginated($params);

return droip_response()->json([
'data' => ProductListResource::paginated($data),
'message' => __('Product retrieved successfully.', 'droip'),
]);
}

Create Resource​

Create a new resource.

Description:

The create() or store() method handles the creation of a new resource. It uses a specific Request class (form request) to validate incoming data and an Action class to perform the creation logic.

Method Signature:

public function create(FormRequest $request, Action $action): JsonResponse

Parameters:

  • $request - A custom Request class that extends Ecommerce\Contracts\Request and handles validation.
  • $action - An Action class that encapsulates the creation logic.

Examples:

use Ecommerce\App\Requests\Product\ProductCreateRequest;
use Ecommerce\App\Actions\Product\CreateProductAction;
use Ecommerce\DTO\Product\CreateProductDTO;
use Ecommerce\App\Resources\Product\ProductResource;
use Ecommerce\Http\Response;

public function create(ProductCreateRequest $request, CreateProductAction $action)
{
// Clean and validated data
$data = $request->clean();

// Execute the action with DTO
$product = $action->execute(CreateProductDTO::from_array($data));

return droip_response()->json([
'data' => ProductResource::make($product),
'message' => __('Product created successfully.', 'droip'),
], Response::CREATED);
}
// Order creation example
public function store(OrderCreateRequest $request, CreateOrderAction $action)
{
$dto = CreateOrderPayloadDTO::from_request($request);
$order = $action->execute($dto);

return droip_response()->json([
'data' => OrderResource::make($order),
'message' => __('Order created successfully.', 'droip'),
], 201);
}

Show Resource​

Retrieve a single resource by its ID.

Description:

The show() method retrieves a specific resource details. It gets the ID from the request, fetches the model via the service, and returns it using a Resource class transformation.

Method Signature:

public function show(Request $request): JsonResponse

Parameters:

  • $request - The Ecommerce\Contracts\Request instance containing the resource ID.

Examples:

use Ecommerce\Contracts\Request;
use Ecommerce\App\Resources\Product\ProductResource;

public function show(Request $request)
{
$id = $request->get_int('id');
$product = $this->service->find($id);

return droip_response()->json([
'data' => ProductResource::make($product),
'message' => __('Product retrieved successfully.', 'droip'),
]);
}
// Order show example
public function show(Request $request)
{
$order = $this->service->find_order_or_fail($request->get_int('id'));

return droip_response()->json([
'data' => OrderResource::make($order),
'message' => __('Order retrieved successfully.', 'droip'),
]);
}

Update Resource​

Update an existing resource.

Description:

The update() method handles modifying an existing resource. Similar to create, it uses a custom Request class for validation and an Action class for the update logic.

Method Signature:

public function update(FormRequest $request, Action $action): JsonResponse

Parameters:

  • $request - A custom Request class for validation.
  • $action - An Action class for the update logic.

Examples:

use Ecommerce\App\Requests\Product\ProductUpdateRequest;
use Ecommerce\App\Actions\Product\UpdateProductAction;
use Ecommerce\DTO\Product\UpdateProductDTO;

public function update(ProductUpdateRequest $request, UpdateProductAction $action)
{
$data = $request->clean();
$product = $action->execute(UpdateProductDTO::from_array($data));

return droip_response()->json([
'data' => ProductResource::make($product),
'message' => __('Product Updated successfully.', 'droip'),
]);
}

Delete Resource​

Delete a resource.

Description:

The delete() method handles removing a resource. It typically receives the ID from the request and delegates the deletion to the service.

Method Signature:

public function delete(Request $request): JsonResponse

Parameters:

  • $request - The Ecommerce\Contracts\Request instance containing the resource ID.

Examples:

public function delete(Request $request)
{
$result = $this->service->delete($request->get_int('id'));

return droip_response()->json([
'data' => $result,
'message' => __('Product deleted successfully.', 'droip'),
]);
}

Bulk Actions​

Perform actions on multiple resources at once.

Description:

The bulk_actions() method handles operations like mass deletion or status updates. It expects an action type and a list of IDs in the request body.

Method Signature:

public function bulk_actions(BulkActionRequest $request): JsonResponse

Parameters:

  • $request - The Ecommerce\App\Requests\BulkActionRequest instance.

Examples:

use Ecommerce\App\Requests\BulkActionRequest;
use Ecommerce\Constants\BulkActions;
use Ecommerce\Http\Response;

public function bulk_actions(BulkActionRequest $request)
{
$data = $request->clean();
$action = $data['action'];
$ids = $data['ids'] ?? [];

switch ($action) {
case BulkActions::DELETE:
$result = $this->service->bulk_delete($ids);
return droip_response()->json([
'data' => $result,
'message' => __('Products deleted successfully.', 'droip'),
]);

case BulkActions::DELETE_ALL:
$result = $this->service->delete_all();
return droip_response()->json([
'data' => $result,
'message' => __('All products deleted successfully.', 'droip'),
]);

default:
return droip_response()->json([
'errors' => [],
'message' => __('No action performed.', 'droip'),
], Response::BAD_REQUEST);
}
}