1
+ <?php
2
+ namespace Imi \Rpc \Listener ;
3
+
4
+ use Imi \ServerManage ;
5
+ use Imi \RequestContext ;
6
+ use Imi \Event \EventParam ;
7
+ use Imi \Event \IEventListener ;
8
+ use Imi \Bean \Annotation \Listener ;
9
+ use Imi \Server \Route \RouteCallable ;
10
+ use Imi \Bean \Annotation \AnnotationManager ;
11
+ use Imi \Rpc \Route \Annotation \RpcRoute ;
12
+ use Imi \Rpc \Route \Annotation \RpcAction ;
13
+ use Imi \Rpc \Route \Annotation \Parser \RpcControllerParser ;
14
+ use Imi \Rpc \BaseRpcServer ;
15
+
16
+ /**
17
+ * RPC 服务器路由初始化
18
+ * @Listener("IMI.MAIN_SERVER.WORKER.START")
19
+ */
20
+ class RouteInit implements IEventListener
21
+ {
22
+ /**
23
+ * 事件处理方法
24
+ * @param EventParam $e
25
+ * @return void
26
+ */
27
+ public function handle (EventParam $ e )
28
+ {
29
+ $ this ->parseAnnotations ($ e );
30
+ }
31
+
32
+ /**
33
+ * 处理注解路由
34
+ * @return void
35
+ */
36
+ private function parseAnnotations (EventParam $ e )
37
+ {
38
+ $ controllerParser = RpcControllerParser::getInstance ();
39
+ foreach (ServerManage::getServers () as $ name => $ server )
40
+ {
41
+ if (!$ server instanceof BaseRpcServer)
42
+ {
43
+ continue ;
44
+ }
45
+ RequestContext::create ();
46
+ RequestContext::set ('server ' , $ server );
47
+ $ route = $ server ->getBean ('RpcRoute ' );
48
+ foreach ($ controllerParser ->getByServer ($ name ) as $ className => $ classItem )
49
+ {
50
+ $ classAnnotation = $ classItem ['annotation ' ];
51
+ foreach (AnnotationManager::getMethodsAnnotations ($ className , RpcAction::class) as $ methodName => $ actionAnnotations )
52
+ {
53
+ $ routes = AnnotationManager::getMethodAnnotations ($ className , $ methodName , RpcRoute::class);
54
+ if (!isset ($ routes [0 ]))
55
+ {
56
+ $ routes = [
57
+ new RpcRoute ([
58
+ 'name ' => $ methodName ,
59
+ ])
60
+ ];
61
+ }
62
+
63
+ foreach ($ routes as $ routeItem )
64
+ {
65
+ $ route ->addRuleAnnotation ($ routeItem , new RouteCallable ($ className , $ methodName ), [
66
+ 'serverName ' => $ name ,
67
+ 'controller ' => $ classAnnotation ,
68
+ ]);
69
+ }
70
+ }
71
+ }
72
+ RequestContext::destroy ();
73
+ }
74
+ }
75
+
76
+ }
0 commit comments