| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Contracts\Service;
- use Psr\Container\ContainerInterface;
- use Symfony\Contracts\Service\Attribute\Required;
- use Symfony\Contracts\Service\Attribute\SubscribedService;
- /**
- * Implementation of ServiceSubscriberInterface that determines subscribed services from
- * method return types. Service ids are available as "ClassName::methodName".
- *
- * @author Kevin Bond <kevinbond@gmail.com>
- */
- trait ServiceSubscriberTrait
- {
- /** @var ContainerInterface */
- protected $container;
- public static function getSubscribedServices()
- {
- $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : [];
- foreach ((new \ReflectionClass(self::class))->getMethods() as $method) {
- if (self::class !== $method->getDeclaringClass()->name) {
- continue;
- }
- if (!$attribute = (method_exists($method, 'getAttributes') ? $method->getAttributes(SubscribedService::class) : [])[0] ?? null) {
- continue;
- }
- if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) {
- throw new \LogicException(sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name));
- }
- if (!$returnType = $method->getReturnType()) {
- throw new \LogicException(sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class));
- }
- /* @var SubscribedService $attribute */
- $attribute = $attribute->newInstance();
- $attribute->key = $attribute->key ?? self::class.'::'.$method->name;
- $attribute->type = $attribute->type ?? ($returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType);
- $attribute->nullable = $returnType->allowsNull();
- if ($attribute->attributes) {
- $services[] = $attribute;
- } else {
- $services[$attribute->key] = ($attribute->nullable ? '?' : '').$attribute->type;
- }
- }
- return $services;
- }
- /**
- * @required
- */
- public function setContainer(ContainerInterface $container)
- {
- $ret = null;
- if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) {
- $ret = parent::setContainer($container);
- }
- $this->container = $container;
- return $ret;
- }
- }
|