Entity Services are where the core business logic of your application resides. When a controller receives a request, it delegates the complex operations, data manipulation, and business rule enforcement to a service method. This design pattern ensures that your business logic is centralized, reusable, and easier to test and maintain.
When you create a new entity, AtroCore resolve a default service, an instance of \Atro\Core\Templates\Services\{type}, where {type} can be Base, Hierarchy, ReferenceData, or Relation. This default service provides out-of-the-box functionality for common actions such as create, read, edit, delete, and MassUpdate.
Custom Entity Services
To add custom business logic, you must create a new service class. This involves creating a new PHP file following the standard conventions.
- Service Path:
Services/{ServiceName}.php - Service Namespace:
\ModuleName\Services\{ServiceName}
Example: Manufacturer Statistics Service
The following example demonstrates a custom service for the Manufacturer entity. The getStatics() method contains the business logic to query the database and retrieve statistics on active manufacturers and those without products.
<?php
namespace ExampleModule\Services;
use Atro\Core\Exceptions\BadRequest;
use Atro\Core\Templates\Service\Base;
class Manufacturer extends Base
{
public function getStatics(): array
{
// Use the query builder for efficiency
$repository = $this->getRepository();
// Query to count active manufacturers
$activeManufacturers = $this->getRepository()->where(['isActive' => true])->count();
// Query to count manufacturers without any linked products
$where = [
[
"type" => "isEmpty",
"attribute" => "products"
]
];
$selectParams = $this->getSelectManager()->getSelectParams(['where' => $where], true, true);
$manufacturerWithoutProducts = $repository->count($selectParams);
return [
"actives" => $activeManufacturers,
"withoutProducts" => $manufacturerWithoutProducts
];
}
}
To learn more about making complex query, check the section Select Manager
Replace Services
To replace existing service, you have to create (or change) app/Resources/metadata/app/services.json file in your custom module.
Example:
{
"Product": "\\CustomModule\\Services\\Product"
}