Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
58.33% covered (warning)
58.33%
7 / 12
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ApieConfigFileLocator
58.33% covered (warning)
58.33%
7 / 12
66.67% covered (warning)
66.67%
2 / 3
10.54
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 locate
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 getAllPaths
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2namespace Apie\Common\DependencyInjection;
3
4use Apie\AiInstructor\AiInstructor;
5use Apie\ApieCommonPlugin\ApieCommonPlugin;
6use Apie\ApieFileSystem\ApieFilesystemFactory;
7use Apie\Cms\RouteDefinitions\AbstractCmsRouteDefinition;
8use Apie\CmsApiDropdownOption\Lists\DropdownOptionList;
9use Apie\Common\ApieFacade;
10use Apie\Common\BasicAuth\AddBasicAuthContextBuilder;
11use Apie\Console\ConsoleCommandFactory;
12use Apie\Core\Context\ApieContext;
13use Apie\DoctrineEntityConverter\Factories\PersistenceLayerFactory;
14use Apie\DoctrineEntityDatalayer\DoctrineEntityDatalayer;
15use Apie\Export\ExportInterface;
16use Apie\Faker\ApieObjectFaker;
17use Apie\FtpServer\FtpServerCommand;
18use Apie\Graphql\Factories\GraphqlSchemaFactory;
19use Apie\HtmlBuilders\FormBuildContext;
20use Apie\Maker\Utils;
21use Apie\McpServer\RunMcpServerCommand;
22use Apie\RestApi\OpenApi\OpenApiGenerator;
23use Apie\SchemaGenerator\ComponentsBuilderFactory;
24use Apie\Serializer\Serializer;
25use Apie\TwigTemplateLayoutRenderer\TwigRenderer;
26use Apie\TypescriptClientBuilder\RouteDefinitions\CodeRouteDefinitionProvider;
27use Apie\Webdav\Controller\WebdavController;
28use ReflectionClass;
29use ReflectionException;
30use Symfony\Component\Config\FileLocator;
31
32class ApieConfigFileLocator extends FileLocator
33{
34    /**
35     * @var array<string, array{class-string<object>, string, class-string<object>}>
36     */
37    private array $predefined = [
38        'add_basic_auth.yaml' => [AddBasicAuthContextBuilder::class, '../..', 'Apie\\Common\\AddBasicAuthServiceProvider'],
39        'ai_instructor.yaml' => [AiInstructor::class, '..', 'Apie\\AiInstructor\\AiInstructorServiceProvider'],
40        'apie_common_plugin.yaml' => [ApieCommonPlugin::class, '..', 'Apie\\ApieCommonPlugin\\GeneratedApieCommonPluginServiceProvider'],
41        'apie_file_system.yaml' => [ApieFilesystemFactory::class, '..', 'Apie\\ApieFileSystem\\ApieFileSystemServiceProvider'],
42        'cms.yaml' => [AbstractCmsRouteDefinition::class, '../..', 'Apie\\Cms\\CmsServiceProvider'],
43        'cms_dropdown.yaml' => [DropdownOptionList::class, '../..', 'Apie\\CmsApiDropdownOption\\CmsDropdownServiceProvider'],
44        'common.yaml' => [ApieFacade::class, '..', 'Apie\\Common\\CommonServiceProvider'],
45        'console.yaml' => [ConsoleCommandFactory::class, '..', 'Apie\\Console\\ConsoleServiceProvider'],
46        'core.yaml' => [ApieContext::class, '../..', 'Apie\\Core\\CoreServiceProvider'],
47        'doctrine_entity_converter.yaml' => [PersistenceLayerFactory::class, '../..', 'Apie\\DoctrineEntityConverter\\DoctrineEntityConverterProvider'],
48        'doctrine_entity_datalayer.yaml' => [DoctrineEntityDatalayer::class, '..', 'Apie\\DoctrineEntityDatalayer\\DoctrineEntityDatalayerServiceProvider'],
49        'export.yaml' => [ExportInterface::class, '..', 'Apie\\Export\\ExportServiceProvider'],
50        'faker.yaml' => [ApieObjectFaker::class, '..', 'Apie\\Faker\\FakerServiceProvider'],
51        'ftp.yaml' => [FtpServerCommand::class, '..', 'Apie\\FtpServer\\FtpServerServiceProvider'],
52        'html_builders.yaml' => [FormBuildContext::class, '..', 'Apie\\HtmlBuilders\\HtmlBuilderServiceProvider'],
53        'graphql.yaml' => [GraphqlSchemaFactory::class, '../..', 'Apie\\Graphql\\GraphqlServiceProvider'],
54        'maker.yaml' => [Utils::class, '..', 'Apie\\Maker\\MakerServiceProvider'],
55        'mcp_server.yaml' => [RunMcpServerCommand::class, '..', 'Apie\\McpServer\\McpServerServiceProvider'],
56        'rest_api.yaml' => [OpenApiGenerator::class, '../..', 'Apie\\RestApi\\RestApiServiceProvider'],
57        'serializer.yaml' => [Serializer::class, '..', 'Apie\\Serializer\\SerializerServiceProvider'],
58        'schema_generator.yaml' => [ComponentsBuilderFactory::class, '..', 'Apie\\SchemaGenerator\\SchemaGeneratorServiceProvider'],
59        'twig_template_layout_renderer.yaml' => [TwigRenderer::class, '..', 'Apie\\TwigTemplateLayoutRenderer\\TwigTemplateLayoutRendererServiceProvider'],
60        'typescript_client_builder.yaml' => [CodeRouteDefinitionProvider::class, '../..', 'Apie\\TypescriptClientBuilder\\TypescriptClientBuilderServiceProvider'],
61        'webdav.yaml' => [WebdavController::class, '../..', 'Apie\\Webdav\\WebdavServiceProvider'],
62    ];
63
64    public function __construct(string|array $paths = [])
65    {
66        $paths = (array) $paths;
67        parent::__construct($paths);
68    }
69
70    /**
71     * @return string|string[]
72     */
73    public function locate(string $name, ?string $currentPath = null, bool $first = true): array|string
74    {
75        if ($currentPath !== null || !isset($this->predefined[$name])) {
76            return parent::locate($name, $currentPath, $first);
77        }
78        $config = $this->predefined[$name];
79        $refl = new ReflectionClass($config[0]);
80        return dirname(realpath($refl->getFileName())) . DIRECTORY_SEPARATOR . $config[1] . DIRECTORY_SEPARATOR . $name;
81    }
82
83    /**
84     * @return array<int, array{string, class-string<object>}>
85     */
86    public function getAllPaths(): array
87    {
88        $result = [];
89        foreach (array_keys($this->predefined) as $name) {
90            try {
91                $result[] = [(string) $this->locate($name), $this->predefined[$name][2]];
92            } catch (ReflectionException) {
93            }
94        }
95        return $result;
96    }
97}