1 <?php
2
3 namespace Skimia\ApiFusion\Annotations\ApiRouting;
4
5 use Skimia\ApiFusion\Annotations\ApiRouting\Annotations\ApiEndpoint;
6 use Skimia\Foundation\Annotations\Scanner as BaseScanner;
7 use Skimia\ApiFusion\Annotations\ApiRouting\Annotations\ApiResource;
8
9 class Scanner extends BaseScanner
10 {
11 12 13
14 public function getScannedAnnotationPath()
15 {
16 return $this->app['path.storage'].'/framework/api.routes.scanned.php';
17 }
18
19 public function getAnnotationsDefinitions()
20 {
21 $output = '';
22
23 $reader = $this->getReader();
24
25 26 27
28 foreach ($this->getClassesToScan() as $class) {
29 foreach ($reader->getClassAnnotations($class) as $annotation) {
30 31 32
33 if (get_class($annotation) == ApiResource::class) {
34 $output .= $this->buildApiRoute($class->getName(), $annotation->version, $annotation->resourceEndPoint, $annotation->values);
35 }
36 }
37
38 foreach ($class->getMethods() as $method)
39 {
40 foreach ($reader->getMethodAnnotations($method) as $annotation)
41 {
42 43 44
45 if (get_class($annotation) == ApiEndpoint::class) {
46 $output .= $this->buildApiEndpoint($class->getName(), $method->getName(), $annotation->version, $annotation->verb, $annotation->resourceEndPoint, $annotation->values);
47 }
48 }
49 }
50 }
51
52 return trim($output);
53 }
54
55 56 57 58 59 60 61 62
63 protected function buildApiRoute($class, $version, $endpoint, $vars)
64 {
65 return sprintf(' $api->version("%s", function ($api) {'.PHP_EOL.
66 ' $api->resource("%s", "%s",'.PHP_EOL.'%s'.PHP_EOL.' );'.PHP_EOL.
67 ' });'.PHP_EOL,
68 $version,
69 $endpoint,
70 addslashes($class),
71 var_export($vars, true));
72 }
73 74 75 76 77 78 79 80
81 protected function buildApiEndpoint($class, $method, $version, $verb, $endpoint, $vars)
82 {
83 return sprintf(' $api->version("%s", function ($api) {'.PHP_EOL.
84 ' $api->%s("%s", "%s@%s",'.PHP_EOL.'%s'.PHP_EOL.' );'.PHP_EOL.
85 ' });'.PHP_EOL,
86 $version,
87 $verb,
88 $endpoint,
89 addslashes($class),
90 $method,
91 var_export($vars, true));
92 }
93
94 public function loadScannedAnnotations()
95 {
96 if ($this->annotationsAreScanned()) {
97 $api = $this->app['api.router'];
98
99 require $this->getScannedAnnotationPath();
100
101 return true;
102 }
103
104 return false;
105 }
106 }
107