diff --git a/config/services.php b/config/services.php index b7a92b3e5..675b9a1ee 100644 --- a/config/services.php +++ b/config/services.php @@ -336,6 +336,7 @@ return [ */ foreach ($receivers as $messageClass => $handlerClass) { $handlers[$messageClass][] = static function ($message) use ($handlerClass, $di) { + /** @var callable $obj */ $obj = $di->get($handlerClass); return $obj($message); }; diff --git a/phpstan.neon b/phpstan.neon index cd6f7b389..55329b27e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -31,6 +31,10 @@ parameters: scanDirectories: - ./vendor/zircote/swagger-php/src/Annotations + stubFiles: + - util/phpstan_di.stub + - util/phpstan_phpdi.stub + universalObjectCratesClasses: - App\Session\NamespaceInterface - App\View diff --git a/src/CallableEventDispatcher.php b/src/CallableEventDispatcher.php index 0974bb824..0d94d507d 100644 --- a/src/CallableEventDispatcher.php +++ b/src/CallableEventDispatcher.php @@ -85,6 +85,9 @@ final class CallableEventDispatcher extends EventDispatcher implements CallableE } } + /** + * @param class-string $className + */ public function addCallableListener( string $eventName, string $className, @@ -98,6 +101,9 @@ final class CallableEventDispatcher extends EventDispatcher implements CallableE ); } + /** + * @param class-string $className + */ public function removeCallableListener( string $eventName, string $className, @@ -109,6 +115,9 @@ final class CallableEventDispatcher extends EventDispatcher implements CallableE ); } + /** + * @param class-string $className + */ private function getCallable( string $className, ?string $method = '__invoke' diff --git a/src/Console/Command/SetupFixturesCommand.php b/src/Console/Command/SetupFixturesCommand.php index 5102a38a0..e67d26538 100644 --- a/src/Console/Command/SetupFixturesCommand.php +++ b/src/Console/Command/SetupFixturesCommand.php @@ -8,6 +8,7 @@ use App\Container\ContainerAwareTrait; use App\Container\EntityManagerAwareTrait; use App\Container\EnvironmentAwareTrait; use Doctrine\Common\DataFixtures\Executor\ORMExecutor; +use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\DataFixtures\Loader; use Doctrine\Common\DataFixtures\Purger\ORMPurger; use RecursiveDirectoryIterator; @@ -46,7 +47,10 @@ final class SetupFixturesCommand extends CommandAbstract continue; } + /** @var class-string $className */ $className = 'App\\Entity\\Fixture\\' . $fileName; + + /** @var FixtureInterface $fixture */ $fixture = $this->di->get($className); $loader->addFixture($fixture); diff --git a/src/Console/Command/Sync/NowPlayingCommand.php b/src/Console/Command/Sync/NowPlayingCommand.php index f4d73f8f8..aa86c8af4 100644 --- a/src/Console/Command/Sync/NowPlayingCommand.php +++ b/src/Console/Command/Sync/NowPlayingCommand.php @@ -114,7 +114,7 @@ final class NowPlayingCommand extends AbstractSyncRunnerCommand $lookupRaw = $this->nowPlayingCache->getLookup(); $lookup = []; foreach ($lookupRaw as $stationRow) { - $lookup[$stationRow['short_name']] = (int)($stationRow['updated_at'] ?? 0); + $lookup[$stationRow['short_name']] = $stationRow['updated_at']; } $allStations = $this->em->createQuery( diff --git a/src/Controller/Api/Stations/Files/ListAction.php b/src/Controller/Api/Stations/Files/ListAction.php index 3408450c9..0a2099848 100644 --- a/src/Controller/Api/Stations/Files/ListAction.php +++ b/src/Controller/Api/Stations/Files/ListAction.php @@ -59,7 +59,7 @@ final class ListAction implements SingleActionInterface [$searchPhrase, $playlist, $special] = $this->parseSearchQuery( $station, - $searchPhraseFull + $searchPhraseFull ?? '' ); $cacheKeyParts = [ diff --git a/src/Radio/Adapters.php b/src/Radio/Adapters.php index 1b68f455f..2aa8ac6d4 100644 --- a/src/Radio/Adapters.php +++ b/src/Radio/Adapters.php @@ -17,6 +17,12 @@ use App\Radio\Enums\RemoteAdapters; /** * Manager class for radio adapters. + * + * @phpstan-type AdapterInfo array */ final class Adapters { @@ -109,10 +115,11 @@ final class Adapters /** * @param array $cases * @param bool $checkInstalled - * @return mixed[] + * @return AdapterInfo */ private function listAdaptersFromEnum(array $cases, bool $checkInstalled = false): array { + /** @var AdapterInfo $adapters */ $adapters = []; foreach ($cases as $adapter) { $adapters[$adapter->getValue()] = [ @@ -130,9 +137,10 @@ final class Adapters return true; } - /** @var AbstractLocalAdapter $adapter */ $adapter = $this->di->get($adapterInfo['class']); - return $adapter->isInstalled(); + return ($adapter instanceof AbstractLocalAdapter) + ? $adapter->isInstalled() + : true; } ); } diff --git a/src/Radio/Enums/AdapterTypeInterface.php b/src/Radio/Enums/AdapterTypeInterface.php index b4d8d7594..413341da7 100644 --- a/src/Radio/Enums/AdapterTypeInterface.php +++ b/src/Radio/Enums/AdapterTypeInterface.php @@ -10,5 +10,6 @@ interface AdapterTypeInterface public function getName(): string; + /** @return class-string|null */ public function getClass(): ?string; } diff --git a/src/Radio/Enums/BackendAdapters.php b/src/Radio/Enums/BackendAdapters.php index d4ddce572..1abf7d5eb 100644 --- a/src/Radio/Enums/BackendAdapters.php +++ b/src/Radio/Enums/BackendAdapters.php @@ -24,6 +24,9 @@ enum BackendAdapters: string implements AdapterTypeInterface }; } + /** + * @return class-string|null + */ public function getClass(): ?string { return match ($this) { diff --git a/src/Radio/Enums/FrontendAdapters.php b/src/Radio/Enums/FrontendAdapters.php index 21daaacd8..b8021b315 100644 --- a/src/Radio/Enums/FrontendAdapters.php +++ b/src/Radio/Enums/FrontendAdapters.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Radio\Enums; +use App\Radio\Frontend\AbstractFrontend; use App\Radio\Frontend\Icecast; use App\Radio\Frontend\Shoutcast; @@ -27,6 +28,9 @@ enum FrontendAdapters: string implements AdapterTypeInterface }; } + /** + * @return class-string|null + */ public function getClass(): ?string { return match ($this) { diff --git a/src/Radio/Enums/RemoteAdapters.php b/src/Radio/Enums/RemoteAdapters.php index 1f7fd4c8a..283d21c7d 100644 --- a/src/Radio/Enums/RemoteAdapters.php +++ b/src/Radio/Enums/RemoteAdapters.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace App\Radio\Enums; +use App\Radio\Remote\AbstractRemote; use App\Radio\Remote\AzuraRelay; use App\Radio\Remote\Icecast; use App\Radio\Remote\Shoutcast1; @@ -31,6 +32,9 @@ enum RemoteAdapters: string implements AdapterTypeInterface }; } + /** + * @return class-string + */ public function getClass(): string { return match ($this) { diff --git a/util/phpstan_di.stub b/util/phpstan_di.stub new file mode 100644 index 000000000..42dc9873e --- /dev/null +++ b/util/phpstan_di.stub @@ -0,0 +1,15 @@ + $id Identifier of the entry to look for. + * @return T Entry. + */ + public function get(string $id); +} diff --git a/util/phpstan_phpdi.stub b/util/phpstan_phpdi.stub new file mode 100644 index 000000000..568066bc2 --- /dev/null +++ b/util/phpstan_phpdi.stub @@ -0,0 +1,15 @@ + $id Identifier of the entry to look for. + * @return T Entry. + */ + public function get(string $id); +}