boot.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. /**
  3. * related_paragraphs 重建工程的公共引导。
  4. *
  5. * 这些脚本刻意留在 scripts/ 而不是 app/Console/Commands/:重建期间它们会被反复
  6. * 改写、丢弃、重跑,不属于应用的常驻命令面。导出器稳定后再收编成 artisan command。
  7. */
  8. use Illuminate\Contracts\Console\Kernel;
  9. require __DIR__.'/../../../vendor/autoload.php';
  10. $app = require __DIR__.'/../../../bootstrap/app.php';
  11. $app->make(Kernel::class)->bootstrap();
  12. require __DIR__.'/Logger.php';
  13. /** 本工程所有产物的落地目录。 */
  14. function rp_report_dir(): string
  15. {
  16. $dir = __DIR__.'/../report';
  17. if (! is_dir($dir)) {
  18. mkdir($dir, 0o755, true);
  19. }
  20. return $dir;
  21. }
  22. function rp_data_dir(): string
  23. {
  24. return __DIR__.'/../data';
  25. }
  26. /** 命令行参数:--key=value / --flag,返回 [$options, $positional]。 */
  27. function rp_args(array $argv): array
  28. {
  29. $options = [];
  30. $positional = [];
  31. foreach (array_slice($argv, 1) as $arg) {
  32. if (str_starts_with($arg, '--')) {
  33. $body = substr($arg, 2);
  34. if (str_contains($body, '=')) {
  35. [$k, $v] = explode('=', $body, 2);
  36. $options[$k] = $v;
  37. } else {
  38. $options[$body] = true;
  39. }
  40. } else {
  41. $positional[] = $arg;
  42. }
  43. }
  44. return [$options, $positional];
  45. }
  46. /**
  47. * 表名白名单校验。这些脚本会把表名拼进 SQL(标识符不能用绑定参数),
  48. * 所以只允许我们自己的表族,避免手滑打错表名时打到生产数据。
  49. */
  50. function rp_assert_table(string $table): string
  51. {
  52. if (! preg_match('/^related_paragraphs(_[a-z0-9_]+)?$/', $table)) {
  53. throw new InvalidArgumentException("拒绝操作非 related_paragraphs 表族的表:$table");
  54. }
  55. return $table;
  56. }
  57. function rp_json_write(string $path, mixed $data): void
  58. {
  59. file_put_contents(
  60. $path,
  61. json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)."\n"
  62. );
  63. }
  64. function rp_json_read(string $path): mixed
  65. {
  66. if (! file_exists($path)) {
  67. throw new RuntimeException("找不到文件:$path");
  68. }
  69. return json_decode(file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
  70. }