1+ <?php
2+
3+ namespace Prokl \WpSymfonyRouterBundle \Services \Agnostic ;
4+
5+ use Symfony \Component \Config \FileLocator ;
6+ use Symfony \Component \Config \Loader \DelegatingLoader ;
7+ use Symfony \Component \Config \Loader \LoaderResolver ;
8+ use Symfony \Component \Config \Resource \SelfCheckingResourceChecker ;
9+ use Symfony \Component \Config \ResourceCheckerConfigCacheFactory ;
10+ use Symfony \Component \HttpFoundation \Request ;
11+ use Symfony \Component \Routing \Loader \PhpFileLoader ;
12+ use Symfony \Component \Routing \Loader \XmlFileLoader ;
13+ use Symfony \Component \Routing \Loader \YamlFileLoader ;
14+ use Symfony \Component \Routing \RequestContext ;
15+ use Symfony \Component \Routing \RouteCollection ;
16+ use Symfony \Component \Routing \Router ;
17+ use Symfony \Component \Routing \RouterInterface ;
18+
19+ /**
20+ * Class RoutesLoader
21+ * Независимый от контейнера загрузчик роутов.
22+ * @package Prokl\WpSymfonyRouterBundle\Services\Agnostic
23+ *
24+ * @since 24.07.2021
25+ */
26+ class RoutesLoader
27+ {
28+ /**
29+ * @var RouterInterface $router Роутер.
30+ */
31+ private $ router ;
32+
33+ /**
34+ * AgnosticRouteLoader constructor.
35+ *
36+ * @param string $configFile Yaml/php/xml файл с конфигурацией роутов.
37+ * @param string|null $cacheDir Путь к кэшу. Null -> не кэшировать.
38+ * @param boolean $debug Режим отладки.
39+ */
40+ public function __construct (
41+ string $ configFile ,
42+ ?string $ cacheDir = null ,
43+ bool $ debug = true
44+ ) {
45+ $ resolver = new LoaderResolver (
46+ [
47+ new YamlFileLoader (new FileLocator ()),
48+ new PhpFileLoader (new FileLocator ()),
49+ new XmlFileLoader (new FileLocator ()),
50+ ]
51+ );
52+
53+ $ delegatingLoader = new DelegatingLoader ($ resolver );
54+
55+ $ requestContext = new RequestContext ();
56+ $ request = Request::createFromGlobals ();
57+
58+ $ checker = new SelfCheckingResourceChecker ();
59+ $ cacheFactory = new ResourceCheckerConfigCacheFactory ([$ checker ]);
60+
61+ $ this ->router = new Router (
62+ $ delegatingLoader ,
63+ $ configFile ,
64+ [
65+ 'cache_dir ' => $ cacheDir ,
66+ 'debug ' => $ debug ,
67+ 'generator_class ' => 'Symfony\Component\Routing\Generator\CompiledUrlGenerator ' ,
68+ 'generator_dumper_class ' => 'Symfony\Component\Routing\Generator\Dumper\CompiledUrlGeneratorDumper ' ,
69+ 'matcher_class ' => 'Symfony\Bundle\FrameworkBundle\Routing\RedirectableCompiledUrlMatcher ' ,
70+ 'matcher_dumper_class ' => 'Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper '
71+ ],
72+ $ requestContext ->fromRequest ($ request )
73+ );
74+
75+ if ($ cacheDir ) {
76+ $ this ->router ->setConfigCacheFactory ($ cacheFactory );
77+ }
78+ }
79+
80+ /**
81+ * Роуты.
82+ *
83+ * @return RouteCollection
84+ */
85+ public function getRoutes () : RouteCollection
86+ {
87+ return $ this ->router ->getRouteCollection ();
88+ }
89+ }
0 commit comments