HookAttributeService.php 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. <?php
  2. declare(strict_types=1);
  3. namespace SixShop\Core\Service;
  4. use ReflectionClass;
  5. use ReflectionMethod;
  6. use SixShop\Core\Attribute\Hook;
  7. use SixShop\Core\Helper;
  8. use SixShop\Extension\system\Enum\ExtensionStatusEnum;
  9. use SixShop\Extension\system\ExtensionManager;
  10. use think\App;
  11. use think\facade\Event;
  12. class HookAttributeService
  13. {
  14. public function init(App $app): void
  15. {
  16. $extensionManager = $app->make(ExtensionManager::class);
  17. foreach (Helper::extension_name_list() as $extensionName) {
  18. if ($extensionManager->getInfo($extensionName)->status !== ExtensionStatusEnum::ENABLED) {
  19. continue;
  20. }
  21. $extension = $extensionManager->getExtension($extensionName);
  22. $hookClassList = $extension->getHooks();
  23. foreach ($hookClassList as $hookClass) {
  24. $ref = new ReflectionClass($hookClass);
  25. foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
  26. $attributes = $method->getAttributes(Hook::class);
  27. foreach ($attributes as $attr) {
  28. $hookNameList = (array)$attr->newInstance()->hook;
  29. foreach ($hookNameList as $hookName) {
  30. Event::listen($hookName, [$hookClass, $method->getName()]);
  31. }
  32. }
  33. }
  34. }
  35. }
  36. $app->event->trigger('hook_init', $app);
  37. }
  38. }