. */ namespace SP\Core\Definitions; use SP\Core\Bootstrap\Path; use SP\Core\Bootstrap\PathsContext; use SP\Domain\Common\Ports\Repository; use SP\Domain\Common\Providers\Image; use SP\Domain\Image\Ports\ImageService; use SP\Infrastructure\Common\Repositories\SimpleRepository; use SP\Infrastructure\File\FileSystem; use function DI\autowire; use function DI\factory; /** * Class DomainDefinitions */ final class DomainDefinitions { private const DOMAINS = [ 'Account', 'Api', 'Auth', 'Category', 'Client', 'Config', 'Crypt', 'CustomField', 'Export', 'Import', 'Install', 'ItemPreset', 'Notification', 'Plugins', 'Security', 'Tag', 'User', ]; private const PORTS = [ 'Service' => 'SP\Domain\%s\Services\*', 'Repository' => 'SP\Infrastructure\%s\Repositories\*', 'Adapter' => 'SP\Domain\%s\Adapters\*', 'Builder' => 'SP\Domain\%s\Services\Builders\*' ]; public static function getDefinitions(): array { $sources = [ ImageService::class => autowire(Image::class) ->constructorParameter( 'font', factory( static fn(PathsContext $p) => FileSystem::buildPath( $p[Path::PUBLIC], 'vendor', 'fonts', 'NotoSans-Regular-webfont.ttf' ) ) ) ->constructorParameter( 'tempPath', factory(static fn(PathsContext $p) => $p[Path::TMP]) ), Repository::class => autowire(SimpleRepository::class) ]; foreach (self::DOMAINS as $domain) { foreach (self::PORTS as $suffix => $target) { $key = sprintf('SP\Domain\%s\Ports\*%s', $domain, $suffix); if (!array_key_exists($key, $sources)) { $sources[$key] = autowire(sprintf($target, $domain)); } } } return [ ...$sources ]; } }