Skip to content

Commit d21607e

Browse files
committed
Add more metadata
1 parent 9c6380d commit d21607e

File tree

4 files changed

+195
-33
lines changed

4 files changed

+195
-33
lines changed

php-templates/auth.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
return collect(\Illuminate\Support\Facades\Gate::abilities())
4+
->map(function ($policy, $key) {
5+
$reflection = new \ReflectionFunction($policy);
6+
7+
$policyClass = null;
8+
9+
if (get_class($reflection->getClosureThis()) === \Illuminate\Auth\Access\Gate::class) {
10+
$vars = $reflection->getClosureUsedVariables();
11+
12+
if (isset($vars['callback'])) {
13+
[$policyClass, $method] = explode('@', $vars['callback']);
14+
15+
$reflection = new \ReflectionMethod($policyClass, $method);
16+
}
17+
}
18+
return [
19+
'key' => $key,
20+
'uri' => $reflection->getFileName(),
21+
'policy_class' => $policyClass,
22+
'lineNumber' => $reflection->getStartLine(),
23+
];
24+
})
25+
->merge(
26+
collect(\Illuminate\Support\Facades\Gate::policies())->flatMap(function ($policy, $model) {
27+
$methods = (new ReflectionClass($policy))->getMethods();
28+
29+
return collect($methods)->map(function (ReflectionMethod $method) use ($policy) {
30+
return [
31+
'key' => $method->getName(),
32+
'uri' => $method->getFileName(),
33+
'policy_class' => $policy,
34+
'lineNumber' => $method->getStartLine(),
35+
];
36+
})->filter(function ($ability) {
37+
return !in_array($ability['key'], ['allow', 'deny']);
38+
});
39+
}),
40+
)
41+
->values()
42+
->groupBy('key');

php-templates/middleware.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
return collect(app("Illuminate\Contracts\Http\Kernel")->getMiddlewareGroups())
4+
->merge(app("Illuminate\Contracts\Http\Kernel")->getRouteMiddleware())
5+
->map(function ($middleware, $key) {
6+
$result = [
7+
"class" => null,
8+
"uri" => null,
9+
"startLine" => null,
10+
"parameters" => null,
11+
"groups" => [],
12+
];
13+
14+
if (is_array($middleware)) {
15+
$result["groups"] = collect($middleware)->map(function ($m) {
16+
if (!class_exists($m)) {
17+
return [
18+
"class" => $m,
19+
"uri" => null,
20+
"startLine" => null
21+
];
22+
}
23+
24+
$reflected = new ReflectionClass($m);
25+
$reflectedMethod = $reflected->getMethod("handle");
26+
27+
return [
28+
"class" => $m,
29+
"uri" => $reflected->getFileName(),
30+
"startLine" =>
31+
$reflectedMethod->getFileName() === $reflected->getFileName()
32+
? $reflectedMethod->getStartLine()
33+
: null
34+
];
35+
})->all();
36+
37+
return $result;
38+
}
39+
40+
$reflected = new ReflectionClass($middleware);
41+
$reflectedMethod = $reflected->getMethod("handle");
42+
43+
$result = array_merge($result, [
44+
"class" => $middleware,
45+
"uri" => $reflected->getFileName(),
46+
"startLine" => $reflectedMethod->getStartLine(),
47+
]);
48+
49+
$parameters = collect($reflectedMethod->getParameters())
50+
->filter(function ($rc) {
51+
return $rc->getName() !== "request" && $rc->getName() !== "next";
52+
})
53+
->map(function ($rc) {
54+
return $rc->getName() . ($rc->isVariadic() ? "..." : "");
55+
});
56+
57+
if ($parameters->isEmpty()) {
58+
return $result;
59+
}
60+
61+
return array_merge($result, [
62+
"parameters" => $parameters->implode(",")
63+
]);
64+
});

resources/views/meta.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,19 @@
8888
<?php endif ?>
8989

9090
<?php if (isset($expectedArguments)) : ?>
91-
<?php foreach ($expectedArguments as $function => $arguments) : ?>
92-
<?php foreach ($arguments as $index => $argumentSet) : ?>
91+
<?php foreach ($expectedArguments as $arguments) : ?>
92+
<?php
93+
$classes = isset($arguments['class']) ? (array) $arguments['class'] : [null];
94+
$index = $arguments['index'] ?? 0;
95+
$argumentSet = $arguments['argumentSet'];
96+
$functions = [];
97+
foreach ($classes as $class) {
98+
foreach ((array) $arguments['method'] as $method) {
99+
$functions[] = '\\' . ($class ? ltrim($class, '\\') . '::' : '') . $method . '()';
100+
}
101+
}
102+
?>
103+
<?php foreach ($functions as $function) : ?>
93104
expectedArguments(<?= $function ?>, <?= $index ?>, argumentsSet('<?= $argumentSet ?>'));
94105
<?php endforeach; ?>
95106
<?php endforeach; ?>

src/Console/MetaCommand.php

Lines changed: 76 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Illuminate\Contracts\View\Factory;
1818
use Illuminate\Filesystem\Filesystem;
1919
use Illuminate\Support\Collection;
20+
use Illuminate\Support\Env;
2021
use RuntimeException;
2122
use Symfony\Component\Console\Input\InputOption;
2223
use Symfony\Component\Console\Output\OutputInterface;
@@ -68,9 +69,7 @@ class MetaCommand extends Command
6869
protected $configMethods = [
6970
'\config()',
7071
'\Illuminate\Config\Repository::get()',
71-
'\Illuminate\Config\Repository::set()',
7272
'\Illuminate\Support\Facades\Config::get()',
73-
'\Illuminate\Support\Facades\Config::set()',
7473
];
7574

7675
protected $userMethods = [
@@ -202,59 +201,105 @@ protected function registerClassAutoloadExceptions(): callable
202201
protected function getExpectedArgumentSets()
203202
{
204203
return [
204+
'auth' => $this->loadTemplate('auth')->keys()->filter()->toArray(),
205205
'configs' => $this->loadTemplate('configs')->pluck('name')->filter()->toArray(),
206+
'middleware' => $this->loadTemplate('middleware')->keys()->filter()->toArray(),
206207
'routes' => $this->loadTemplate('routes')->pluck('name')->filter()->toArray(),
207208
'views' => $this->loadTemplate('views')->pluck('key')->filter()->map(function ($value) {
208209
return (string) $value;
209210
})->toArray(),
210211
'translations' => $this->loadTemplate('translations')->filter()->keys()->toArray(),
212+
'env' => array_keys($_ENV),
211213
];
212214
}
213215

214216
protected function getExpectedArguments()
215217
{
216218
return [
217-
'\config()' => [
218-
0 => 'configs',
219+
[
220+
'class' => '\Illuminate\Support\Facades\Gate',
221+
'method' => [
222+
'has',
223+
'allows',
224+
'denies',
225+
'check',
226+
'any',
227+
'none',
228+
'authorize',
229+
'inspect',
230+
],
231+
'argumentSet' => 'auth'
219232
],
220-
'\Illuminate\Config\Repository::get()' => [
221-
0 => 'configs',
233+
[
234+
'class' => ['\Illuminate\Support\Facades\Route', '\Illuminate\Support\Facades\Auth'],
235+
'method' => ['can', 'cannot'],
236+
'argumentSet' => 'auth'
222237
],
223-
'\Illuminate\Config\Repository::set()' => [
224-
0 => 'configs',
238+
[
239+
'method' => 'config',
240+
'argumentSet' => 'configs'
225241
],
226-
'\Illuminate\Support\Facades\Config::get()' => [
227-
0 => 'configs',
242+
[
243+
'class' => ['\Illuminate\Config\Repository', '\Illuminate\Support\Facades\Config'],
244+
'method' => [
245+
'get',
246+
'getMany',
247+
'set',
248+
'string',
249+
'integer',
250+
'boolean',
251+
'float',
252+
'array',
253+
'prepend',
254+
'push',
255+
],
256+
'argumentSet' => 'configs'
228257
],
229-
'\Illuminate\Support\Facades\Config::set()' => [
230-
0 => 'configs',
258+
[
259+
'class' => ['\Illuminate\Support\Facades\Route', '\Illuminate\Routing\Router'],
260+
'method' => ['middleware', 'withoutMiddleware'],
261+
'argumentSet' => 'middleware'
231262
],
232-
'\route()' => [
233-
0 => 'routes',
263+
[
264+
'method' => ['route', 'to_route', 'signedRoute'],
265+
'argumentSet' => 'routes'
234266
],
235-
'\Illuminate\Support\Facades\Route::get()' => [
236-
0 => 'routes',
267+
[
268+
'class' => [
269+
'\Illuminate\Support\Facades\Redirect',
270+
'\Illuminate\Support\Facades\URL',
271+
'\Illuminate\Routing\Redirector',
272+
'\Illuminate\Routing\UrlGenerator'
273+
],
274+
'method' => ['route', 'signedRoute', 'temporarySignedRoute'],
275+
'argumentSet' => 'routes'
237276
],
238-
'\Illuminate\Routing\Router::get()' => [
239-
0 => 'routes',
277+
[
278+
'method' => 'view',
279+
'argumentSet' => 'views'
240280
],
241-
'\view()' => [
242-
0 => 'views',
281+
[
282+
'class' => ['\Illuminate\Support\Facades\View', '\Illuminate\View\Factory'],
283+
'method' => 'make',
284+
'argumentSet' => 'views'
243285
],
244-
'\Illuminate\Support\Facades\View::make()' => [
245-
0 => 'views',
286+
[
287+
'method' => ['__', 'trans'],
288+
'argumentSet' => 'translations'
246289
],
247-
'\Illuminate\View\Factory::make()' => [
248-
0 => 'views',
290+
[
291+
'class' => ['\Illuminate\Contracts\Translation\Translator'],
292+
'method' => ['get'],
293+
'argumentSet' => 'translations'
249294
],
250-
'\__()' => [
251-
0 => 'translations',
295+
[
296+
'method' => 'env',
297+
'argumentSet' => 'env'
252298
],
253-
'\trans()' => [
254-
0 => 'translations',
255-
],
256-
'\Illuminate\Contracts\Translation\Translator::get()' => [
257-
0 => 'translations',
299+
[
300+
'class' => '\Illuminate\Support\Env',
301+
'method' => 'get',
302+
'argumentSet' => 'env'
258303
],
259304
];
260305
}

0 commit comments

Comments
 (0)