Skip to content

Commit 31e3f4a

Browse files
committed
AgnosticRouter
1 parent 875b22b commit 31e3f4a

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Prokl\WpSymfonyRouterBundle\Services\Agnostic\Contracts;
4+
5+
use Prokl\WpSymfonyRouterBundle\Services\Router\InitRouter;
6+
7+
/**
8+
* Interface Prokl\WpSymfonyRouterBundle\Services\Agnostic\Contracts
9+
* @package Local\Bitrix
10+
*
11+
* @since 24.07.2021
12+
*/
13+
interface RouterInitializerInterface
14+
{
15+
/**
16+
* Инициализация роутера.
17+
*
18+
* @param InitRouter $router Инициализированный роутер.
19+
*
20+
* @return mixed
21+
*/
22+
public function init(InitRouter $router);
23+
}

Services/Agnostic/Router.php

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
namespace Prokl\WpSymfonyRouterBundle\Services\Agnostic;
4+
5+
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\Contracts\RouterInitializerInterface;
6+
use Prokl\WpSymfonyRouterBundle\Services\Controllers\ErrorJsonController;
7+
use Prokl\WpSymfonyRouterBundle\Services\Router\InitRouter;
8+
use Symfony\Component\EventDispatcher\EventDispatcher;
9+
use Symfony\Component\HttpFoundation\Request;
10+
use Symfony\Component\HttpFoundation\RequestStack;
11+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
12+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
13+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
14+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
15+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver;
16+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
17+
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
18+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
19+
use Symfony\Component\Routing\RouterInterface;
20+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
21+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
22+
use Symfony\Component\Serializer\Serializer;
23+
24+
/**
25+
* Class Router
26+
* @package Prokl\WpSymfonyRouterBundle\Services\Agnostic
27+
*
28+
* @since 24.07.2021
29+
*/
30+
class Router
31+
{
32+
/**
33+
* @var InitRouter $router Инициализированный экземпляр роутера.
34+
*/
35+
private $router;
36+
37+
/**
38+
* AgnosticRouter constructor.
39+
*
40+
* @param RouterInterface $router Инициализированный экземпляр роутера.
41+
* @param RouterInitializerInterface $routerInitializer Инициализатор роутера.
42+
*/
43+
public function __construct(
44+
RouterInterface $router,
45+
RouterInitializerInterface $routerInitializer
46+
) {
47+
$this->router = new InitRouter(
48+
$router,
49+
new ErrorJsonController(
50+
new Serializer(
51+
[new ObjectNormalizer],
52+
[new JsonEncoder]
53+
)
54+
),
55+
new EventDispatcher(),
56+
new ControllerResolver(),
57+
new ArgumentResolver(
58+
new ArgumentMetadataFactory(),
59+
[
60+
new RequestAttributeValueResolver(),
61+
new RequestValueResolver(),
62+
new SessionValueResolver(),
63+
new DefaultValueResolver(),
64+
new VariadicValueResolver(),
65+
]
66+
),
67+
Request::createFromGlobals(),
68+
new RequestStack()
69+
);
70+
71+
$routerInitializer->init($this->router);
72+
}
73+
}

Services/Agnostic/RoutesLoader.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,14 @@ public function purgeCache() : void
152152
$filesystem->remove($this->cacheDir);
153153
}
154154

155+
/**
156+
* @return RouterInterface
157+
*/
158+
public function getRouter(): RouterInterface
159+
{
160+
return $this->router;
161+
}
162+
155163
/**
156164
* Создать (если надо), кэш.
157165
*
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Prokl\WpSymfonyRouterBundle\Services\Agnostic;
4+
5+
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\Contracts\RouterInitializerInterface;
6+
use Prokl\WpSymfonyRouterBundle\Services\Router\InitRouter;
7+
8+
/**
9+
* Class WpInitializerRouter
10+
* @package Prokl\WpSymfonyRouterBundle\Services\Agnostic
11+
*
12+
* @since 24.07.2021
13+
*/
14+
class WpInitializerRouter implements RouterInitializerInterface
15+
{
16+
/**
17+
* @inheritDoc
18+
*/
19+
public function init(InitRouter $router)
20+
{
21+
add_action('template_redirect', [$router, 'router'], 5);
22+
}
23+
}

readme.MD

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,28 @@ class SampleAjaxController extends AbstractWPAjaxController
6767
```
6868

6969
Или писать каку-нибудь логику для операций с `defaults`, `requirements` или `options` из параметров роута.
70+
71+
## Использование роутера без контейнера и вне фреймворка
72+
73+
`functions.php`:
74+
75+
```php
76+
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\RoutesLoader;
77+
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\Router;
78+
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\WpInitializerRouter;
79+
80+
$agnosticRouter = new RoutesLoader(
81+
$_SERVER['DOCUMENT_ROOT'] . '/local/configs/standalone_routes.yaml',
82+
$_SERVER['DOCUMENT_ROOT'] . '/wp-content/cache/routes', // Кэш; если null - без кэширования.
83+
$_ENV['APP_DEBUG'] // Режим отладки или нет
84+
);
85+
86+
$agnosticRouterInstance = new Router(
87+
$agnosticRouter->getRouter(),
88+
new WpInitializerRouter()
89+
);
90+
```
91+
92+
Все. Подтянутся роуты из `/local/configs/standalone_routes.yaml`. Автоматически подцепятся события.
93+
94+
Допускается наличие нескольких таких "агностических" роутеров в один момент.

0 commit comments

Comments
 (0)