Laravel AT Protocol Client (alpha & unstable)
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add HasExtensions and HasDomainExtensions traits for client extensibility

+184
+71
src/Concerns/HasDomainExtensions.php
··· 1 + <?php 2 + 3 + namespace SocialDept\AtpClient\Concerns; 4 + 5 + use BadMethodCallException; 6 + 7 + trait HasDomainExtensions 8 + { 9 + /** 10 + * Resolved domain extension instances. 11 + * 12 + * @var array<string, object> 13 + */ 14 + protected array $resolvedDomainExtensions = []; 15 + 16 + /** 17 + * Get the domain name for this client. 18 + */ 19 + abstract protected function getDomainName(): string; 20 + 21 + /** 22 + * Get the root client class for extension lookup. 23 + */ 24 + abstract protected function getRootClientClass(): string; 25 + 26 + /** 27 + * Resolve a domain extension instance. 28 + */ 29 + protected function resolveDomainExtension(string $name): object 30 + { 31 + if (! isset($this->resolvedDomainExtensions[$name])) { 32 + $rootClass = $this->getRootClientClass(); 33 + $extensions = $rootClass::getDomainExtensionsFor($this->getDomainName()); 34 + $this->resolvedDomainExtensions[$name] = ($extensions[$name])($this); 35 + } 36 + 37 + return $this->resolvedDomainExtensions[$name]; 38 + } 39 + 40 + /** 41 + * Check if a domain extension exists. 42 + */ 43 + protected function hasDomainExtension(string $name): bool 44 + { 45 + $rootClass = $this->getRootClientClass(); 46 + 47 + return $rootClass::hasDomainExtension($this->getDomainName(), $name); 48 + } 49 + 50 + /** 51 + * Magic getter for domain extension access. 52 + */ 53 + public function __get(string $name): mixed 54 + { 55 + if ($this->hasDomainExtension($name)) { 56 + return $this->resolveDomainExtension($name); 57 + } 58 + 59 + throw new BadMethodCallException( 60 + sprintf('Property [%s] does not exist on [%s].', $name, static::class) 61 + ); 62 + } 63 + 64 + /** 65 + * Magic isset for domain extension checking. 66 + */ 67 + public function __isset(string $name): bool 68 + { 69 + return $this->hasDomainExtension($name); 70 + } 71 + }
+113
src/Concerns/HasExtensions.php
··· 1 + <?php 2 + 3 + namespace SocialDept\AtpClient\Concerns; 4 + 5 + use BadMethodCallException; 6 + use Closure; 7 + 8 + trait HasExtensions 9 + { 10 + /** 11 + * Registered domain client extensions. 12 + * 13 + * @var array<string, Closure> 14 + */ 15 + protected static array $extensions = []; 16 + 17 + /** 18 + * Registered request client extensions for existing domains. 19 + * 20 + * @var array<string, array<string, Closure>> 21 + */ 22 + protected static array $domainExtensions = []; 23 + 24 + /** 25 + * Resolved extension instances (lazy loading). 26 + * 27 + * @var array<string, object> 28 + */ 29 + protected array $resolvedExtensions = []; 30 + 31 + /** 32 + * Register a domain client extension. 33 + */ 34 + public static function extend(string $name, Closure $callback): void 35 + { 36 + static::$extensions[$name] = $callback; 37 + } 38 + 39 + /** 40 + * Register a request client extension for an existing domain. 41 + */ 42 + public static function extendDomain(string $domain, string $name, Closure $callback): void 43 + { 44 + static::$domainExtensions[$domain][$name] = $callback; 45 + } 46 + 47 + /** 48 + * Check if an extension is registered. 49 + */ 50 + public static function hasExtension(string $name): bool 51 + { 52 + return isset(static::$extensions[$name]); 53 + } 54 + 55 + /** 56 + * Check if a domain extension is registered. 57 + */ 58 + public static function hasDomainExtension(string $domain, string $name): bool 59 + { 60 + return isset(static::$domainExtensions[$domain][$name]); 61 + } 62 + 63 + /** 64 + * Get domain extensions for a specific domain. 65 + */ 66 + public static function getDomainExtensionsFor(string $domain): array 67 + { 68 + return static::$domainExtensions[$domain] ?? []; 69 + } 70 + 71 + /** 72 + * Flush all registered extensions (useful for testing). 73 + */ 74 + public static function flushExtensions(): void 75 + { 76 + static::$extensions = []; 77 + static::$domainExtensions = []; 78 + } 79 + 80 + /** 81 + * Resolve an extension instance. 82 + */ 83 + protected function resolveExtension(string $name): object 84 + { 85 + if (! isset($this->resolvedExtensions[$name])) { 86 + $this->resolvedExtensions[$name] = (static::$extensions[$name])($this); 87 + } 88 + 89 + return $this->resolvedExtensions[$name]; 90 + } 91 + 92 + /** 93 + * Magic getter for extension access. 94 + */ 95 + public function __get(string $name): mixed 96 + { 97 + if (static::hasExtension($name)) { 98 + return $this->resolveExtension($name); 99 + } 100 + 101 + throw new BadMethodCallException( 102 + sprintf('Property [%s] does not exist on [%s].', $name, static::class) 103 + ); 104 + } 105 + 106 + /** 107 + * Magic isset for extension checking. 108 + */ 109 + public function __isset(string $name): bool 110 + { 111 + return static::hasExtension($name); 112 + } 113 + }