diff --git a/composer.json b/composer.json index 748ba53..1ff4c84 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,7 @@ "prefer-stable": true, "require": { "php": "^7.0", + "doctrine/common": "^2.0", "doctrine/inflector": "^1.0", "zendframework/zend-paginator": "^2.6" }, @@ -32,6 +33,7 @@ "humbug/humbug": "~1.0@dev", "phpmetrics/phpmetrics": "^2.0", "phpmd/phpmd": "^2.0", + "phpstan/phpstan": "~0.6", "phpunit/phpunit": "^4.5|^5.0", "phpunit/phpunit-mock-objects": "^3.2", "sebastian/phpcpd": "^2.0", @@ -62,6 +64,7 @@ "phpcs": "phpcs --standard=PSR2 src tests", "phpcs-lint": "php-cs-fixer fix --dry-run --verbose", "phpcpd": "phpcpd src", + "phpstan": "phpstan analyse --level 1 src tests", "phpmd": "phpmd src text unusedcode,naming,design,controversial,codesize", "phpmetrics": "phpmetrics --failure-condition='average.maintainabilityIndex < 50' src", "phpmetrics-report": "phpmetrics --report-html=build/metrics/index.html --offline src", @@ -75,6 +78,7 @@ "@phpcs-lint", "@phpcpd", "@phpmd", + "@phpstan", "@phpmetrics" ], "reports": [ diff --git a/src/EventsTrait.php b/src/EventsTrait.php index d10dd09..d55fded 100644 --- a/src/EventsTrait.php +++ b/src/EventsTrait.php @@ -15,6 +15,7 @@ use Doctrine\Common\EventManager; use Doctrine\Common\EventSubscriber; +use Doctrine\Common\Persistence\ObjectManager; /** * Events trait. @@ -75,7 +76,7 @@ public function restoreEventSubscribers() * * @param string $event */ - public function disableEventListeners($event) + public function disableEventListeners(string $event) { if (!array_key_exists($event, $this->disabledListeners)) { $this->disabledListeners[$event] = []; @@ -91,10 +92,12 @@ public function disableEventListeners($event) /** * Disable listener for an event. * - * @param string $event - * @param \Doctrine\Common\EventSubscriber|string $subscriberClass + * @param string $event + * @param string|EventSubscriber $subscriberClass + * + * @throws \InvalidArgumentException */ - public function disableEventListener($event, $subscriberClass) + public function disableEventListener(string $event, $subscriberClass) { $subscriberClass = $this->getSubscriberClassName($subscriberClass); @@ -132,7 +135,7 @@ public function restoreAllEventListeners() * * @param string $event */ - public function restoreEventListeners($event) + public function restoreEventListeners(string $event) { if (!array_key_exists($event, $this->disabledListeners) || empty($this->disabledListeners[$event])) { return; @@ -157,7 +160,7 @@ public function restoreEventListeners($event) * * @return string */ - protected function getSubscriberClassName($subscriberClass) + protected function getSubscriberClassName($subscriberClass): string { if (is_object($subscriberClass) && in_array(EventSubscriber::class, class_implements($subscriberClass))) { return get_class($subscriberClass); @@ -178,7 +181,7 @@ protected function getSubscriberClassName($subscriberClass) * * @return array */ - public function getRegisteredEvents() + public function getRegisteredEvents(): array { return array_keys($this->getEventManager()->getListeners()); } @@ -190,7 +193,7 @@ public function getRegisteredEvents() * * @return EventSubscriber[] */ - protected function getEventListeners($event = null) + protected function getEventListeners($event = null): array { $eventManager = $this->getEventManager(); @@ -202,7 +205,7 @@ protected function getEventListeners($event = null) * * @return EventManager */ - protected function getEventManager() + protected function getEventManager(): EventManager { return $this->getManager()->getEventManager(); } @@ -210,7 +213,7 @@ protected function getEventManager() /** * Get object manager. * - * @return \Doctrine\ORM\EntityManager|\Doctrine\ODM\MongoDB\DocumentManager|\Doctrine\ODM\CouchDB\DocumentManager + * @return ObjectManager */ - abstract protected function getManager(); + abstract protected function getManager(): ObjectManager; } diff --git a/src/PaginatorTrait.php b/src/PaginatorTrait.php index 96ae8c2..bab85d7 100644 --- a/src/PaginatorTrait.php +++ b/src/PaginatorTrait.php @@ -29,7 +29,7 @@ trait PaginatorTrait * * @return Paginator */ - protected function getPaginator(AdapterInterface $adapter, $itemsPerPage) + protected function getPaginator(AdapterInterface $adapter, int $itemsPerPage): Paginator { $paginator = new Paginator($adapter); $paginator->setItemCountPerPage(max(-1, (int) $itemsPerPage)); diff --git a/src/Repository.php b/src/Repository.php index fc416b9..c6997a8 100644 --- a/src/Repository.php +++ b/src/Repository.php @@ -14,6 +14,7 @@ namespace Jgut\Doctrine\Repository; use Doctrine\Common\Persistence\ObjectRepository; +use Zend\Paginator\Paginator; /** * Repository interface. @@ -25,14 +26,14 @@ interface Repository extends ObjectRepository * * @return bool */ - public function isAutoFlush(); + public function isAutoFlush(): bool; /** * Set automatic manager flushing. * * @param bool $autoFlush */ - public function setAutoFlush($autoFlush = false); + public function setAutoFlush(bool $autoFlush = false); /** * Manager flush. @@ -63,15 +64,15 @@ public function restoreEventSubscribers(); * * @param string $event */ - public function disableEventListeners($event); + public function disableEventListeners(string $event); /** * Disable listener for an event. * * @param string $event - * @param \Doctrine\Common\EventSubscriber|string $subscriberClass + * @param string|\Doctrine\Common\EventSubscriber $subscriberClass */ - public function disableEventListener($event, $subscriberClass); + public function disableEventListener(string $event, $subscriberClass); /** * Restore all disabled listeners. @@ -83,7 +84,14 @@ public function restoreAllEventListeners(); * * @param string $event */ - public function restoreEventListeners($event); + public function restoreEventListeners(string $event); + + /** + * Get registered events. + * + * @return array + */ + public function getRegisteredEvents(): array; /** * Return paginated elements filtered by criteria. @@ -92,18 +100,18 @@ public function restoreEventListeners($event); * @param array $orderBy * @param int $itemsPerPage * - * @return \Zend\Paginator\Paginator + * @return Paginator */ - public function findPaginatedBy($criteria, array $orderBy = [], $itemsPerPage = 10); + public function findPaginatedBy($criteria, array $orderBy = [], int $itemsPerPage = 10): Paginator; /** * Find one object by a set of criteria or create a new one. * - * @param array|\Doctrine\ORM\QueryBuilder|\Doctrine\ODM\MongoDB\Query\Builder $criteria + * @param array $criteria * * @return \stdClass */ - public function findOneByOrGetNew($criteria); + public function findOneByOrGetNew(array $criteria); /** * Get a new managed object instance. @@ -118,14 +126,14 @@ public function getNew(); * @param \stdClass|\stdClass[] $objects * @param bool $flush */ - public function add($objects, $flush = false); + public function add($objects, bool $flush = false); /** * Remove all objects. * * @param bool $flush */ - public function removeAll($flush = false); + public function removeAll(bool $flush = false); /** * Remove object filtered by a set of criteria. @@ -133,7 +141,7 @@ public function removeAll($flush = false); * @param array $criteria * @param bool $flush */ - public function removeBy(array $criteria, $flush = false); + public function removeBy(array $criteria, bool $flush = false); /** * Remove first object filtered by a set of criteria. @@ -141,7 +149,7 @@ public function removeBy(array $criteria, $flush = false); * @param array $criteria * @param bool $flush */ - public function removeOneBy(array $criteria, $flush = false); + public function removeOneBy(array $criteria, bool $flush = false); /** * Remove objects. @@ -149,21 +157,21 @@ public function removeOneBy(array $criteria, $flush = false); * @param \stdClass|\stdClass[]|string|int $objects * @param bool $flush */ - public function remove($objects, $flush = false); + public function remove($objects, bool $flush = false); /** * Get all objects count. * * @return int */ - public function countAll(); + public function countAll(): int; /** * Get object count filtered by a set of criteria. * - * @param array|\Doctrine\ORM\QueryBuilder $criteria + * @param mixed $criteria * * @return int */ - public function countBy($criteria); + public function countBy($criteria): int; } diff --git a/src/RepositoryTrait.php b/src/RepositoryTrait.php index 7bf2a79..4f77fdd 100644 --- a/src/RepositoryTrait.php +++ b/src/RepositoryTrait.php @@ -13,6 +13,8 @@ namespace Jgut\Doctrine\Repository; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; +use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\Util\Inflector; /** @@ -27,7 +29,7 @@ trait RepositoryTrait * * @return bool */ - public function isAutoFlush() + public function isAutoFlush(): bool { return $this->autoFlush; } @@ -37,7 +39,7 @@ public function isAutoFlush() * * @param bool $autoFlush */ - public function setAutoFlush($autoFlush = true) + public function setAutoFlush(bool $autoFlush = true) { $this->autoFlush = $autoFlush === true; } @@ -53,11 +55,11 @@ public function flush() /** * Find one object by a set of criteria or create a new one. * - * @param array|\Doctrine\ORM\QueryBuilder|\Doctrine\ODM\MongoDB\Query\Builder $criteria + * @param array $criteria * - * @return \stdClass + * @return object */ - public function findOneByOrGetNew($criteria) + public function findOneByOrGetNew(array $criteria) { $object = $this->findOneBy($criteria); @@ -71,7 +73,7 @@ public function findOneByOrGetNew($criteria) /** * Get a new managed object instance. * - * @return \stdClass + * @return object */ public function getNew() { @@ -88,7 +90,7 @@ public function getNew() * * @throws \InvalidArgumentException */ - public function add($objects, $flush = false) + public function add($objects, bool $flush = false) { if (!is_array($objects)) { $objects = [$objects]; @@ -114,7 +116,7 @@ public function add($objects, $flush = false) * * @param bool $flush */ - public function removeAll($flush = false) + public function removeAll(bool $flush = false) { $manager = $this->getManager(); @@ -133,7 +135,7 @@ public function removeAll($flush = false) * @param array $criteria * @param bool $flush */ - public function removeBy(array $criteria, $flush = false) + public function removeBy(array $criteria, bool $flush = false) { $manager = $this->getManager(); @@ -152,7 +154,7 @@ public function removeBy(array $criteria, $flush = false) * @param array $criteria * @param bool $flush */ - public function removeOneBy(array $criteria, $flush = false) + public function removeOneBy(array $criteria, bool $flush = false) { $object = $this->findOneBy($criteria); @@ -170,12 +172,12 @@ public function removeOneBy(array $criteria, $flush = false) /** * Remove objects. * - * @param \stdClass|\stdClass[]|string|int $objects - * @param bool $flush + * @param object|object[]|string|int $objects + * @param bool $flush * * @throws \InvalidArgumentException */ - public function remove($objects, $flush = false) + public function remove($objects, bool $flush = false) { $manager = $this->getManager(); @@ -207,7 +209,7 @@ public function remove($objects, $flush = false) * * @return int */ - public function countAll() + public function countAll(): int { return $this->countBy([]); } @@ -215,11 +217,11 @@ public function countAll() /** * Get object count filtered by a set of criteria. * - * @param array|\Doctrine\ORM\QueryBuilder|\Doctrine\ODM\MongoDB\Query\Builder $criteria + * @param mixed $criteria * * @return int */ - abstract public function countBy($criteria); + abstract public function countBy($criteria): int; /** * Adds support for magic finders and removers. @@ -229,9 +231,9 @@ abstract public function countBy($criteria); * * @throws \BadMethodCallException * - * @return array|object + * @return mixed */ - public function __call($method, $arguments) + public function __call(string $method, array $arguments) { static $supportedMethods = ['findBy', 'findOneBy', 'findPaginatedBy', 'removeBy', 'removeOneBy']; @@ -268,9 +270,9 @@ public function __call($method, $arguments) * * @throws \BadMethodCallException * - * @return array|object + * @return mixed */ - protected function callSupportedMethod($method, $fieldName, array $arguments) + protected function callSupportedMethod(string $method, string $fieldName, array $arguments) { $classMetadata = $this->getClassMetadata(); @@ -300,27 +302,29 @@ protected function callSupportedMethod($method, $fieldName, array $arguments) * * @return bool */ - protected function canBeManaged($object) + protected function canBeManaged($object): bool { return is_object($object) && is_a($object, $this->getClassName()); } /** * Get Class name. + * + * @return string */ - abstract public function getClassName(); + abstract public function getClassName(): string; /** * Get object manager. * - * @return \Doctrine\ORM\EntityManager|\Doctrine\ODM\MongoDB\DocumentManager|\Doctrine\ODM\CouchDB\DocumentManager + * @return ObjectManager */ - abstract protected function getManager(); + abstract protected function getManager(): ObjectManager; /** * Get class metadata. * - * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata + * @return ClassMetadata */ - abstract protected function getClassMetadata(); + abstract protected function getClassMetadata(): ClassMetadata; } diff --git a/tests/Repository/Stubs/BlankEventStub.php b/tests/Repository/Stubs/BlankEventStub.php index f611593..d3eecda 100644 --- a/tests/Repository/Stubs/BlankEventStub.php +++ b/tests/Repository/Stubs/BlankEventStub.php @@ -20,7 +20,10 @@ */ class BlankEventStub implements EventSubscriber { - public function getSubscribedEvents() + /** + * {@inheritdoc} + */ + public function getSubscribedEvents(): array { return []; } diff --git a/tests/Repository/Stubs/EventStub.php b/tests/Repository/Stubs/EventStub.php index 30e2391..3654811 100644 --- a/tests/Repository/Stubs/EventStub.php +++ b/tests/Repository/Stubs/EventStub.php @@ -20,7 +20,10 @@ */ class EventStub implements EventSubscriber { - public function getSubscribedEvents() + /** + * {@inheritdoc} + */ + public function getSubscribedEvents(): array { return [ 'prePersist', diff --git a/tests/Repository/Stubs/PaginatorTraitStub.php b/tests/Repository/Stubs/PaginatorTraitStub.php index 5b3a4e6..ec87f08 100644 --- a/tests/Repository/Stubs/PaginatorTraitStub.php +++ b/tests/Repository/Stubs/PaginatorTraitStub.php @@ -15,6 +15,7 @@ use Jgut\Doctrine\Repository\PaginatorTrait; use Zend\Paginator\Adapter\ArrayAdapter; +use Zend\Paginator\Paginator; /** * Paginator trait stub. @@ -29,9 +30,9 @@ class PaginatorTraitStub * @param array $items * @param int $limit * - * @return \Zend\Paginator\Paginator + * @return Paginator */ - public function getPaginated(array $items, $limit) + public function getPaginated(array $items, $limit): Paginator { return $this->getPaginator(new ArrayAdapter($items), $limit); } diff --git a/tests/Repository/Stubs/RepositoryStub.php b/tests/Repository/Stubs/RepositoryStub.php index cf26b9b..76a35aa 100644 --- a/tests/Repository/Stubs/RepositoryStub.php +++ b/tests/Repository/Stubs/RepositoryStub.php @@ -13,10 +13,12 @@ namespace Jgut\Doctrine\Repository\Tests\Stubs; +use Doctrine\Common\Persistence\Mapping\ClassMetadata; use Doctrine\ORM\EntityManager; use Jgut\Doctrine\Repository\EventsTrait; use Jgut\Doctrine\Repository\Repository; use Jgut\Doctrine\Repository\RepositoryTrait; +use Zend\Paginator\Paginator; /** * Repository stub. @@ -51,7 +53,7 @@ public function __construct(EntityManager $entityManager, array $entities = []) /** * {@inheritdoc} */ - protected function getManager() + protected function getManager(): EntityManager { return $this->entityManager; } @@ -59,7 +61,7 @@ protected function getManager() /** * {@inheritdoc} */ - public function getClassName() + public function getClassName(): string { return EntityStub::class; } @@ -67,14 +69,17 @@ public function getClassName() /** * {@inheritdoc} */ - public function countBy($criteria) + public function countBy($criteria): int { return count($this->entities); } - public function findPaginatedBy($criteria, array $orderBy = null, $itemsPerPage = 10) + /** + * {@inheritdoc} + */ + public function findPaginatedBy($criteria, array $orderBy = null, int $itemsPerPage = 10): Paginator { - // TODO: Implement findPaginatedBy() method. + // Implementation not needed } /** @@ -92,7 +97,7 @@ public function find($id) /** * {@inheritdoc} */ - public function findAll() + public function findAll(): array { return $this->entities; } @@ -118,7 +123,7 @@ public function findOneBy(array $criteria) * * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata */ - protected function getClassMetadata() + protected function getClassMetadata(): ClassMetadata { return new \Doctrine\ORM\Mapping\ClassMetadataInfo('EntityDocumentStub'); }