RegisterRouteService.php 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\Core\Service;
  4. use Closure;
  5. use SixShop\Core\Event\BeforeRegisterRouteEvent;
  6. use think\facade\Event;
  7. use think\facade\Route;
  8. use think\Http;
  9. use function SixShop\Core\extension_name_list;
  10. readonly class RegisterRouteService
  11. {
  12. public function __construct(private AutoloadService $autoloadService, private Http $http)
  13. {
  14. }
  15. public function init(): Closure
  16. {
  17. return function () {
  18. $appName = $this->http->getName();
  19. foreach (extension_name_list() as $extensionName) {
  20. $extension = $this->autoloadService->getExtension($extensionName);
  21. if (!$extension->available()) {
  22. continue;
  23. }
  24. $routes = $extension->getRoutes();
  25. if (isset($routes[$appName])) {
  26. $routeFile = $routes[$appName];
  27. $event = new BeforeRegisterRouteEvent();
  28. Event::trigger($event);
  29. Route::group($extensionName, function () use ($routeFile) {
  30. include $routeFile;
  31. })->middleware($event->getMiddlewares(), $extensionName);
  32. }
  33. }
  34. };
  35. }
  36. }