AppServiceProvider.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. namespace App\Providers;
  3. use App\Services\PaliSeriesesService;
  4. use App\Services\RomanizeService;
  5. use App\Services\UserService;
  6. use App\Tools\QueryBuilderMacro;
  7. use App\View\Composers\BlogViewComposer;
  8. use Carbon\CarbonImmutable;
  9. use Godruoyi\Snowflake\LaravelSequenceResolver;
  10. use Godruoyi\Snowflake\Snowflake;
  11. use Illuminate\Database\Query\Builder as QueryBuilder;
  12. use Illuminate\Support\Facades\Date;
  13. use Illuminate\Support\Facades\DB;
  14. use Illuminate\Support\Facades\View;
  15. use Illuminate\Support\ServiceProvider;
  16. use Illuminate\Validation\Rules\Password;
  17. class AppServiceProvider extends ServiceProvider
  18. {
  19. /**
  20. * Register any application services.
  21. */
  22. public function register(): void
  23. {
  24. /*
  25. |--------------------------------------------------------------------------
  26. | Snowflake ID Generator
  27. |--------------------------------------------------------------------------
  28. */
  29. $this->app->singleton('snowflake', function () {
  30. return (new Snowflake(
  31. config('mint.snowflake.data_center_id'),
  32. config('mint.snowflake.worker_id')
  33. ))
  34. ->setStartTimeStamp(
  35. strtotime(config('mint.snowflake.start')) * 1000
  36. )
  37. ->setSequenceResolver(
  38. new LaravelSequenceResolver(
  39. $this->app->get('cache')->store()
  40. )
  41. );
  42. });
  43. /*
  44. |--------------------------------------------------------------------------
  45. | Romanize Service
  46. |--------------------------------------------------------------------------
  47. */
  48. $this->app->singleton(RomanizeService::class);
  49. /*
  50. |--------------------------------------------------------------------------
  51. | Pali Serieses Service
  52. |--------------------------------------------------------------------------
  53. */
  54. $this->app->singleton(PaliSeriesesService::class);
  55. /*
  56. |--------------------------------------------------------------------------
  57. | User Service
  58. |--------------------------------------------------------------------------
  59. |
  60. | 必须是 singleton:它在请求内维护一张 uuid => 摘要的身份映射,同一个用户
  61. | 在一次请求里被解析多次时只查一次库、只签一次头像 URL。每次 make 新实例
  62. | 那张映射就永远是空的。
  63. |
  64. */
  65. $this->app->singleton(UserService::class);
  66. }
  67. /**
  68. * Bootstrap any application services.
  69. */
  70. public function boot(): void
  71. {
  72. /*
  73. |--------------------------------------------------------------------------
  74. | Laravel 13 Default Production Behaviors
  75. |--------------------------------------------------------------------------
  76. */
  77. $this->configureDefaults();
  78. /*
  79. |--------------------------------------------------------------------------
  80. | Custom Query Builder Macros
  81. |--------------------------------------------------------------------------
  82. */
  83. QueryBuilder::mixin(
  84. $this->app->make(QueryBuilderMacro::class)
  85. );
  86. /*
  87. |--------------------------------------------------------------------------
  88. | View Composers
  89. |--------------------------------------------------------------------------
  90. */
  91. View::composer('blog.*', BlogViewComposer::class);
  92. View::composer('layouts.blog', BlogViewComposer::class);
  93. }
  94. /**
  95. * Configure default behaviors for production-ready applications.
  96. */
  97. protected function configureDefaults(): void
  98. {
  99. /*
  100. |--------------------------------------------------------------------------
  101. | Use Immutable Dates
  102. |--------------------------------------------------------------------------
  103. */
  104. Date::use(CarbonImmutable::class);
  105. /*
  106. |--------------------------------------------------------------------------
  107. | Prevent destructive DB commands in production
  108. |--------------------------------------------------------------------------
  109. */
  110. DB::prohibitDestructiveCommands(
  111. app()->isProduction(),
  112. );
  113. /*
  114. |--------------------------------------------------------------------------
  115. | Strong password defaults in production
  116. |--------------------------------------------------------------------------
  117. */
  118. Password::defaults(
  119. fn (): ?Password => app()->isProduction()
  120. ? Password::min(12)
  121. ->mixedCase()
  122. ->letters()
  123. ->numbers()
  124. ->symbols()
  125. ->uncompromised()
  126. : null,
  127. );
  128. }
  129. }