From a679117736014156006e4ee40794cb324f849304 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:07:48 +0200 Subject: [PATCH 01/18] Install rector --- composer-dependency-analyser.php | 1 + composer.json | 1 + composer.lock | 61 +++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index 03c391b99..e9fd6f437 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -37,6 +37,7 @@ $config 'phpstan/phpstan-symfony', 'psr/http-client', 'psr/http-factory', + 'rector/rector', 'scheb/2fa-trusted-device', 'shipmonk/composer-dependency-analyser', 'symfony/asset', diff --git a/composer.json b/composer.json index 45cdaf1cc..fd95d1d4a 100644 --- a/composer.json +++ b/composer.json @@ -173,6 +173,7 @@ "phpstan/phpstan-phpunit": "^1.4.2", "phpstan/phpstan-symfony": "^1.4.13", "phpunit/phpunit": "^9.6.22", + "rector/rector": "^1.2", "shipmonk/composer-dependency-analyser": "^1.8.2", "symfony/css-selector": "^5.4.45", "symfony/debug-bundle": "^5.4.45", diff --git a/composer.lock b/composer.lock index 880448c57..b648b40c5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "df71f834528625c49553a128ca93e4aa", + "content-hash": "00b8f95df6ec0572c06ad6f34847405c", "packages": [ { "name": "babdev/pagerfanta-bundle", @@ -17856,6 +17856,65 @@ ], "time": "2024-06-11T12:45:25+00:00" }, + { + "name": "rector/rector", + "version": "1.2.10", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.12.5" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.2.10" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-11-08T13:59:10+00:00" + }, { "name": "sebastian/cli-parser", "version": "1.0.2", From 84eb99c59b30dde665ab71be9e2ead59f014aec9 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:08:13 +0200 Subject: [PATCH 02/18] Initial Rector fixes with basic configuration --- app/AppKernel.php | 97 ++++++++++++------- rector.php | 16 +++ .../AuthenticatorProvider.php | 6 +- tests/WallabagTestCase.php | 3 +- tests/bootstrap.php | 10 +- 5 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 rector.php diff --git a/app/AppKernel.php b/app/AppKernel.php index e60dc2039..7beb05630 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -1,8 +1,39 @@ getEnvironment(), ['dev', 'test'], true)) { - $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); - $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); - $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(); + $bundles[] = new DebugBundle(); + $bundles[] = new WebProfilerBundle(); + $bundles[] = new DoctrineFixturesBundle(); if ('test' === $this->getEnvironment()) { - $bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle(); + $bundles[] = new DAMADoctrineTestBundle(); } if ('dev' === $this->getEnvironment()) { - $bundles[] = new Symfony\Bundle\MakerBundle\MakerBundle(); - $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle(); + $bundles[] = new MakerBundle(); + $bundles[] = new WebServerBundle(); } } @@ -69,13 +100,13 @@ class AppKernel extends Kernel { $loader->load($this->getProjectDir() . '/app/config/config_' . $this->getEnvironment() . '.yml'); - $loader->load(function (ContainerBuilder $container) { + $loader->load(function (ContainerBuilder $container): void { // $container->setParameter('container.autowiring.strict_mode', true); // $container->setParameter('container.dumper.inline_class_loader', true); $container->addObjectResource($this); }); - $loader->load(function (ContainerBuilder $container) { + $loader->load(function (ContainerBuilder $container): void { $this->processDatabaseParameters($container); $this->defineRedisUrlEnvVar($container); $this->defineRabbitMqUrlEnvVar($container); diff --git a/rector.php b/rector.php new file mode 100644 index 000000000..a0dbaf25a --- /dev/null +++ b/rector.php @@ -0,0 +1,16 @@ +withPaths([ + __DIR__ . '/app', + __DIR__ . '/fixtures', + __DIR__ . '/src', + __DIR__ . '/tests', + __DIR__ . '/web', + ]) + ->withImportNames(importShortClasses: false) + ->withTypeCoverageLevel(0); diff --git a/src/ExpressionLanguage/AuthenticatorProvider.php b/src/ExpressionLanguage/AuthenticatorProvider.php index 25c748d3e..72487ad70 100644 --- a/src/ExpressionLanguage/AuthenticatorProvider.php +++ b/src/ExpressionLanguage/AuthenticatorProvider.php @@ -31,7 +31,7 @@ class AuthenticatorProvider implements ExpressionFunctionProviderInterface { return new ExpressionFunction( 'request_html', - function () { + function (): void { throw new \Exception('Not supported'); }, function (array $arguments, $uri) { @@ -44,7 +44,7 @@ class AuthenticatorProvider implements ExpressionFunctionProviderInterface { return new ExpressionFunction( 'preg_match', - function () { + function (): void { throw new \Exception('Not supported'); }, function (array $arguments, $pattern, $html) { @@ -63,7 +63,7 @@ class AuthenticatorProvider implements ExpressionFunctionProviderInterface { return new ExpressionFunction( 'xpath', - function () { + function (): void { throw new \Exception('Not supported'); }, function (array $arguments, $xpathQuery, $html) { diff --git a/tests/WallabagTestCase.php b/tests/WallabagTestCase.php index 8f70a115e..eed714980 100644 --- a/tests/WallabagTestCase.php +++ b/tests/WallabagTestCase.php @@ -3,6 +3,7 @@ namespace Tests\Wallabag; use Doctrine\ORM\EntityManagerInterface; +use Predis\Client; use Symfony\Bundle\FrameworkBundle\KernelBrowser; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; @@ -118,7 +119,7 @@ abstract class WallabagTestCase extends WebTestCase protected function checkRedis() { try { - $this->client->getContainer()->get(\Predis\Client::class)->connect(); + $this->client->getContainer()->get(Client::class)->connect(); } catch (\Exception $e) { $this->markTestSkipped('Redis is not installed/activated'); } diff --git a/tests/bootstrap.php b/tests/bootstrap.php index fad77b3bb..370282e93 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -15,7 +15,7 @@ if (!isPartialRun()) { '--force', '--env=test', '--no-debug', - ]))->run(function ($type, $buffer) { + ]))->run(function ($type, $buffer): void { echo $buffer; }); @@ -25,7 +25,7 @@ if (!isPartialRun()) { 'doctrine:database:create', '--env=test', '--no-debug', - ]))->mustRun(function ($type, $buffer) { + ]))->mustRun(function ($type, $buffer): void { echo $buffer; }); @@ -37,7 +37,7 @@ if (!isPartialRun()) { '--env=test', '--no-debug', '-vv', - ]))->mustRun(function ($type, $buffer) { + ]))->mustRun(function ($type, $buffer): void { echo $buffer; }); @@ -48,7 +48,7 @@ if (!isPartialRun()) { '--no-interaction', '--env=test', '-v', - ]))->mustRun(function ($type, $buffer) { + ]))->mustRun(function ($type, $buffer): void { echo $buffer; }); } @@ -60,6 +60,6 @@ if (!isPartialRun()) { '--no-interaction', '--env=test', '--no-debug', -]))->mustRun(function ($type, $buffer) { +]))->mustRun(function ($type, $buffer): void { echo $buffer; }); From 99a49bfc9699703868d44cad7c1e7726d62fa1a8 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:09:47 +0200 Subject: [PATCH 03/18] Add Doctrine attributes set --- rector.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rector.php b/rector.php index a0dbaf25a..46b1c004d 100644 --- a/rector.php +++ b/rector.php @@ -13,4 +13,5 @@ return RectorConfig::configure() __DIR__ . '/web', ]) ->withImportNames(importShortClasses: false) + ->withAttributesSets(doctrine: true) ->withTypeCoverageLevel(0); From 745fef44f4e4818009ac1d51d48a9a1c433fda2c Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:12:32 +0200 Subject: [PATCH 04/18] Modernize to PHP 5.5 --- rector.php | 1 + src/ParamConverter/UsernameFeedTokenConverter.php | 2 +- tests/Event/Subscriber/TablePrefixSubscriberTest.php | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/rector.php b/rector.php index 46b1c004d..d0654af14 100644 --- a/rector.php +++ b/rector.php @@ -14,4 +14,5 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) + ->withPhpSets(php55: true) ->withTypeCoverageLevel(0); diff --git a/src/ParamConverter/UsernameFeedTokenConverter.php b/src/ParamConverter/UsernameFeedTokenConverter.php index 67807efb9..6f35027ad 100644 --- a/src/ParamConverter/UsernameFeedTokenConverter.php +++ b/src/ParamConverter/UsernameFeedTokenConverter.php @@ -50,7 +50,7 @@ class UsernameFeedTokenConverter implements ParamConverterInterface $em = $this->registry->getManagerForClass($configuration->getClass()); // Check, if class name is what we need - if (null !== $em && 'Wallabag\Entity\User' !== $em->getClassMetadata($configuration->getClass())->getName()) { + if (null !== $em && User::class !== $em->getClassMetadata($configuration->getClass())->getName()) { return false; } diff --git a/tests/Event/Subscriber/TablePrefixSubscriberTest.php b/tests/Event/Subscriber/TablePrefixSubscriberTest.php index fa0c37e38..2872fb23f 100644 --- a/tests/Event/Subscriber/TablePrefixSubscriberTest.php +++ b/tests/Event/Subscriber/TablePrefixSubscriberTest.php @@ -11,6 +11,7 @@ use Doctrine\ORM\Event\LoadClassMetadataEventArgs; use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\DefaultQuoteStrategy; use PHPUnit\Framework\TestCase; +use Wallabag\Entity\Entry; use Wallabag\Entity\User; use Wallabag\Event\Subscriber\TablePrefixSubscriber; @@ -94,7 +95,7 @@ class TablePrefixSubscriberTest extends TestCase $subscriber = new TablePrefixSubscriber('yo_'); - $metaClass = new ClassMetadata('Wallabag\Entity\Entry'); + $metaClass = new ClassMetadata(Entry::class); $metaClass->setPrimaryTable(['name' => 'entry']); $metaClass->mapManyToMany([ 'fieldName' => 'tags', From 241cddc8996db89de01d5a1a6922d5a14ab65fab Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:14:32 +0200 Subject: [PATCH 05/18] Modernize to PHP 7.0 --- rector.php | 2 +- src/Controller/EntryController.php | 2 +- src/Controller/ExportController.php | 4 ++-- src/Controller/UserController.php | 2 +- src/Helper/ContentProxy.php | 2 +- src/SiteConfig/ArraySiteConfigBuilder.php | 6 +----- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/rector.php b/rector.php index d0654af14..be2a4b6d8 100644 --- a/rector.php +++ b/rector.php @@ -14,5 +14,5 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) - ->withPhpSets(php55: true) + ->withPhpSets(php70: true) ->withTypeCoverageLevel(0); diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index 7f184d2b5..e1ee1212c 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -626,7 +626,7 @@ class EntryController extends AbstractController private function showEntries($type, Request $request, $page) { $searchTerm = (isset($request->query->all('search_entry')['term']) ? trim($request->query->all('search_entry')['term']) : ''); - $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : ''); + $currentRoute = $request->query->get('currentRoute') ?? ''; $currentEntryId = $request->attributes->getInt('id'); $formOptions = []; diff --git a/src/Controller/ExportController.php b/src/Controller/ExportController.php index ce622a956..64f75c3a2 100644 --- a/src/Controller/ExportController.php +++ b/src/Controller/ExportController.php @@ -77,8 +77,8 @@ class ExportController extends AbstractController $title = 'Tag ' . $tag->getLabel(); } elseif ('search' === $category) { - $searchTerm = (isset($request->query->all('search_entry')['term']) ? $request->query->all('search_entry')['term'] : ''); - $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : ''); + $searchTerm = $request->query->all('search_entry')['term'] ?? ''; + $currentRoute = $request->query->get('currentRoute') ?? ''; $entries = $entryRepository->getBuilderForSearchByUser( $this->getUser()->getId(), diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 5be29a6cc..58e069926 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -161,7 +161,7 @@ class UserController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $searchTerm = (isset($request->query->all('search_user')['term']) ? $request->query->all('search_user')['term'] : ''); + $searchTerm = $request->query->all('search_user')['term'] ?? ''; $qb = $userRepository->getQueryBuilderForSearch($searchTerm); } diff --git a/src/Helper/ContentProxy.php b/src/Helper/ContentProxy.php index bfdc9f163..aefa8eeb0 100644 --- a/src/Helper/ContentProxy.php +++ b/src/Helper/ContentProxy.php @@ -59,7 +59,7 @@ class ContentProxy $fetchedContent['title'] = $this->sanitizeContentTitle( $fetchedContent['title'], - isset($fetchedContent['headers']['content-type']) ? $fetchedContent['headers']['content-type'] : '' + $fetchedContent['headers']['content-type'] ?? '' ); // when content is imported, we have information in $content diff --git a/src/SiteConfig/ArraySiteConfigBuilder.php b/src/SiteConfig/ArraySiteConfigBuilder.php index d150650c4..188ca42c9 100644 --- a/src/SiteConfig/ArraySiteConfigBuilder.php +++ b/src/SiteConfig/ArraySiteConfigBuilder.php @@ -25,10 +25,6 @@ class ArraySiteConfigBuilder implements SiteConfigBuilder $host = substr($host, 4); } - if (isset($this->configs[$host])) { - return $this->configs[$host]; - } - - return false; + return $this->configs[$host] ?? false; } } From f8c8bb7d9389bd734381f9e0d4f89cd0647483a2 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:15:06 +0200 Subject: [PATCH 06/18] Modernize to PHP 7.1 --- rector.php | 2 +- src/SiteConfig/GrabySiteConfigBuilder.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rector.php b/rector.php index be2a4b6d8..9c3ad55d8 100644 --- a/rector.php +++ b/rector.php @@ -14,5 +14,5 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) - ->withPhpSets(php70: true) + ->withPhpSets(php71: true) ->withTypeCoverageLevel(0); diff --git a/src/SiteConfig/GrabySiteConfigBuilder.php b/src/SiteConfig/GrabySiteConfigBuilder.php index dfe433408..3c3a18056 100644 --- a/src/SiteConfig/GrabySiteConfigBuilder.php +++ b/src/SiteConfig/GrabySiteConfigBuilder.php @@ -119,7 +119,7 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder continue; } - list($fieldName, $fieldValue) = explode('=', $extraField, 2); + [$fieldName, $fieldValue] = explode('=', $extraField, 2); $extraFields[$fieldName] = $fieldValue; } From ce8ed589d58b92aff40d6e741444982630b1005b Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:16:21 +0200 Subject: [PATCH 07/18] Modernize to PHP 7.3 --- rector.php | 2 +- src/Operator/PHP/Matches.php | 2 +- src/Operator/PHP/NotMatches.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rector.php b/rector.php index 9c3ad55d8..831914c78 100644 --- a/rector.php +++ b/rector.php @@ -14,5 +14,5 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) - ->withPhpSets(php71: true) + ->withPhpSets(php73: true) ->withTypeCoverageLevel(0); diff --git a/src/Operator/PHP/Matches.php b/src/Operator/PHP/Matches.php index 7d727bcae..0d3f2bfab 100644 --- a/src/Operator/PHP/Matches.php +++ b/src/Operator/PHP/Matches.php @@ -20,6 +20,6 @@ class Matches return false; } - return false !== stripos($subject, $pattern); + return false !== stripos($subject, (string) $pattern); } } diff --git a/src/Operator/PHP/NotMatches.php b/src/Operator/PHP/NotMatches.php index 9942a985f..49556815c 100644 --- a/src/Operator/PHP/NotMatches.php +++ b/src/Operator/PHP/NotMatches.php @@ -20,6 +20,6 @@ class NotMatches return true; } - return false === stripos($subject, $pattern); + return false === stripos($subject, (string) $pattern); } } From 4168727f36b88a58e217e0ab7f0eb9c87a1dbb29 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:20:44 +0200 Subject: [PATCH 08/18] Modernize to PHP 7.4 --- rector.php | 2 +- src/Command/Import/ImportCommand.php | 4 +--- src/Controller/Api/EntryRestController.php | 4 +--- src/Controller/ConfigController.php | 4 +--- src/Doctrine/WallabagMigration.php | 4 +--- src/ExpressionLanguage/AuthenticatorProvider.php | 4 +--- src/Form/Type/Api/ClientType.php | 8 ++------ src/Helper/DownloadImages.php | 4 +--- src/Import/HtmlImport.php | 12 +++++------- src/Import/PocketHtmlImport.php | 12 +++++------- src/Repository/EntryRepository.php | 4 +--- tests/Controller/Api/TagRestControllerTest.php | 4 +--- tests/Import/ChromeImportTest.php | 4 +--- tests/Import/FirefoxImportTest.php | 4 +--- tests/Import/InstapaperImportTest.php | 4 +--- tests/Import/PocketHtmlImportTest.php | 4 +--- tests/Import/PocketImportTest.php | 8 ++------ tests/Import/ReadabilityImportTest.php | 4 +--- tests/Import/ShaarliImportTest.php | 4 +--- tests/Import/WallabagV1ImportTest.php | 4 +--- tests/Import/WallabagV2ImportTest.php | 4 +--- 21 files changed, 31 insertions(+), 75 deletions(-) diff --git a/rector.php b/rector.php index 831914c78..e6e48dac6 100644 --- a/rector.php +++ b/rector.php @@ -14,5 +14,5 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) - ->withPhpSets(php73: true) + ->withPhpSets(php74: true) ->withTypeCoverageLevel(0); diff --git a/src/Command/Import/ImportCommand.php b/src/Command/Import/ImportCommand.php index 0005797a5..2d29979ae 100644 --- a/src/Command/Import/ImportCommand.php +++ b/src/Command/Import/ImportCommand.php @@ -107,9 +107,7 @@ class ImportCommand extends Command // Turning off doctrine default logs queries for saving memory $middlewares = $this->entityManager->getConnection()->getConfiguration()->getMiddlewares(); - $middlewaresWithoutLogging = array_filter($middlewares, function (Middleware $middleware) { - return !$middleware instanceof LoggingMiddleware; - }); + $middlewaresWithoutLogging = array_filter($middlewares, fn (Middleware $middleware) => !$middleware instanceof LoggingMiddleware); $this->entityManager->getConnection()->getConfiguration()->setMiddlewares($middlewaresWithoutLogging); if ($input->getOption('useUserId')) { diff --git a/src/Controller/Api/EntryRestController.php b/src/Controller/Api/EntryRestController.php index 15b6d1c0e..5406f5c75 100644 --- a/src/Controller/Api/EntryRestController.php +++ b/src/Controller/Api/EntryRestController.php @@ -132,9 +132,7 @@ class EntryRestController extends WallabagRestController } if (false === $returnId) { - $results = array_map(function ($v) { - return null !== $v; - }, $results); + $results = array_map(fn ($v) => null !== $v, $results); } $results = $this->replaceUrlHashes($results, $urlHashMap); diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index 792cc2494..677603818 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -367,9 +367,7 @@ class ConfigController extends AbstractController $backupCodes = (new BackupCodes())->toArray(); $backupCodesHashed = array_map( - function ($backupCode) { - return password_hash($backupCode, \PASSWORD_DEFAULT); - }, + fn ($backupCode) => password_hash($backupCode, \PASSWORD_DEFAULT), $backupCodes ); diff --git a/src/Doctrine/WallabagMigration.php b/src/Doctrine/WallabagMigration.php index 60d0a026c..4fcb445e6 100644 --- a/src/Doctrine/WallabagMigration.php +++ b/src/Doctrine/WallabagMigration.php @@ -89,9 +89,7 @@ abstract class WallabagMigration extends AbstractMigration */ protected function generateIdentifierName(array $columnNames, string $prefix = ''): string { - $hash = implode('', array_map(static function ($column): string { - return dechex(crc32($column)); - }, $columnNames)); + $hash = implode('', array_map(static fn ($column): string => dechex(crc32($column)), $columnNames)); return strtoupper(substr($prefix . '_' . $hash, 0, $this->platform->getMaxIdentifierLength())); } diff --git a/src/ExpressionLanguage/AuthenticatorProvider.php b/src/ExpressionLanguage/AuthenticatorProvider.php index 72487ad70..3c76b72fc 100644 --- a/src/ExpressionLanguage/AuthenticatorProvider.php +++ b/src/ExpressionLanguage/AuthenticatorProvider.php @@ -34,9 +34,7 @@ class AuthenticatorProvider implements ExpressionFunctionProviderInterface function (): void { throw new \Exception('Not supported'); }, - function (array $arguments, $uri) { - return $this->requestHtmlFunctionClient->request('GET', $uri)->getContent(); - } + fn (array $arguments, $uri) => $this->requestHtmlFunctionClient->request('GET', $uri)->getContent() ); } diff --git a/src/Form/Type/Api/ClientType.php b/src/Form/Type/Api/ClientType.php index 8986a04ff..accb8ee2d 100644 --- a/src/Form/Type/Api/ClientType.php +++ b/src/Form/Type/Api/ClientType.php @@ -28,12 +28,8 @@ class ClientType extends AbstractType $builder->get('redirect_uris') ->addModelTransformer(new CallbackTransformer( - function ($originalUri) { - return $originalUri; - }, - function ($submittedUri) { - return [$submittedUri]; - } + fn ($originalUri) => $originalUri, + fn ($submittedUri) => [$submittedUri] )) ; } diff --git a/src/Helper/DownloadImages.php b/src/Helper/DownloadImages.php index d7423d364..cb808f537 100644 --- a/src/Helper/DownloadImages.php +++ b/src/Helper/DownloadImages.php @@ -294,9 +294,7 @@ class DownloadImages preg_match_all($pattern, $srcsetAttribute, $matches); $srcset = \call_user_func_array('array_merge', $matches); - $srcsetUrls = array_map(function ($src) { - return trim(explode(' ', $src, 2)[0]); - }, $srcset); + $srcsetUrls = array_map(fn ($src) => trim(explode(' ', $src, 2)[0]), $srcset); $urls = array_merge($srcsetUrls, $urls); } diff --git a/src/Import/HtmlImport.php b/src/Import/HtmlImport.php index f54941ec2..607fd5da9 100644 --- a/src/Import/HtmlImport.php +++ b/src/Import/HtmlImport.php @@ -40,13 +40,11 @@ abstract class HtmlImport extends AbstractImport return false; } - $entries = $hrefs->each(function (Crawler $node) { - return [ - 'url' => $node->attr('href'), - 'tags' => $node->attr('tags'), - 'created_at' => $node->attr('add_date'), - ]; - }); + $entries = $hrefs->each(fn (Crawler $node) => [ + 'url' => $node->attr('href'), + 'tags' => $node->attr('tags'), + 'created_at' => $node->attr('add_date'), + ]); if ($this->producer) { $this->parseEntriesForProducer($entries); diff --git a/src/Import/PocketHtmlImport.php b/src/Import/PocketHtmlImport.php index b1c7e3edb..08c8da1e2 100644 --- a/src/Import/PocketHtmlImport.php +++ b/src/Import/PocketHtmlImport.php @@ -56,13 +56,11 @@ class PocketHtmlImport extends HtmlImport return false; } - $entries = $hrefs->each(function (Crawler $node) { - return [ - 'url' => $node->attr('href'), - 'tags' => $node->attr('tags'), - 'created_at' => $node->attr('time_added'), - ]; - }); + $entries = $hrefs->each(fn (Crawler $node) => [ + 'url' => $node->attr('href'), + 'tags' => $node->attr('tags'), + 'created_at' => $node->attr('time_added'), + ]); if ($this->producer) { $this->parseEntriesForProducer($entries); diff --git a/src/Repository/EntryRepository.php b/src/Repository/EntryRepository.php index 83b3c77a4..ded1e2d44 100644 --- a/src/Repository/EntryRepository.php +++ b/src/Repository/EntryRepository.php @@ -289,9 +289,7 @@ class EntryRepository extends ServiceEntityRepository if ('metadata' === $detail) { $fieldNames = $this->getClassMetadata()->getFieldNames(); - $fields = array_filter($fieldNames, function ($k) { - return 'content' !== $k; - }); + $fields = array_filter($fieldNames, fn ($k) => 'content' !== $k); $qb->select(\sprintf('partial e.{%s}', implode(',', $fields))); } diff --git a/tests/Controller/Api/TagRestControllerTest.php b/tests/Controller/Api/TagRestControllerTest.php index 71115f4a3..927a2a236 100644 --- a/tests/Controller/Api/TagRestControllerTest.php +++ b/tests/Controller/Api/TagRestControllerTest.php @@ -23,9 +23,7 @@ class TagRestControllerTest extends WallabagApiTestCase $this->assertArrayHasKey('label', $content[0]); $this->assertArrayHasKey('nbEntries', $content[0]); - $tagLabels = array_map(function ($i) { - return $i['label']; - }, $content); + $tagLabels = array_map(fn ($i) => $i['label'], $content); $this->assertNotContains($this->otherUserTagLabel, $tagLabels, 'There is a possible tag leak'); } diff --git a/tests/Import/ChromeImportTest.php b/tests/Import/ChromeImportTest.php index 35ab0aa67..558bfdec9 100644 --- a/tests/Import/ChromeImportTest.php +++ b/tests/Import/ChromeImportTest.php @@ -95,9 +95,7 @@ class ChromeImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $chromeImport->setMarkAsRead(true)->import(); diff --git a/tests/Import/FirefoxImportTest.php b/tests/Import/FirefoxImportTest.php index 7250c412b..5ed6cb550 100644 --- a/tests/Import/FirefoxImportTest.php +++ b/tests/Import/FirefoxImportTest.php @@ -95,9 +95,7 @@ class FirefoxImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $firefoxImport->setMarkAsRead(true)->import(); diff --git a/tests/Import/InstapaperImportTest.php b/tests/Import/InstapaperImportTest.php index 17a7b4e21..aaba729e4 100644 --- a/tests/Import/InstapaperImportTest.php +++ b/tests/Import/InstapaperImportTest.php @@ -97,9 +97,7 @@ class InstapaperImportTest extends TestCase $this->em ->expects($this->once()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $instapaperImport->setMarkAsRead(true)->import(); diff --git a/tests/Import/PocketHtmlImportTest.php b/tests/Import/PocketHtmlImportTest.php index 0f97a50c0..6bea2b98c 100644 --- a/tests/Import/PocketHtmlImportTest.php +++ b/tests/Import/PocketHtmlImportTest.php @@ -95,9 +95,7 @@ class PocketHtmlImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $pocketHtmlImport ->setMarkAsRead(true) diff --git a/tests/Import/PocketImportTest.php b/tests/Import/PocketImportTest.php index dc0880360..1b8828382 100644 --- a/tests/Import/PocketImportTest.php +++ b/tests/Import/PocketImportTest.php @@ -207,9 +207,7 @@ JSON $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived() && (bool) $persistedEntry->isStarred(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived() && (bool) $persistedEntry->isStarred())); $entry = new Entry($this->user); @@ -299,9 +297,7 @@ JSON $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $entry = new Entry($this->user); diff --git a/tests/Import/ReadabilityImportTest.php b/tests/Import/ReadabilityImportTest.php index 851130bf9..cc7b7d828 100644 --- a/tests/Import/ReadabilityImportTest.php +++ b/tests/Import/ReadabilityImportTest.php @@ -95,9 +95,7 @@ class ReadabilityImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $readabilityImport->setMarkAsRead(true)->import(); diff --git a/tests/Import/ShaarliImportTest.php b/tests/Import/ShaarliImportTest.php index f041e3005..7510a28e6 100644 --- a/tests/Import/ShaarliImportTest.php +++ b/tests/Import/ShaarliImportTest.php @@ -95,9 +95,7 @@ class ShaarliImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $shaarliImport ->setMarkAsRead(true) diff --git a/tests/Import/WallabagV1ImportTest.php b/tests/Import/WallabagV1ImportTest.php index f51a39edf..7b9cbe558 100644 --- a/tests/Import/WallabagV1ImportTest.php +++ b/tests/Import/WallabagV1ImportTest.php @@ -99,9 +99,7 @@ class WallabagV1ImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $wallabagV1Import->setMarkAsRead(true)->import(); diff --git a/tests/Import/WallabagV2ImportTest.php b/tests/Import/WallabagV2ImportTest.php index cfe8e95de..04a772f40 100644 --- a/tests/Import/WallabagV2ImportTest.php +++ b/tests/Import/WallabagV2ImportTest.php @@ -93,9 +93,7 @@ class WallabagV2ImportTest extends TestCase $this->em ->expects($this->any()) ->method('persist') - ->with($this->callback(function ($persistedEntry) { - return (bool) $persistedEntry->isArchived(); - })); + ->with($this->callback(fn ($persistedEntry) => (bool) $persistedEntry->isArchived())); $res = $wallabagV2Import->setMarkAsRead(true)->import(); From 1d5674a230c935858e3eb0649f6b3799397d26a1 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:54:27 +0200 Subject: [PATCH 09/18] Migrate to constructor promoted properties --- fixtures/IgnoreOriginInstanceRuleFixtures.php | 8 +-- fixtures/InternalSettingFixtures.php | 8 +-- fixtures/SiteCredentialFixtures.php | 8 +-- rector.php | 9 +++ src/Command/CleanDownloadedImagesCommand.php | 12 ++-- src/Command/CleanDuplicatesCommand.php | 14 ++--- src/Command/ExportCommand.php | 18 ++---- src/Command/GenerateUrlHashesCommand.php | 14 ++--- src/Command/Import/ImportCommand.php | 62 +++++-------------- src/Command/Import/RedisWorkerCommand.php | 9 +-- src/Command/InstallCommand.php | 27 +++----- src/Command/ListUserCommand.php | 9 +-- src/Command/ReloadEntryCommand.php | 21 +++---- src/Command/ShowUserCommand.php | 8 +-- src/Command/TagAllCommand.php | 15 ++--- src/Command/UpdatePicturesPathCommand.php | 14 ++--- src/Consumer/AbstractConsumer.php | 23 +++---- src/Consumer/RabbitMQConsumerTotalProxy.php | 53 ++++------------ src/Controller/AnnotationController.php | 14 ++--- src/Controller/Api/WallabagRestController.php | 23 +++---- src/Controller/ConfigController.php | 33 +++------- src/Controller/EntryController.php | 29 +++------ src/Controller/FeedController.php | 8 +-- .../IgnoreOriginInstanceRuleController.php | 11 ++-- src/Controller/Import/ChromeController.php | 17 ++--- src/Controller/Import/DeliciousController.php | 11 ++-- src/Controller/Import/ElcuratorController.php | 17 ++--- src/Controller/Import/FirefoxController.php | 17 ++--- src/Controller/Import/ImportController.php | 11 ++-- .../Import/InstapaperController.php | 11 ++-- src/Controller/Import/OmnivoreController.php | 11 ++-- src/Controller/Import/PinboardController.php | 11 ++-- src/Controller/Import/PocketController.php | 17 ++--- .../Import/PocketHtmlController.php | 17 ++--- .../Import/ReadabilityController.php | 11 ++-- src/Controller/Import/ShaarliController.php | 17 ++--- .../Import/WallabagV1Controller.php | 17 ++--- .../Import/WallabagV2Controller.php | 17 ++--- src/Controller/SiteCredentialController.php | 17 ++--- src/Controller/TagController.php | 17 ++--- src/Controller/UserController.php | 11 ++-- src/Doctrine/MigrationFactoryDecorator.php | 17 ++--- src/Event/ConfigUpdatedEvent.php | 8 +-- src/Event/EntryDeletedEvent.php | 8 +-- src/Event/EntrySavedEvent.php | 8 +-- .../AuthenticationFailureListener.php | 11 ++-- src/Event/Listener/CreateConfigListener.php | 32 ++++------ src/Event/Listener/LocaleListener.php | 8 +-- .../Listener/PasswordResettingListener.php | 8 +-- src/Event/Listener/RegistrationListener.php | 17 ++--- src/Event/Listener/UserLocaleListener.php | 8 +-- .../Subscriber/DownloadImagesSubscriber.php | 17 ++--- .../GenerateCustomCSSSubscriber.php | 11 ++-- .../SQLiteCascadeDeleteSubscriber.php | 8 +-- .../Subscriber/SchemaAdapterSubscriber.php | 8 +-- .../AuthenticatorProvider.php | 8 +-- .../StringToListTransformer.php | 11 +--- src/Form/Type/ConfigType.php | 11 ++-- src/Form/Type/EntryFilterType.php | 11 ++-- src/Helper/ContentProxy.php | 33 +++++----- src/Helper/CryptoProxy.php | 9 ++- src/Helper/DownloadImages.php | 15 ++--- src/Helper/EntriesExport.php | 16 ++--- src/Helper/PreparePagerForEntries.php | 8 +-- src/Helper/Redirect.php | 11 ++-- src/Helper/RuleBasedIgnoreOriginProcessor.php | 14 ++--- src/Helper/RuleBasedTagger.php | 17 ++--- src/Helper/TagsAssigner.php | 11 +--- src/HttpClient/Authenticator.php | 14 ++--- src/HttpClient/WallabagClient.php | 17 ++--- src/Import/AbstractImport.php | 23 +++---- src/Import/WallabagV1Import.php | 17 ++--- src/Mailer/AuthCodeMailer.php | 55 +++------------- .../UsernameFeedTokenConverter.php | 8 +-- src/Redis/Producer.php | 8 +-- src/Repository/SiteCredentialRepository.php | 10 ++- src/Security/Voter/AdminVoter.php | 8 +-- .../Voter/IgnoreOriginInstanceRuleVoter.php | 8 +-- src/Security/Voter/MainVoter.php | 8 +-- src/Security/Voter/UserVoter.php | 8 +-- src/SiteConfig/GrabySiteConfigBuilder.php | 32 ++-------- src/SiteConfig/LoginFormAuthenticator.php | 8 +-- src/Twig/WallabagExtension.php | 26 +++----- tests/Consumer/AMQPEntryConsumerTest.php | 2 +- tests/Consumer/RedisEntryConsumerTest.php | 2 +- 85 files changed, 441 insertions(+), 854 deletions(-) diff --git a/fixtures/IgnoreOriginInstanceRuleFixtures.php b/fixtures/IgnoreOriginInstanceRuleFixtures.php index b02cfcba3..d4a3da1c6 100644 --- a/fixtures/IgnoreOriginInstanceRuleFixtures.php +++ b/fixtures/IgnoreOriginInstanceRuleFixtures.php @@ -8,11 +8,9 @@ use Wallabag\Entity\IgnoreOriginInstanceRule; class IgnoreOriginInstanceRuleFixtures extends Fixture { - private array $defaultIgnoreOriginInstanceRules; - - public function __construct(array $defaultIgnoreOriginInstanceRules) - { - $this->defaultIgnoreOriginInstanceRules = $defaultIgnoreOriginInstanceRules; + public function __construct( + private array $defaultIgnoreOriginInstanceRules, + ) { } public function load(ObjectManager $manager): void diff --git a/fixtures/InternalSettingFixtures.php b/fixtures/InternalSettingFixtures.php index a09971968..cd81a5e98 100644 --- a/fixtures/InternalSettingFixtures.php +++ b/fixtures/InternalSettingFixtures.php @@ -8,11 +8,9 @@ use Wallabag\Entity\InternalSetting; class InternalSettingFixtures extends Fixture { - private array $defaultInternalSettings; - - public function __construct(array $defaultInternalSettings) - { - $this->defaultInternalSettings = $defaultInternalSettings; + public function __construct( + private array $defaultInternalSettings, + ) { } public function load(ObjectManager $manager): void diff --git a/fixtures/SiteCredentialFixtures.php b/fixtures/SiteCredentialFixtures.php index 5b95abe25..c6a089757 100644 --- a/fixtures/SiteCredentialFixtures.php +++ b/fixtures/SiteCredentialFixtures.php @@ -11,11 +11,9 @@ use Wallabag\Helper\CryptoProxy; class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface { - private CryptoProxy $cryptoProxy; - - public function __construct(CryptoProxy $cryptoProxy) - { - $this->cryptoProxy = $cryptoProxy; + public function __construct( + private CryptoProxy $cryptoProxy, + ) { } public function load(ObjectManager $manager): void diff --git a/rector.php b/rector.php index e6e48dac6..c2a859f6f 100644 --- a/rector.php +++ b/rector.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Rector\Config\RectorConfig; +use Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector; return RectorConfig::configure() ->withPaths([ @@ -14,5 +15,13 @@ return RectorConfig::configure() ]) ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) + ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ + 'inline_public' => true, + ]) + ->withSkip([ + ClassPropertyAssignToConstructorPromotionRector::class => [ + __DIR__ . '/src/Entity/*', + ], + ]) ->withPhpSets(php74: true) ->withTypeCoverageLevel(0); diff --git a/src/Command/CleanDownloadedImagesCommand.php b/src/Command/CleanDownloadedImagesCommand.php index c57cb248a..fdbe09166 100644 --- a/src/Command/CleanDownloadedImagesCommand.php +++ b/src/Command/CleanDownloadedImagesCommand.php @@ -16,14 +16,10 @@ class CleanDownloadedImagesCommand extends Command protected static $defaultName = 'wallabag:clean-downloaded-images'; protected static $defaultDescription = 'Cleans downloaded images which are no more associated to an entry'; - private EntryRepository $entryRepository; - private DownloadImages $downloadImages; - - public function __construct(EntryRepository $entryRepository, DownloadImages $downloadImages) - { - $this->entryRepository = $entryRepository; - $this->downloadImages = $downloadImages; - + public function __construct( + private EntryRepository $entryRepository, + private DownloadImages $downloadImages, + ) { parent::__construct(); } diff --git a/src/Command/CleanDuplicatesCommand.php b/src/Command/CleanDuplicatesCommand.php index 184146aec..0da8d630c 100644 --- a/src/Command/CleanDuplicatesCommand.php +++ b/src/Command/CleanDuplicatesCommand.php @@ -21,16 +21,12 @@ class CleanDuplicatesCommand extends Command protected SymfonyStyle $io; protected int $duplicates = 0; - private EntityManagerInterface $entityManager; - private EntryRepository $entryRepository; - private UserRepository $userRepository; - - public function __construct(EntityManagerInterface $entityManager, EntryRepository $entryRepository, UserRepository $userRepository) - { - $this->entityManager = $entityManager; - $this->entryRepository = $entryRepository; - $this->userRepository = $userRepository; + public function __construct( + private EntityManagerInterface $entityManager, + private EntryRepository $entryRepository, + private UserRepository $userRepository, + ) { parent::__construct(); } diff --git a/src/Command/ExportCommand.php b/src/Command/ExportCommand.php index f651157a6..399f74d99 100644 --- a/src/Command/ExportCommand.php +++ b/src/Command/ExportCommand.php @@ -17,18 +17,12 @@ class ExportCommand extends Command protected static $defaultName = 'wallabag:export'; protected static $defaultDescription = 'Export all entries for an user'; - private EntryRepository $entryRepository; - private UserRepository $userRepository; - private EntriesExport $entriesExport; - private string $projectDir; - - public function __construct(EntryRepository $entryRepository, UserRepository $userRepository, EntriesExport $entriesExport, string $projectDir) - { - $this->entryRepository = $entryRepository; - $this->userRepository = $userRepository; - $this->entriesExport = $entriesExport; - $this->projectDir = $projectDir; - + public function __construct( + private EntryRepository $entryRepository, + private UserRepository $userRepository, + private EntriesExport $entriesExport, + private string $projectDir, + ) { parent::__construct(); } diff --git a/src/Command/GenerateUrlHashesCommand.php b/src/Command/GenerateUrlHashesCommand.php index 4583fa140..47d9c7b38 100644 --- a/src/Command/GenerateUrlHashesCommand.php +++ b/src/Command/GenerateUrlHashesCommand.php @@ -19,16 +19,12 @@ class GenerateUrlHashesCommand extends Command protected static $defaultDescription = 'Generates hashed urls for each entry'; protected OutputInterface $output; - private EntityManagerInterface $entityManager; - private EntryRepository $entryRepository; - private UserRepository $userRepository; - - public function __construct(EntityManagerInterface $entityManager, EntryRepository $entryRepository, UserRepository $userRepository) - { - $this->entityManager = $entityManager; - $this->entryRepository = $entryRepository; - $this->userRepository = $userRepository; + public function __construct( + private EntityManagerInterface $entityManager, + private EntryRepository $entryRepository, + private UserRepository $userRepository, + ) { parent::__construct(); } diff --git a/src/Command/Import/ImportCommand.php b/src/Command/Import/ImportCommand.php index 2d29979ae..56aa04122 100644 --- a/src/Command/Import/ImportCommand.php +++ b/src/Command/Import/ImportCommand.php @@ -33,55 +33,23 @@ class ImportCommand extends Command protected static $defaultName = 'wallabag:import'; protected static $defaultDescription = 'Import entries from a JSON export'; - private EntityManagerInterface $entityManager; - private TokenStorageInterface $tokenStorage; - private UserRepository $userRepository; - private WallabagV2Import $wallabagV2Import; - private FirefoxImport $firefoxImport; - private ChromeImport $chromeImport; - private ReadabilityImport $readabilityImport; - private InstapaperImport $instapaperImport; - private PinboardImport $pinboardImport; - private DeliciousImport $deliciousImport; - private OmnivoreImport $omnivoreImport; - private WallabagV1Import $wallabagV1Import; - private ElcuratorImport $elcuratorImport; - private ShaarliImport $shaarliImport; - private PocketHtmlImport $pocketHtmlImport; - public function __construct( - EntityManagerInterface $entityManager, - TokenStorageInterface $tokenStorage, - UserRepository $userRepository, - WallabagV2Import $wallabagV2Import, - FirefoxImport $firefoxImport, - ChromeImport $chromeImport, - ReadabilityImport $readabilityImport, - InstapaperImport $instapaperImport, - PinboardImport $pinboardImport, - DeliciousImport $deliciousImport, - WallabagV1Import $wallabagV1Import, - ElcuratorImport $elcuratorImport, - ShaarliImport $shaarliImport, - PocketHtmlImport $pocketHtmlImport, - OmnivoreImport $omnivoreImport, + private EntityManagerInterface $entityManager, + private TokenStorageInterface $tokenStorage, + private UserRepository $userRepository, + private WallabagV2Import $wallabagV2Import, + private FirefoxImport $firefoxImport, + private ChromeImport $chromeImport, + private ReadabilityImport $readabilityImport, + private InstapaperImport $instapaperImport, + private PinboardImport $pinboardImport, + private DeliciousImport $deliciousImport, + private WallabagV1Import $wallabagV1Import, + private ElcuratorImport $elcuratorImport, + private ShaarliImport $shaarliImport, + private PocketHtmlImport $pocketHtmlImport, + private OmnivoreImport $omnivoreImport, ) { - $this->entityManager = $entityManager; - $this->tokenStorage = $tokenStorage; - $this->userRepository = $userRepository; - $this->wallabagV2Import = $wallabagV2Import; - $this->firefoxImport = $firefoxImport; - $this->chromeImport = $chromeImport; - $this->readabilityImport = $readabilityImport; - $this->instapaperImport = $instapaperImport; - $this->pinboardImport = $pinboardImport; - $this->deliciousImport = $deliciousImport; - $this->omnivoreImport = $omnivoreImport; - $this->wallabagV1Import = $wallabagV1Import; - $this->elcuratorImport = $elcuratorImport; - $this->shaarliImport = $shaarliImport; - $this->pocketHtmlImport = $pocketHtmlImport; - parent::__construct(); } diff --git a/src/Command/Import/RedisWorkerCommand.php b/src/Command/Import/RedisWorkerCommand.php index b12e88f5a..bb614b48f 100644 --- a/src/Command/Import/RedisWorkerCommand.php +++ b/src/Command/Import/RedisWorkerCommand.php @@ -16,12 +16,9 @@ class RedisWorkerCommand extends Command protected static $defaultName = 'wallabag:import:redis-worker'; protected static $defaultDescription = 'Launch Redis worker'; - private $container; - - public function __construct(ContainerInterface $container) - { - $this->container = $container; - + public function __construct( + private ContainerInterface $container, + ) { parent::__construct(); } diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index 4c23d598d..af9f3a1a1 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -37,24 +37,15 @@ class InstallCommand extends Command 'curl_multi_init', ]; - private EntityManagerInterface $entityManager; - private EventDispatcherInterface $dispatcher; - private UserManagerInterface $userManager; - private TableMetadataStorageConfiguration $tableMetadataStorageConfiguration; - private string $databaseDriver; - private array $defaultSettings; - private array $defaultIgnoreOriginInstanceRules; - - public function __construct(EntityManagerInterface $entityManager, EventDispatcherInterface $dispatcher, UserManagerInterface $userManager, TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, string $databaseDriver, array $defaultSettings, array $defaultIgnoreOriginInstanceRules) - { - $this->entityManager = $entityManager; - $this->dispatcher = $dispatcher; - $this->userManager = $userManager; - $this->tableMetadataStorageConfiguration = $tableMetadataStorageConfiguration; - $this->databaseDriver = $databaseDriver; - $this->defaultSettings = $defaultSettings; - $this->defaultIgnoreOriginInstanceRules = $defaultIgnoreOriginInstanceRules; - + public function __construct( + private EntityManagerInterface $entityManager, + private EventDispatcherInterface $dispatcher, + private UserManagerInterface $userManager, + private TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, + private string $databaseDriver, + private array $defaultSettings, + private array $defaultIgnoreOriginInstanceRules, + ) { parent::__construct(); } diff --git a/src/Command/ListUserCommand.php b/src/Command/ListUserCommand.php index 6085955b4..28dac48b1 100644 --- a/src/Command/ListUserCommand.php +++ b/src/Command/ListUserCommand.php @@ -15,12 +15,9 @@ class ListUserCommand extends Command protected static $defaultName = 'wallabag:user:list'; protected static $defaultDescription = 'List all users'; - private UserRepository $userRepository; - - public function __construct(UserRepository $userRepository) - { - $this->userRepository = $userRepository; - + public function __construct( + private UserRepository $userRepository, + ) { parent::__construct(); } diff --git a/src/Command/ReloadEntryCommand.php b/src/Command/ReloadEntryCommand.php index aab6bb69f..68a47e5d0 100644 --- a/src/Command/ReloadEntryCommand.php +++ b/src/Command/ReloadEntryCommand.php @@ -21,20 +21,13 @@ class ReloadEntryCommand extends Command protected static $defaultName = 'wallabag:entry:reload'; protected static $defaultDescription = 'Reload entries'; - private EntryRepository $entryRepository; - private UserRepository $userRepository; - private EntityManagerInterface $entityManager; - private ContentProxy $contentProxy; - private EventDispatcherInterface $dispatcher; - - public function __construct(EntryRepository $entryRepository, UserRepository $userRepository, EntityManagerInterface $entityManager, ContentProxy $contentProxy, EventDispatcherInterface $dispatcher) - { - $this->entryRepository = $entryRepository; - $this->userRepository = $userRepository; - $this->entityManager = $entityManager; - $this->contentProxy = $contentProxy; - $this->dispatcher = $dispatcher; - + public function __construct( + private EntryRepository $entryRepository, + private UserRepository $userRepository, + private EntityManagerInterface $entityManager, + private ContentProxy $contentProxy, + private EventDispatcherInterface $dispatcher, + ) { parent::__construct(); } diff --git a/src/Command/ShowUserCommand.php b/src/Command/ShowUserCommand.php index 124daa87c..be771df1c 100644 --- a/src/Command/ShowUserCommand.php +++ b/src/Command/ShowUserCommand.php @@ -17,12 +17,10 @@ class ShowUserCommand extends Command protected static $defaultDescription = 'Show user details'; protected SymfonyStyle $io; - private UserRepository $userRepository; - - public function __construct(UserRepository $userRepository) - { - $this->userRepository = $userRepository; + public function __construct( + private UserRepository $userRepository, + ) { parent::__construct(); } diff --git a/src/Command/TagAllCommand.php b/src/Command/TagAllCommand.php index 8d933e086..bc135f42a 100644 --- a/src/Command/TagAllCommand.php +++ b/src/Command/TagAllCommand.php @@ -18,16 +18,11 @@ class TagAllCommand extends Command protected static $defaultName = 'wallabag:tag:all'; protected static $defaultDescription = 'Tag all entries using the tagging rules.'; - private EntityManagerInterface $entityManager; - private RuleBasedTagger $ruleBasedTagger; - private UserRepository $userRepository; - - public function __construct(EntityManagerInterface $entityManager, RuleBasedTagger $ruleBasedTagger, UserRepository $userRepository) - { - $this->entityManager = $entityManager; - $this->ruleBasedTagger = $ruleBasedTagger; - $this->userRepository = $userRepository; - + public function __construct( + private EntityManagerInterface $entityManager, + private RuleBasedTagger $ruleBasedTagger, + private UserRepository $userRepository, + ) { parent::__construct(); } diff --git a/src/Command/UpdatePicturesPathCommand.php b/src/Command/UpdatePicturesPathCommand.php index e78316e5c..aff65bc33 100644 --- a/src/Command/UpdatePicturesPathCommand.php +++ b/src/Command/UpdatePicturesPathCommand.php @@ -15,15 +15,11 @@ class UpdatePicturesPathCommand extends Command protected static $defaultName = 'wallabag:update-pictures-path'; protected static $defaultDescription = 'Update the path of the pictures for each entry when you changed your wallabag instance URL.'; - private EntityManagerInterface $entityManager; - private EntryRepository $entryRepository; - private string $wallabagUrl; - - public function __construct(EntityManagerInterface $entityManager, EntryRepository $entryRepository, $wallabagUrl) - { - $this->entityManager = $entityManager; - $this->entryRepository = $entryRepository; - $this->wallabagUrl = $wallabagUrl; + public function __construct( + private EntityManagerInterface $entityManager, + private EntryRepository $entryRepository, + private string $wallabagUrl, + ) { parent::__construct(); } diff --git a/src/Consumer/AbstractConsumer.php b/src/Consumer/AbstractConsumer.php index 3d635b0f3..67b861921 100644 --- a/src/Consumer/AbstractConsumer.php +++ b/src/Consumer/AbstractConsumer.php @@ -14,18 +14,13 @@ use Wallabag\Repository\UserRepository; abstract class AbstractConsumer { - protected $em; - protected $userRepository; - protected $import; - protected $eventDispatcher; - protected $logger; - - public function __construct(EntityManagerInterface $em, UserRepository $userRepository, AbstractImport $import, EventDispatcherInterface $eventDispatcher, ?LoggerInterface $logger = null) - { - $this->em = $em; - $this->userRepository = $userRepository; - $this->import = $import; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + protected EntityManagerInterface $em, + protected UserRepository $userRepository, + protected AbstractImport $import, + protected EventDispatcherInterface $eventDispatcher, + protected ?LoggerInterface $logger = null, + ) { $this->logger = $logger ?: new NullLogger(); } @@ -74,9 +69,7 @@ abstract class AbstractConsumer // entry saved, dispatch event about it! $this->eventDispatcher->dispatch(new EntrySavedEvent($entry), EntrySavedEvent::NAME); - // clear only affected entities - $this->em->clear(Entry::class); - $this->em->clear(Tag::class); + $this->em->clear(); } catch (\Exception $e) { $this->logger->warning('Unable to save entry', ['entry' => $storedEntry, 'exception' => $e]); diff --git a/src/Consumer/RabbitMQConsumerTotalProxy.php b/src/Consumer/RabbitMQConsumerTotalProxy.php index 41e4fd491..7906ac5d8 100644 --- a/src/Consumer/RabbitMQConsumerTotalProxy.php +++ b/src/Consumer/RabbitMQConsumerTotalProxy.php @@ -10,48 +10,21 @@ use OldSound\RabbitMqBundle\RabbitMq\Consumer; */ class RabbitMQConsumerTotalProxy { - private Consumer $pocketConsumer; - private Consumer $readabilityConsumer; - private Consumer $wallabagV1Consumer; - private Consumer $wallabagV2Consumer; - private Consumer $firefoxConsumer; - private Consumer $chromeConsumer; - private Consumer $instapaperConsumer; - private Consumer $pinboardConsumer; - private Consumer $deliciousConsumer; - private Consumer $elcuratorConsumer; - private Consumer $shaarliConsumer; - private Consumer $pocketHtmlConsumer; - private Consumer $omnivoreConsumer; - public function __construct( - Consumer $pocketConsumer, - Consumer $readabilityConsumer, - Consumer $wallabagV1Consumer, - Consumer $wallabagV2Consumer, - Consumer $firefoxConsumer, - Consumer $chromeConsumer, - Consumer $instapaperConsumer, - Consumer $pinboardConsumer, - Consumer $deliciousConsumer, - Consumer $elcuratorConsumer, - Consumer $shaarliConsumer, - Consumer $pocketHtmlConsumer, - Consumer $omnivoreConsumer, + private Consumer $pocketConsumer, + private Consumer $readabilityConsumer, + private Consumer $wallabagV1Consumer, + private Consumer $wallabagV2Consumer, + private Consumer $firefoxConsumer, + private Consumer $chromeConsumer, + private Consumer $instapaperConsumer, + private Consumer $pinboardConsumer, + private Consumer $deliciousConsumer, + private Consumer $elcuratorConsumer, + private Consumer $shaarliConsumer, + private Consumer $pocketHtmlConsumer, + private Consumer $omnivoreConsumer, ) { - $this->pocketConsumer = $pocketConsumer; - $this->readabilityConsumer = $readabilityConsumer; - $this->wallabagV1Consumer = $wallabagV1Consumer; - $this->wallabagV2Consumer = $wallabagV2Consumer; - $this->firefoxConsumer = $firefoxConsumer; - $this->chromeConsumer = $chromeConsumer; - $this->instapaperConsumer = $instapaperConsumer; - $this->pinboardConsumer = $pinboardConsumer; - $this->deliciousConsumer = $deliciousConsumer; - $this->elcuratorConsumer = $elcuratorConsumer; - $this->shaarliConsumer = $shaarliConsumer; - $this->pocketHtmlConsumer = $pocketHtmlConsumer; - $this->omnivoreConsumer = $omnivoreConsumer; } /** diff --git a/src/Controller/AnnotationController.php b/src/Controller/AnnotationController.php index 2a07c70b4..b9a9f97a9 100644 --- a/src/Controller/AnnotationController.php +++ b/src/Controller/AnnotationController.php @@ -20,15 +20,11 @@ use Wallabag\Repository\AnnotationRepository; class AnnotationController extends AbstractFOSRestController { - protected EntityManagerInterface $entityManager; - protected SerializerInterface $serializer; - protected FormFactoryInterface $formFactory; - - public function __construct(EntityManagerInterface $entityManager, SerializerInterface $serializer, FormFactoryInterface $formFactory) - { - $this->entityManager = $entityManager; - $this->serializer = $serializer; - $this->formFactory = $formFactory; + public function __construct( + protected EntityManagerInterface $entityManager, + protected SerializerInterface $serializer, + protected FormFactoryInterface $formFactory, + ) { } /** diff --git a/src/Controller/Api/WallabagRestController.php b/src/Controller/Api/WallabagRestController.php index 47987094e..d3b493e48 100644 --- a/src/Controller/Api/WallabagRestController.php +++ b/src/Controller/Api/WallabagRestController.php @@ -21,21 +21,14 @@ use Wallabag\Entity\User; class WallabagRestController extends AbstractFOSRestController { - protected EntityManagerInterface $entityManager; - protected SerializerInterface $serializer; - protected AuthorizationCheckerInterface $authorizationChecker; - protected TokenStorageInterface $tokenStorage; - protected TranslatorInterface $translator; - protected bool $registrationEnabled; - - public function __construct(EntityManagerInterface $entityManager, SerializerInterface $serializer, AuthorizationCheckerInterface $authorizationChecker, TokenStorageInterface $tokenStorage, TranslatorInterface $translator, bool $registrationEnabled) - { - $this->entityManager = $entityManager; - $this->serializer = $serializer; - $this->authorizationChecker = $authorizationChecker; - $this->tokenStorage = $tokenStorage; - $this->translator = $translator; - $this->registrationEnabled = $registrationEnabled; + public function __construct( + protected EntityManagerInterface $entityManager, + protected SerializerInterface $serializer, + protected AuthorizationCheckerInterface $authorizationChecker, + protected TokenStorageInterface $tokenStorage, + protected TranslatorInterface $translator, + protected bool $registrationEnabled, + ) { } /** diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index 677603818..d3776d996 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -44,33 +44,16 @@ use Wallabag\Tools\Utils; class ConfigController extends AbstractController { - private EntityManagerInterface $entityManager; - private UserManagerInterface $userManager; - private EntryRepository $entryRepository; - private TagRepository $tagRepository; - private AnnotationRepository $annotationRepository; - private ConfigRepository $configRepository; - private EventDispatcherInterface $eventDispatcher; - private Redirect $redirectHelper; - public function __construct( - EntityManagerInterface $entityManager, - UserManagerInterface $userManager, - EntryRepository $entryRepository, - TagRepository $tagRepository, - AnnotationRepository $annotationRepository, - ConfigRepository $configRepository, - EventDispatcherInterface $eventDispatcher, - Redirect $redirectHelper, + private EntityManagerInterface $entityManager, + private UserManagerInterface $userManager, + private EntryRepository $entryRepository, + private TagRepository $tagRepository, + private AnnotationRepository $annotationRepository, + private ConfigRepository $configRepository, + private EventDispatcherInterface $eventDispatcher, + private Redirect $redirectHelper, ) { - $this->entityManager = $entityManager; - $this->userManager = $userManager; - $this->entryRepository = $entryRepository; - $this->tagRepository = $tagRepository; - $this->annotationRepository = $annotationRepository; - $this->configRepository = $configRepository; - $this->eventDispatcher = $eventDispatcher; - $this->redirectHelper = $redirectHelper; } /** diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index e1ee1212c..278731f23 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -33,25 +33,16 @@ use Wallabag\Repository\TagRepository; class EntryController extends AbstractController { - private EntityManagerInterface $entityManager; - private EventDispatcherInterface $eventDispatcher; - private EntryRepository $entryRepository; - private Redirect $redirectHelper; - private PreparePagerForEntries $preparePagerForEntriesHelper; - private FilterBuilderUpdaterInterface $filterBuilderUpdater; - private ContentProxy $contentProxy; - private Security $security; - - public function __construct(EntityManagerInterface $entityManager, EventDispatcherInterface $eventDispatcher, EntryRepository $entryRepository, Redirect $redirectHelper, PreparePagerForEntries $preparePagerForEntriesHelper, FilterBuilderUpdaterInterface $filterBuilderUpdater, ContentProxy $contentProxy, Security $security) - { - $this->entityManager = $entityManager; - $this->eventDispatcher = $eventDispatcher; - $this->entryRepository = $entryRepository; - $this->redirectHelper = $redirectHelper; - $this->preparePagerForEntriesHelper = $preparePagerForEntriesHelper; - $this->filterBuilderUpdater = $filterBuilderUpdater; - $this->contentProxy = $contentProxy; - $this->security = $security; + public function __construct( + private EntityManagerInterface $entityManager, + private EventDispatcherInterface $eventDispatcher, + private EntryRepository $entryRepository, + private Redirect $redirectHelper, + private PreparePagerForEntries $preparePagerForEntriesHelper, + private FilterBuilderUpdaterInterface $filterBuilderUpdater, + private ContentProxy $contentProxy, + private Security $security, + ) { } /** diff --git a/src/Controller/FeedController.php b/src/Controller/FeedController.php index f650274f3..6317ed8dd 100644 --- a/src/Controller/FeedController.php +++ b/src/Controller/FeedController.php @@ -20,11 +20,9 @@ use Wallabag\Repository\EntryRepository; class FeedController extends AbstractController { - private EntryRepository $entryRepository; - - public function __construct(EntryRepository $entryRepository) - { - $this->entryRepository = $entryRepository; + public function __construct( + private EntryRepository $entryRepository, + ) { } /** diff --git a/src/Controller/IgnoreOriginInstanceRuleController.php b/src/Controller/IgnoreOriginInstanceRuleController.php index 12a3782c4..6b4d3c2d6 100644 --- a/src/Controller/IgnoreOriginInstanceRuleController.php +++ b/src/Controller/IgnoreOriginInstanceRuleController.php @@ -20,13 +20,10 @@ use Wallabag\Repository\IgnoreOriginInstanceRuleRepository; */ class IgnoreOriginInstanceRuleController extends AbstractController { - private EntityManagerInterface $entityManager; - private TranslatorInterface $translator; - - public function __construct(EntityManagerInterface $entityManager, TranslatorInterface $translator) - { - $this->entityManager = $entityManager; - $this->translator = $translator; + public function __construct( + private EntityManagerInterface $entityManager, + private TranslatorInterface $translator, + ) { } /** diff --git a/src/Controller/Import/ChromeController.php b/src/Controller/Import/ChromeController.php index 79a769ca9..7feb2714e 100644 --- a/src/Controller/Import/ChromeController.php +++ b/src/Controller/Import/ChromeController.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class ChromeController extends BrowserController { - private ChromeImport $chromeImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(ChromeImport $chromeImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->chromeImport = $chromeImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private ChromeImport $chromeImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/DeliciousController.php b/src/Controller/Import/DeliciousController.php index f07011c80..4d110398f 100644 --- a/src/Controller/Import/DeliciousController.php +++ b/src/Controller/Import/DeliciousController.php @@ -15,13 +15,10 @@ use Wallabag\Redis\Producer as RedisProducer; class DeliciousController extends AbstractController { - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/ElcuratorController.php b/src/Controller/Import/ElcuratorController.php index 429b07e3a..f5cc28162 100644 --- a/src/Controller/Import/ElcuratorController.php +++ b/src/Controller/Import/ElcuratorController.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class ElcuratorController extends WallabagController { - private ElcuratorImport $elcuratorImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(ElcuratorImport $elcuratorImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->elcuratorImport = $elcuratorImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private ElcuratorImport $elcuratorImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/FirefoxController.php b/src/Controller/Import/FirefoxController.php index 0e6656611..c3891ae2f 100644 --- a/src/Controller/Import/FirefoxController.php +++ b/src/Controller/Import/FirefoxController.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class FirefoxController extends BrowserController { - private FirefoxImport $firefoxImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(FirefoxImport $firefoxImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->firefoxImport = $firefoxImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private FirefoxImport $firefoxImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/ImportController.php b/src/Controller/Import/ImportController.php index 5dc35418c..fe09e06a2 100644 --- a/src/Controller/Import/ImportController.php +++ b/src/Controller/Import/ImportController.php @@ -13,13 +13,10 @@ use Wallabag\Import\ImportChain; class ImportController extends AbstractController { - private RabbitMQConsumerTotalProxy $rabbitMQConsumerTotalProxy; - private Client $redisClient; - - public function __construct(RabbitMQConsumerTotalProxy $rabbitMQConsumerTotalProxy, Client $redisClient) - { - $this->rabbitMQConsumerTotalProxy = $rabbitMQConsumerTotalProxy; - $this->redisClient = $redisClient; + public function __construct( + private RabbitMQConsumerTotalProxy $rabbitMQConsumerTotalProxy, + private Client $redisClient, + ) { } /** diff --git a/src/Controller/Import/InstapaperController.php b/src/Controller/Import/InstapaperController.php index 90e1a943d..c764e8457 100644 --- a/src/Controller/Import/InstapaperController.php +++ b/src/Controller/Import/InstapaperController.php @@ -15,13 +15,10 @@ use Wallabag\Redis\Producer as RedisProducer; class InstapaperController extends AbstractController { - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/OmnivoreController.php b/src/Controller/Import/OmnivoreController.php index 33be27720..ae41f6c98 100644 --- a/src/Controller/Import/OmnivoreController.php +++ b/src/Controller/Import/OmnivoreController.php @@ -15,13 +15,10 @@ use Wallabag\Redis\Producer as RedisProducer; class OmnivoreController extends AbstractController { - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/PinboardController.php b/src/Controller/Import/PinboardController.php index b99d2e4d9..2fa3381a6 100644 --- a/src/Controller/Import/PinboardController.php +++ b/src/Controller/Import/PinboardController.php @@ -15,13 +15,10 @@ use Wallabag\Redis\Producer as RedisProducer; class PinboardController extends AbstractController { - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/PocketController.php b/src/Controller/Import/PocketController.php index f2ad34c35..0197ef4dd 100644 --- a/src/Controller/Import/PocketController.php +++ b/src/Controller/Import/PocketController.php @@ -17,17 +17,12 @@ use Wallabag\Redis\Producer as RedisProducer; class PocketController extends AbstractController { - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - private SessionInterface $session; - - public function __construct(Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer, SessionInterface $session) - { - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; - $this->session = $session; + public function __construct( + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + private SessionInterface $session, + ) { } /** diff --git a/src/Controller/Import/PocketHtmlController.php b/src/Controller/Import/PocketHtmlController.php index ea3555ddd..fa0ecee67 100644 --- a/src/Controller/Import/PocketHtmlController.php +++ b/src/Controller/Import/PocketHtmlController.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class PocketHtmlController extends HtmlController { - private PocketHtmlImport $pocketHtmlImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(PocketHtmlImport $pocketHtmlImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->pocketHtmlImport = $pocketHtmlImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private PocketHtmlImport $pocketHtmlImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/ReadabilityController.php b/src/Controller/Import/ReadabilityController.php index 584ffc67d..0d90f1eec 100644 --- a/src/Controller/Import/ReadabilityController.php +++ b/src/Controller/Import/ReadabilityController.php @@ -15,13 +15,10 @@ use Wallabag\Redis\Producer as RedisProducer; class ReadabilityController extends AbstractController { - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/ShaarliController.php b/src/Controller/Import/ShaarliController.php index 91d6fd21b..f02539365 100644 --- a/src/Controller/Import/ShaarliController.php +++ b/src/Controller/Import/ShaarliController.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class ShaarliController extends HtmlController { - private ShaarliImport $shaarliImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(ShaarliImport $shaarliImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->shaarliImport = $shaarliImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private ShaarliImport $shaarliImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/WallabagV1Controller.php b/src/Controller/Import/WallabagV1Controller.php index de7d1b9b5..7ad6e32fe 100644 --- a/src/Controller/Import/WallabagV1Controller.php +++ b/src/Controller/Import/WallabagV1Controller.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class WallabagV1Controller extends WallabagController { - private WallabagV1Import $wallabagImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(WallabagV1Import $wallabagImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->wallabagImport = $wallabagImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private WallabagV1Import $wallabagImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/Import/WallabagV2Controller.php b/src/Controller/Import/WallabagV2Controller.php index bdfa7dfe6..f676438cd 100644 --- a/src/Controller/Import/WallabagV2Controller.php +++ b/src/Controller/Import/WallabagV2Controller.php @@ -13,17 +13,12 @@ use Wallabag\Redis\Producer as RedisProducer; class WallabagV2Controller extends WallabagController { - private WallabagV2Import $wallabagImport; - private Config $craueConfig; - private RabbitMqProducer $rabbitMqProducer; - private RedisProducer $redisProducer; - - public function __construct(WallabagV2Import $wallabagImport, Config $craueConfig, RabbitMqProducer $rabbitMqProducer, RedisProducer $redisProducer) - { - $this->wallabagImport = $wallabagImport; - $this->craueConfig = $craueConfig; - $this->rabbitMqProducer = $rabbitMqProducer; - $this->redisProducer = $redisProducer; + public function __construct( + private WallabagV2Import $wallabagImport, + private Config $craueConfig, + private RabbitMqProducer $rabbitMqProducer, + private RedisProducer $redisProducer, + ) { } /** diff --git a/src/Controller/SiteCredentialController.php b/src/Controller/SiteCredentialController.php index 9e90899eb..2e6a55e38 100644 --- a/src/Controller/SiteCredentialController.php +++ b/src/Controller/SiteCredentialController.php @@ -23,17 +23,12 @@ use Wallabag\Repository\SiteCredentialRepository; */ class SiteCredentialController extends AbstractController { - private EntityManagerInterface $entityManager; - private TranslatorInterface $translator; - private CryptoProxy $cryptoProxy; - private Config $craueConfig; - - public function __construct(EntityManagerInterface $entityManager, TranslatorInterface $translator, CryptoProxy $cryptoProxy, Config $craueConfig) - { - $this->entityManager = $entityManager; - $this->translator = $translator; - $this->cryptoProxy = $cryptoProxy; - $this->craueConfig = $craueConfig; + public function __construct( + private EntityManagerInterface $entityManager, + private TranslatorInterface $translator, + private CryptoProxy $cryptoProxy, + private Config $craueConfig, + ) { } /** diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 125cfdbba..859a9305d 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -25,17 +25,12 @@ use Wallabag\Repository\TagRepository; class TagController extends AbstractController { - private EntityManagerInterface $entityManager; - private TagsAssigner $tagsAssigner; - private Redirect $redirectHelper; - private Security $security; - - public function __construct(EntityManagerInterface $entityManager, TagsAssigner $tagsAssigner, Redirect $redirectHelper, Security $security) - { - $this->entityManager = $entityManager; - $this->tagsAssigner = $tagsAssigner; - $this->redirectHelper = $redirectHelper; - $this->security = $security; + public function __construct( + private EntityManagerInterface $entityManager, + private TagsAssigner $tagsAssigner, + private Redirect $redirectHelper, + private Security $security, + ) { } /** diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 58e069926..ae9568407 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -29,13 +29,10 @@ use Wallabag\Repository\UserRepository; */ class UserController extends AbstractController { - private EntityManagerInterface $entityManager; - private TranslatorInterface $translator; - - public function __construct(EntityManagerInterface $entityManager, TranslatorInterface $translator) - { - $this->entityManager = $entityManager; - $this->translator = $translator; + public function __construct( + private EntityManagerInterface $entityManager, + private TranslatorInterface $translator, + ) { } /** diff --git a/src/Doctrine/MigrationFactoryDecorator.php b/src/Doctrine/MigrationFactoryDecorator.php index 2872159f2..0737fbfa6 100644 --- a/src/Doctrine/MigrationFactoryDecorator.php +++ b/src/Doctrine/MigrationFactoryDecorator.php @@ -10,17 +10,12 @@ use Doctrine\Migrations\Version\MigrationFactory; */ class MigrationFactoryDecorator implements MigrationFactory { - private MigrationFactory $migrationFactory; - private string $tablePrefix; - private array $defaultIgnoreOriginInstanceRules; - private string $fetchingErrorMessage; - - public function __construct(MigrationFactory $migrationFactory, string $tablePrefix, array $defaultIgnoreOriginInstanceRules, string $fetchingErrorMessage) - { - $this->migrationFactory = $migrationFactory; - $this->tablePrefix = $tablePrefix; - $this->defaultIgnoreOriginInstanceRules = $defaultIgnoreOriginInstanceRules; - $this->fetchingErrorMessage = $fetchingErrorMessage; + public function __construct( + private MigrationFactory $migrationFactory, + private string $tablePrefix, + private array $defaultIgnoreOriginInstanceRules, + private string $fetchingErrorMessage, + ) { } public function createVersion(string $migrationClassName): AbstractMigration diff --git a/src/Event/ConfigUpdatedEvent.php b/src/Event/ConfigUpdatedEvent.php index d1806a57f..455789137 100644 --- a/src/Event/ConfigUpdatedEvent.php +++ b/src/Event/ConfigUpdatedEvent.php @@ -12,11 +12,9 @@ class ConfigUpdatedEvent extends Event { public const NAME = 'config.updated'; - protected $config; - - public function __construct(Config $entry) - { - $this->config = $entry; + public function __construct( + protected Config $config, + ) { } public function getConfig(): Config diff --git a/src/Event/EntryDeletedEvent.php b/src/Event/EntryDeletedEvent.php index c81bf711e..b95806c80 100644 --- a/src/Event/EntryDeletedEvent.php +++ b/src/Event/EntryDeletedEvent.php @@ -12,11 +12,9 @@ class EntryDeletedEvent extends Event { public const NAME = 'entry.deleted'; - protected $entry; - - public function __construct(Entry $entry) - { - $this->entry = $entry; + public function __construct( + protected Entry $entry, + ) { } public function getEntry(): Entry diff --git a/src/Event/EntrySavedEvent.php b/src/Event/EntrySavedEvent.php index ec3bdfa93..c1deaedbe 100644 --- a/src/Event/EntrySavedEvent.php +++ b/src/Event/EntrySavedEvent.php @@ -12,11 +12,9 @@ class EntrySavedEvent extends Event { public const NAME = 'entry.saved'; - protected $entry; - - public function __construct(Entry $entry) - { - $this->entry = $entry; + public function __construct( + protected Entry $entry, + ) { } public function getEntry(): Entry diff --git a/src/Event/Listener/AuthenticationFailureListener.php b/src/Event/Listener/AuthenticationFailureListener.php index e1e2acc2e..24d167c71 100644 --- a/src/Event/Listener/AuthenticationFailureListener.php +++ b/src/Event/Listener/AuthenticationFailureListener.php @@ -9,13 +9,10 @@ use Symfony\Component\Security\Http\Event\LoginFailureEvent; class AuthenticationFailureListener implements EventSubscriberInterface { - private $requestStack; - private $logger; - - public function __construct(RequestStack $requestStack, LoggerInterface $logger) - { - $this->requestStack = $requestStack; - $this->logger = $logger; + public function __construct( + private RequestStack $requestStack, + private LoggerInterface $logger, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Listener/CreateConfigListener.php b/src/Event/Listener/CreateConfigListener.php index 9cc000e63..fe8e1c929 100644 --- a/src/Event/Listener/CreateConfigListener.php +++ b/src/Event/Listener/CreateConfigListener.php @@ -15,27 +15,17 @@ use Wallabag\Entity\Config; */ class CreateConfigListener implements EventSubscriberInterface { - private $em; - private $itemsOnPage; - private $feedLimit; - private $language; - private $readingSpeed; - private $actionMarkAsRead; - private $listMode; - private $requestStack; - private $displayThumbnails; - - public function __construct(EntityManagerInterface $em, $itemsOnPage, $feedLimit, $language, $readingSpeed, $actionMarkAsRead, $listMode, $displayThumbnails, RequestStack $requestStack) - { - $this->em = $em; - $this->itemsOnPage = $itemsOnPage; - $this->feedLimit = $feedLimit; - $this->language = $language; - $this->readingSpeed = $readingSpeed; - $this->actionMarkAsRead = $actionMarkAsRead; - $this->listMode = $listMode; - $this->requestStack = $requestStack; - $this->displayThumbnails = $displayThumbnails; + public function __construct( + private EntityManagerInterface $em, + private $itemsOnPage, + private $feedLimit, + private $language, + private $readingSpeed, + private $actionMarkAsRead, + private $listMode, + private $displayThumbnails, + private RequestStack $requestStack, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Listener/LocaleListener.php b/src/Event/Listener/LocaleListener.php index b14b8aa98..cd48551ec 100644 --- a/src/Event/Listener/LocaleListener.php +++ b/src/Event/Listener/LocaleListener.php @@ -11,11 +11,9 @@ use Symfony\Component\HttpKernel\KernelEvents; */ class LocaleListener implements EventSubscriberInterface { - private $defaultLocale; - - public function __construct($defaultLocale = 'en') - { - $this->defaultLocale = $defaultLocale; + public function __construct( + private $defaultLocale = 'en', + ) { } public function onKernelRequest(RequestEvent $event) diff --git a/src/Event/Listener/PasswordResettingListener.php b/src/Event/Listener/PasswordResettingListener.php index 6b47ffd09..4d3954b7d 100644 --- a/src/Event/Listener/PasswordResettingListener.php +++ b/src/Event/Listener/PasswordResettingListener.php @@ -15,11 +15,9 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; */ class PasswordResettingListener implements EventSubscriberInterface { - private $router; - - public function __construct(UrlGeneratorInterface $router) - { - $this->router = $router; + public function __construct( + private UrlGeneratorInterface $router, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Listener/RegistrationListener.php b/src/Event/Listener/RegistrationListener.php index 33a03c9d1..3581c074a 100644 --- a/src/Event/Listener/RegistrationListener.php +++ b/src/Event/Listener/RegistrationListener.php @@ -11,19 +11,12 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class RegistrationListener implements EventSubscriberInterface { /** - * @var bool + * @param bool $registrationEnabled */ - private $registrationEnabled; - - /** - * @var UrlGeneratorInterface - */ - private $urlGenerator; - - public function __construct($registrationEnabled, UrlGeneratorInterface $urlGenerator) - { - $this->registrationEnabled = $registrationEnabled; - $this->urlGenerator = $urlGenerator; + public function __construct( + private $registrationEnabled, + private UrlGeneratorInterface $urlGenerator, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Listener/UserLocaleListener.php b/src/Event/Listener/UserLocaleListener.php index df195a2b0..7387de92f 100644 --- a/src/Event/Listener/UserLocaleListener.php +++ b/src/Event/Listener/UserLocaleListener.php @@ -16,11 +16,9 @@ use Wallabag\Entity\User; */ class UserLocaleListener { - private SessionInterface $session; - - public function __construct(SessionInterface $session) - { - $this->session = $session; + public function __construct( + private SessionInterface $session, + ) { } public function onInteractiveLogin(InteractiveLoginEvent $event) diff --git a/src/Event/Subscriber/DownloadImagesSubscriber.php b/src/Event/Subscriber/DownloadImagesSubscriber.php index 069018b24..68c5a2049 100644 --- a/src/Event/Subscriber/DownloadImagesSubscriber.php +++ b/src/Event/Subscriber/DownloadImagesSubscriber.php @@ -12,17 +12,12 @@ use Wallabag\Helper\DownloadImages; class DownloadImagesSubscriber implements EventSubscriberInterface { - private $em; - private $downloadImages; - private $enabled; - private $logger; - - public function __construct(EntityManagerInterface $em, DownloadImages $downloadImages, $enabled, LoggerInterface $logger) - { - $this->em = $em; - $this->downloadImages = $downloadImages; - $this->enabled = $enabled; - $this->logger = $logger; + public function __construct( + private EntityManagerInterface $em, + private DownloadImages $downloadImages, + private $enabled, + private LoggerInterface $logger, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Subscriber/GenerateCustomCSSSubscriber.php b/src/Event/Subscriber/GenerateCustomCSSSubscriber.php index 78d9081a5..f6a47889f 100644 --- a/src/Event/Subscriber/GenerateCustomCSSSubscriber.php +++ b/src/Event/Subscriber/GenerateCustomCSSSubscriber.php @@ -9,13 +9,10 @@ use Wallabag\Event\ConfigUpdatedEvent; class GenerateCustomCSSSubscriber implements EventSubscriberInterface { - private $em; - private $compiler; - - public function __construct(EntityManagerInterface $em, Compiler $compiler) - { - $this->em = $em; - $this->compiler = $compiler; + public function __construct( + private EntityManagerInterface $em, + private Compiler $compiler, + ) { } public static function getSubscribedEvents(): array diff --git a/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php b/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php index 08ae02f1d..622cad030 100644 --- a/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php +++ b/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php @@ -17,11 +17,9 @@ use Wallabag\Entity\Entry; */ class SQLiteCascadeDeleteSubscriber implements EventSubscriber { - private $doctrine; - - public function __construct(ManagerRegistry $doctrine) - { - $this->doctrine = $doctrine; + public function __construct( + private ManagerRegistry $doctrine, + ) { } /** diff --git a/src/Event/Subscriber/SchemaAdapterSubscriber.php b/src/Event/Subscriber/SchemaAdapterSubscriber.php index fb3cb15f6..dcee8c540 100644 --- a/src/Event/Subscriber/SchemaAdapterSubscriber.php +++ b/src/Event/Subscriber/SchemaAdapterSubscriber.php @@ -8,11 +8,9 @@ use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; class SchemaAdapterSubscriber implements EventSubscriber { - private string $databaseTablePrefix; - - public function __construct(string $databaseTablePrefix) - { - $this->databaseTablePrefix = $databaseTablePrefix; + public function __construct( + private string $databaseTablePrefix, + ) { } public function getSubscribedEvents(): array diff --git a/src/ExpressionLanguage/AuthenticatorProvider.php b/src/ExpressionLanguage/AuthenticatorProvider.php index 3c76b72fc..2d26a5ef0 100644 --- a/src/ExpressionLanguage/AuthenticatorProvider.php +++ b/src/ExpressionLanguage/AuthenticatorProvider.php @@ -9,11 +9,9 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; class AuthenticatorProvider implements ExpressionFunctionProviderInterface { - private HttpClientInterface $requestHtmlFunctionClient; - - public function __construct(HttpClientInterface $requestHtmlFunctionClient) - { - $this->requestHtmlFunctionClient = $requestHtmlFunctionClient; + public function __construct( + private HttpClientInterface $requestHtmlFunctionClient, + ) { } public function getFunctions(): array diff --git a/src/Form/DataTransformer/StringToListTransformer.php b/src/Form/DataTransformer/StringToListTransformer.php index 97e012a16..32867d76a 100644 --- a/src/Form/DataTransformer/StringToListTransformer.php +++ b/src/Form/DataTransformer/StringToListTransformer.php @@ -10,17 +10,12 @@ use Symfony\Component\Form\DataTransformerInterface; */ class StringToListTransformer implements DataTransformerInterface { - /** - * @var string - */ - private $separator; - /** * @param string $separator The separator used in the list */ - public function __construct($separator = ',') - { - $this->separator = $separator; + public function __construct( + private $separator = ',', + ) { } /** diff --git a/src/Form/Type/ConfigType.php b/src/Form/Type/ConfigType.php index fc72ebe75..2a4ee9a47 100644 --- a/src/Form/Type/ConfigType.php +++ b/src/Form/Type/ConfigType.php @@ -14,17 +14,14 @@ use Wallabag\Entity\Config; class ConfigType extends AbstractType { - private $languages = []; - private $fonts = []; - /** * @param array $languages Languages come from configuration, array just code language as key and label as value * @param array $fonts Fonts come from configuration, array just font name as key / value */ - public function __construct($languages, $fonts) - { - $this->languages = $languages; - $this->fonts = $fonts; + public function __construct( + private $languages, + private $fonts, + ) { } public function buildForm(FormBuilderInterface $builder, array $options) diff --git a/src/Form/Type/EntryFilterType.php b/src/Form/Type/EntryFilterType.php index 039fea6de..c95cb22f2 100644 --- a/src/Form/Type/EntryFilterType.php +++ b/src/Form/Type/EntryFilterType.php @@ -21,16 +21,13 @@ use Wallabag\Repository\EntryRepository; class EntryFilterType extends AbstractType { - private $repository; - private $tokenStorage; - /** * Repository & user are used to get a list of language entries for this user. */ - public function __construct(EntryRepository $entryRepository, TokenStorageInterface $tokenStorage) - { - $this->repository = $entryRepository; - $this->tokenStorage = $tokenStorage; + public function __construct( + private EntryRepository $repository, + private TokenStorageInterface $tokenStorage, + ) { } public function buildForm(FormBuilderInterface $builder, array $options) diff --git a/src/Helper/ContentProxy.php b/src/Helper/ContentProxy.php index aefa8eeb0..af66abf7f 100644 --- a/src/Helper/ContentProxy.php +++ b/src/Helper/ContentProxy.php @@ -17,26 +17,19 @@ use Wallabag\Tools\Utils; */ class ContentProxy { - protected $graby; - protected $tagger; - protected $ignoreOriginProcessor; - protected $validator; - protected $logger; protected $mimeTypes; - protected $fetchingErrorMessage; protected $eventDispatcher; - protected $storeArticleHeaders; - public function __construct(Graby $graby, RuleBasedTagger $tagger, RuleBasedIgnoreOriginProcessor $ignoreOriginProcessor, ValidatorInterface $validator, LoggerInterface $logger, $fetchingErrorMessage, $storeArticleHeaders = false) - { - $this->graby = $graby; - $this->tagger = $tagger; - $this->ignoreOriginProcessor = $ignoreOriginProcessor; - $this->validator = $validator; - $this->logger = $logger; + public function __construct( + protected Graby $graby, + protected RuleBasedTagger $tagger, + protected RuleBasedIgnoreOriginProcessor $ignoreOriginProcessor, + protected ValidatorInterface $validator, + protected LoggerInterface $logger, + protected $fetchingErrorMessage, + protected $storeArticleHeaders = false, + ) { $this->mimeTypes = new MimeTypes(); - $this->fetchingErrorMessage = $fetchingErrorMessage; - $this->storeArticleHeaders = $storeArticleHeaders; } /** @@ -107,7 +100,9 @@ class ContentProxy return; } - $this->logger->warning('Language validation failed. ' . (string) $errors); + foreach ($errors as $error) { + $this->logger->warning('Language validation failed. ' . $error->getMessage()); + } } /** @@ -128,7 +123,9 @@ class ContentProxy return; } - $this->logger->warning('PreviewPicture validation failed. ' . (string) $errors); + foreach ($errors as $error) { + $this->logger->warning('PreviewPicture validation failed. ' . $error->getMessage()); + } } /** diff --git a/src/Helper/CryptoProxy.php b/src/Helper/CryptoProxy.php index cfc365eb3..434e8e04d 100644 --- a/src/Helper/CryptoProxy.php +++ b/src/Helper/CryptoProxy.php @@ -13,13 +13,12 @@ use Psr\Log\LoggerInterface; */ class CryptoProxy { - private $logger; private $encryptionKey; - public function __construct($encryptionKeyPath, LoggerInterface $logger) - { - $this->logger = $logger; - + public function __construct( + $encryptionKeyPath, + private LoggerInterface $logger, + ) { if (!file_exists($encryptionKeyPath)) { $key = Key::createNewRandomKey(); diff --git a/src/Helper/DownloadImages.php b/src/Helper/DownloadImages.php index cb808f537..a997d3a0f 100644 --- a/src/Helper/DownloadImages.php +++ b/src/Helper/DownloadImages.php @@ -16,19 +16,16 @@ use Symfony\Contracts\HttpClient\ResponseInterface; class DownloadImages { public const REGENERATE_PICTURES_QUALITY = 80; - - private $client; - private $baseFolder; - private $logger; private $mimeTypes; private $wallabagUrl; - public function __construct(HttpClientInterface $downloadImagesClient, $baseFolder, $wallabagUrl, LoggerInterface $logger) - { - $this->client = $downloadImagesClient; - $this->baseFolder = $baseFolder; + public function __construct( + private HttpClientInterface $client, + private $baseFolder, + $wallabagUrl, + private LoggerInterface $logger, + ) { $this->wallabagUrl = rtrim($wallabagUrl, '/'); - $this->logger = $logger; $this->mimeTypes = new MimeTypes(); $this->setFolder(); diff --git a/src/Helper/EntriesExport.php b/src/Helper/EntriesExport.php index 6a8c45952..da004b05e 100644 --- a/src/Helper/EntriesExport.php +++ b/src/Helper/EntriesExport.php @@ -19,10 +19,6 @@ use Wallabag\Entity\User; */ class EntriesExport { - private $wallabagUrl; - private $logoPath; - private $translator; - private $tokenStorage; private $title = ''; private $entries = []; private $author = 'wallabag'; @@ -34,12 +30,12 @@ class EntriesExport * @param string $logoPath Path to the logo FROM THE BUNDLE SCOPE * @param TokenStorageInterface $tokenStorage Needed to retrieve the current user */ - public function __construct(TranslatorInterface $translator, $wallabagUrl, $logoPath, TokenStorageInterface $tokenStorage) - { - $this->translator = $translator; - $this->wallabagUrl = $wallabagUrl; - $this->logoPath = $logoPath; - $this->tokenStorage = $tokenStorage; + public function __construct( + private TranslatorInterface $translator, + private $wallabagUrl, + private $logoPath, + private TokenStorageInterface $tokenStorage, + ) { } /** diff --git a/src/Helper/PreparePagerForEntries.php b/src/Helper/PreparePagerForEntries.php index 2a7564f0e..808c70ccf 100644 --- a/src/Helper/PreparePagerForEntries.php +++ b/src/Helper/PreparePagerForEntries.php @@ -10,11 +10,9 @@ use Wallabag\Entity\User; class PreparePagerForEntries { - private $tokenStorage; - - public function __construct(TokenStorageInterface $tokenStorage) - { - $this->tokenStorage = $tokenStorage; + public function __construct( + private TokenStorageInterface $tokenStorage, + ) { } /** diff --git a/src/Helper/Redirect.php b/src/Helper/Redirect.php index 777951ac9..cd2b7b23d 100644 --- a/src/Helper/Redirect.php +++ b/src/Helper/Redirect.php @@ -13,13 +13,10 @@ use Wallabag\Entity\User; */ class Redirect { - private $router; - private $tokenStorage; - - public function __construct(UrlGeneratorInterface $router, TokenStorageInterface $tokenStorage) - { - $this->router = $router; - $this->tokenStorage = $tokenStorage; + public function __construct( + private UrlGeneratorInterface $router, + private TokenStorageInterface $tokenStorage, + ) { } /** diff --git a/src/Helper/RuleBasedIgnoreOriginProcessor.php b/src/Helper/RuleBasedIgnoreOriginProcessor.php index a44390406..dc6ac5654 100644 --- a/src/Helper/RuleBasedIgnoreOriginProcessor.php +++ b/src/Helper/RuleBasedIgnoreOriginProcessor.php @@ -9,15 +9,11 @@ use Wallabag\Repository\IgnoreOriginInstanceRuleRepository; class RuleBasedIgnoreOriginProcessor { - protected $rulerz; - protected $logger; - protected $ignoreOriginInstanceRuleRepository; - - public function __construct(RulerZ $rulerz, LoggerInterface $logger, IgnoreOriginInstanceRuleRepository $ignoreOriginInstanceRuleRepository) - { - $this->rulerz = $rulerz; - $this->logger = $logger; - $this->ignoreOriginInstanceRuleRepository = $ignoreOriginInstanceRuleRepository; + public function __construct( + protected RulerZ $rulerz, + protected LoggerInterface $logger, + protected IgnoreOriginInstanceRuleRepository $ignoreOriginInstanceRuleRepository, + ) { } /** diff --git a/src/Helper/RuleBasedTagger.php b/src/Helper/RuleBasedTagger.php index 355394579..a3a17d651 100644 --- a/src/Helper/RuleBasedTagger.php +++ b/src/Helper/RuleBasedTagger.php @@ -14,17 +14,12 @@ use Wallabag\Repository\TagRepository; class RuleBasedTagger { - private $rulerz; - private $tagRepository; - private $entryRepository; - private $logger; - - public function __construct(RulerZ $rulerz, TagRepository $tagRepository, EntryRepository $entryRepository, LoggerInterface $logger) - { - $this->rulerz = $rulerz; - $this->tagRepository = $tagRepository; - $this->entryRepository = $entryRepository; - $this->logger = $logger; + public function __construct( + private RulerZ $rulerz, + private TagRepository $tagRepository, + private EntryRepository $entryRepository, + private LoggerInterface $logger, + ) { } /** diff --git a/src/Helper/TagsAssigner.php b/src/Helper/TagsAssigner.php index d39683e30..20c787a37 100644 --- a/src/Helper/TagsAssigner.php +++ b/src/Helper/TagsAssigner.php @@ -8,14 +8,9 @@ use Wallabag\Repository\TagRepository; class TagsAssigner { - /** - * @var TagRepository - */ - protected $tagRepository; - - public function __construct(TagRepository $tagRepository) - { - $this->tagRepository = $tagRepository; + public function __construct( + protected TagRepository $tagRepository, + ) { } /** diff --git a/src/HttpClient/Authenticator.php b/src/HttpClient/Authenticator.php index 47a7a17aa..8191c02a4 100644 --- a/src/HttpClient/Authenticator.php +++ b/src/HttpClient/Authenticator.php @@ -14,19 +14,13 @@ use Wallabag\SiteConfig\SiteConfigBuilder; class Authenticator implements LoggerAwareInterface { - /** @var SiteConfigBuilder */ - private $configBuilder; - - /** @var LoginFormAuthenticator */ - private $authenticator; - /** @var LoggerInterface */ private $logger; - public function __construct(SiteConfigBuilder $configBuilder, LoginFormAuthenticator $authenticator) - { - $this->configBuilder = $configBuilder; - $this->authenticator = $authenticator; + public function __construct( + private SiteConfigBuilder $configBuilder, + private LoginFormAuthenticator $authenticator, + ) { $this->logger = new NullLogger(); } diff --git a/src/HttpClient/WallabagClient.php b/src/HttpClient/WallabagClient.php index 8b3f294bb..0eb900318 100644 --- a/src/HttpClient/WallabagClient.php +++ b/src/HttpClient/WallabagClient.php @@ -11,19 +11,14 @@ use Symfony\Contracts\HttpClient\ResponseStreamInterface; class WallabagClient implements HttpClientInterface { - private $restrictedAccess; private HttpClientInterface $httpClient; - private HttpBrowser $browser; - private Authenticator $authenticator; - private LoggerInterface $logger; - - public function __construct($restrictedAccess, HttpBrowser $browser, Authenticator $authenticator, LoggerInterface $logger) - { - $this->restrictedAccess = $restrictedAccess; - $this->browser = $browser; - $this->authenticator = $authenticator; - $this->logger = $logger; + public function __construct( + private $restrictedAccess, + private HttpBrowser $browser, + private Authenticator $authenticator, + private LoggerInterface $logger, + ) { $this->httpClient = HttpClient::create([ 'timeout' => 10, ]); diff --git a/src/Import/AbstractImport.php b/src/Import/AbstractImport.php index c9ddee2b7..a51dc49ca 100644 --- a/src/Import/AbstractImport.php +++ b/src/Import/AbstractImport.php @@ -15,11 +15,6 @@ use Wallabag\Helper\TagsAssigner; abstract class AbstractImport implements ImportInterface { - protected $em; - protected $logger; - protected $contentProxy; - protected $tagsAssigner; - protected $eventDispatcher; protected $producer; protected $user; protected $markAsRead; @@ -28,13 +23,13 @@ abstract class AbstractImport implements ImportInterface protected $importedEntries = 0; protected $queuedEntries = 0; - public function __construct(EntityManagerInterface $em, ContentProxy $contentProxy, TagsAssigner $tagsAssigner, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger) - { - $this->em = $em; - $this->logger = $logger; - $this->contentProxy = $contentProxy; - $this->tagsAssigner = $tagsAssigner; - $this->eventDispatcher = $eventDispatcher; + public function __construct( + protected EntityManagerInterface $em, + protected ContentProxy $contentProxy, + protected TagsAssigner $tagsAssigner, + protected EventDispatcherInterface $eventDispatcher, + protected LoggerInterface $logger, + ) { } public function setLogger(LoggerInterface $logger): void @@ -178,9 +173,7 @@ abstract class AbstractImport implements ImportInterface $entryToBeFlushed = []; - // clear only affected entities - $this->em->clear(Entry::class); - $this->em->clear(Tag::class); + $this->em->clear(); } ++$i; } diff --git a/src/Import/WallabagV1Import.php b/src/Import/WallabagV1Import.php index 9463d4b95..2dfd7f404 100644 --- a/src/Import/WallabagV1Import.php +++ b/src/Import/WallabagV1Import.php @@ -10,14 +10,15 @@ use Wallabag\Helper\TagsAssigner; class WallabagV1Import extends WallabagImport { - protected $fetchingErrorMessage; - protected $fetchingErrorMessageTitle; - - public function __construct(EntityManagerInterface $em, ContentProxy $contentProxy, TagsAssigner $tagsAssigner, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger, $fetchingErrorMessageTitle, $fetchingErrorMessage) - { - $this->fetchingErrorMessageTitle = $fetchingErrorMessageTitle; - $this->fetchingErrorMessage = $fetchingErrorMessage; - + public function __construct( + EntityManagerInterface $em, + ContentProxy $contentProxy, + TagsAssigner $tagsAssigner, + EventDispatcherInterface $eventDispatcher, + LoggerInterface $logger, + protected $fetchingErrorMessageTitle, + protected $fetchingErrorMessage, + ) { parent::__construct($em, $contentProxy, $tagsAssigner, $eventDispatcher, $logger); } diff --git a/src/Mailer/AuthCodeMailer.php b/src/Mailer/AuthCodeMailer.php index 8707b178b..3cbc4674a 100644 --- a/src/Mailer/AuthCodeMailer.php +++ b/src/Mailer/AuthCodeMailer.php @@ -17,52 +17,17 @@ use Wallabag\Entity\User; class AuthCodeMailer implements AuthCodeMailerInterface { /** - * Mailer. - * - * @var MailerInterface + * @param string $senderEmail sender email address + * @param string $senderName sender name + * @param string $supportUrl support URL to report any bugs */ - private $mailer; - - /** - * Twig to render the html's email. - * - * @var Environment - */ - private $twig; - - /** - * Sender email address. - * - * @var string - */ - private $senderEmail; - - /** - * Sender name. - * - * @var string - */ - private $senderName; - - /** - * Support URL to report any bugs. - * - * @var string - */ - private $supportUrl; - - /** - * @param string $senderEmail - * @param string $senderName - * @param string $supportUrl wallabag support url - */ - public function __construct(MailerInterface $mailer, Environment $twig, $senderEmail, $senderName, $supportUrl) - { - $this->mailer = $mailer; - $this->twig = $twig; - $this->senderEmail = $senderEmail; - $this->senderName = $senderName; - $this->supportUrl = $supportUrl; + public function __construct( + private MailerInterface $mailer, + private Environment $twig, + private $senderEmail, + private $senderName, + private $supportUrl, + ) { } /** diff --git a/src/ParamConverter/UsernameFeedTokenConverter.php b/src/ParamConverter/UsernameFeedTokenConverter.php index 6f35027ad..186e725c3 100644 --- a/src/ParamConverter/UsernameFeedTokenConverter.php +++ b/src/ParamConverter/UsernameFeedTokenConverter.php @@ -18,14 +18,12 @@ use Wallabag\Repository\UserRepository; */ class UsernameFeedTokenConverter implements ParamConverterInterface { - private $registry; - /** * @param ManagerRegistry $registry Manager registry */ - public function __construct(?ManagerRegistry $registry = null) - { - $this->registry = $registry; + public function __construct( + private ?ManagerRegistry $registry = null, + ) { } /** diff --git a/src/Redis/Producer.php b/src/Redis/Producer.php index 9cc64aae3..8c455e0fc 100644 --- a/src/Redis/Producer.php +++ b/src/Redis/Producer.php @@ -15,11 +15,9 @@ use Simpleue\Queue\RedisQueue; */ class Producer implements ProducerInterface { - private $queue; - - public function __construct(RedisQueue $queue) - { - $this->queue = $queue; + public function __construct( + private RedisQueue $queue, + ) { } /** diff --git a/src/Repository/SiteCredentialRepository.php b/src/Repository/SiteCredentialRepository.php index 086c23b2d..631231b29 100644 --- a/src/Repository/SiteCredentialRepository.php +++ b/src/Repository/SiteCredentialRepository.php @@ -14,13 +14,11 @@ use Wallabag\Helper\CryptoProxy; */ class SiteCredentialRepository extends ServiceEntityRepository { - private $cryptoProxy; - - public function __construct(ManagerRegistry $registry, CryptoProxy $cryptoProxy) - { + public function __construct( + ManagerRegistry $registry, + private CryptoProxy $cryptoProxy, + ) { parent::__construct($registry, SiteCredential::class); - - $this->cryptoProxy = $cryptoProxy; } /** diff --git a/src/Security/Voter/AdminVoter.php b/src/Security/Voter/AdminVoter.php index f4d6dda68..fdd5fef47 100644 --- a/src/Security/Voter/AdminVoter.php +++ b/src/Security/Voter/AdminVoter.php @@ -14,11 +14,9 @@ class AdminVoter extends Voter public const LIST_IGNORE_ORIGIN_INSTANCE_RULES = 'LIST_IGNORE_ORIGIN_INSTANCE_RULES'; public const CREATE_IGNORE_ORIGIN_INSTANCE_RULES = 'CREATE_IGNORE_ORIGIN_INSTANCE_RULES'; - private Security $security; - - public function __construct(Security $security) - { - $this->security = $security; + public function __construct( + private Security $security, + ) { } protected function supports(string $attribute, $subject): bool diff --git a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php index d8ccf88e6..a63c24772 100644 --- a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php +++ b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php @@ -12,11 +12,9 @@ class IgnoreOriginInstanceRuleVoter extends Voter public const EDIT = 'EDIT'; public const DELETE = 'DELETE'; - private Security $security; - - public function __construct(Security $security) - { - $this->security = $security; + public function __construct( + private Security $security, + ) { } protected function supports(string $attribute, $subject): bool diff --git a/src/Security/Voter/MainVoter.php b/src/Security/Voter/MainVoter.php index b1f918ece..3b5ff92cd 100644 --- a/src/Security/Voter/MainVoter.php +++ b/src/Security/Voter/MainVoter.php @@ -21,11 +21,9 @@ class MainVoter extends Voter public const CREATE_SITE_CREDENTIALS = 'CREATE_SITE_CREDENTIALS'; public const EDIT_CONFIG = 'EDIT_CONFIG'; - private Security $security; - - public function __construct(Security $security) - { - $this->security = $security; + public function __construct( + private Security $security, + ) { } protected function supports(string $attribute, $subject): bool diff --git a/src/Security/Voter/UserVoter.php b/src/Security/Voter/UserVoter.php index 876f29aff..9e1bdced9 100644 --- a/src/Security/Voter/UserVoter.php +++ b/src/Security/Voter/UserVoter.php @@ -12,11 +12,9 @@ class UserVoter extends Voter public const EDIT = 'EDIT'; public const DELETE = 'DELETE'; - private Security $security; - - public function __construct(Security $security) - { - $this->security = $security; + public function __construct( + private Security $security, + ) { } protected function supports(string $attribute, $subject): bool diff --git a/src/SiteConfig/GrabySiteConfigBuilder.php b/src/SiteConfig/GrabySiteConfigBuilder.php index 3c3a18056..9bb01f6a1 100644 --- a/src/SiteConfig/GrabySiteConfigBuilder.php +++ b/src/SiteConfig/GrabySiteConfigBuilder.php @@ -9,35 +9,15 @@ use Wallabag\Repository\SiteCredentialRepository; class GrabySiteConfigBuilder implements SiteConfigBuilder { - /** - * @var ConfigBuilder - */ - private $grabyConfigBuilder; - - /** - * @var SiteCredentialRepository - */ - private $credentialRepository; - - /** - * @var LoggerInterface - */ - private $logger; - - /** - * @var TokenStorageInterface - */ - private $token; - /** * GrabySiteConfigBuilder constructor. */ - public function __construct(ConfigBuilder $grabyConfigBuilder, TokenStorageInterface $token, SiteCredentialRepository $credentialRepository, LoggerInterface $logger) - { - $this->grabyConfigBuilder = $grabyConfigBuilder; - $this->credentialRepository = $credentialRepository; - $this->logger = $logger; - $this->token = $token; + public function __construct( + private ConfigBuilder $grabyConfigBuilder, + private TokenStorageInterface $token, + private SiteCredentialRepository $credentialRepository, + private LoggerInterface $logger, + ) { } public function buildForHost($host) diff --git a/src/SiteConfig/LoginFormAuthenticator.php b/src/SiteConfig/LoginFormAuthenticator.php index 6a6eff8f1..f59013684 100644 --- a/src/SiteConfig/LoginFormAuthenticator.php +++ b/src/SiteConfig/LoginFormAuthenticator.php @@ -9,12 +9,12 @@ use Wallabag\ExpressionLanguage\AuthenticatorProvider; class LoginFormAuthenticator { - private HttpBrowser $browser; private ExpressionLanguage $expressionLanguage; - public function __construct(HttpBrowser $browser, AuthenticatorProvider $authenticatorProvider) - { - $this->browser = $browser; + public function __construct( + private HttpBrowser $browser, + AuthenticatorProvider $authenticatorProvider, + ) { $this->expressionLanguage = new ExpressionLanguage(null, [$authenticatorProvider]); } diff --git a/src/Twig/WallabagExtension.php b/src/Twig/WallabagExtension.php index f21187414..2aa5c7a66 100644 --- a/src/Twig/WallabagExtension.php +++ b/src/Twig/WallabagExtension.php @@ -15,23 +15,15 @@ use Wallabag\Repository\TagRepository; class WallabagExtension extends AbstractExtension implements GlobalsInterface { - private $tokenStorage; - private $entryRepository; - private $annotationRepository; - private $tagRepository; - private $lifeTime; - private $translator; - private $projectDir; - - public function __construct(EntryRepository $entryRepository, AnnotationRepository $annotationRepository, TagRepository $tagRepository, TokenStorageInterface $tokenStorage, $lifeTime, TranslatorInterface $translator, string $projectDir) - { - $this->entryRepository = $entryRepository; - $this->annotationRepository = $annotationRepository; - $this->tagRepository = $tagRepository; - $this->tokenStorage = $tokenStorage; - $this->lifeTime = $lifeTime; - $this->translator = $translator; - $this->projectDir = $projectDir; + public function __construct( + private EntryRepository $entryRepository, + private AnnotationRepository $annotationRepository, + private TagRepository $tagRepository, + private TokenStorageInterface $tokenStorage, + private $lifeTime, + private TranslatorInterface $translator, + private string $projectDir, + ) { } public function getGlobals(): array diff --git a/tests/Consumer/AMQPEntryConsumerTest.php b/tests/Consumer/AMQPEntryConsumerTest.php index b12aa0f6b..c0940298c 100644 --- a/tests/Consumer/AMQPEntryConsumerTest.php +++ b/tests/Consumer/AMQPEntryConsumerTest.php @@ -25,7 +25,7 @@ class AMQPEntryConsumerTest extends TestCase ->method('flush'); $em - ->expects($this->exactly(2)) + ->expects($this->once()) ->method('clear'); $body = <<<'JSON' diff --git a/tests/Consumer/RedisEntryConsumerTest.php b/tests/Consumer/RedisEntryConsumerTest.php index 6aa749f7d..0d4c6b758 100644 --- a/tests/Consumer/RedisEntryConsumerTest.php +++ b/tests/Consumer/RedisEntryConsumerTest.php @@ -24,7 +24,7 @@ class RedisEntryConsumerTest extends TestCase ->method('flush'); $em - ->expects($this->exactly(2)) + ->expects($this->once()) ->method('clear'); $body = <<<'JSON' From a107773c11e39f02a078ec32aad29239ae604951 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:56:56 +0200 Subject: [PATCH 10/18] Modernize to PHP 8.0 --- app/AppKernel.php | 19 +++---- rector.php | 2 +- src/Command/CleanDuplicatesCommand.php | 2 +- src/Command/GenerateUrlHashesCommand.php | 2 +- src/Command/Import/ImportCommand.php | 51 +++++-------------- src/Command/InstallCommand.php | 2 +- src/Command/ReloadEntryCommand.php | 2 +- src/Command/ShowUserCommand.php | 2 +- src/Command/TagAllCommand.php | 2 +- src/Controller/EntryController.php | 6 +-- src/Controller/FeedController.php | 27 ++++------ src/Controller/Import/ImportController.php | 4 +- src/Controller/TagController.php | 2 +- src/Controller/UserController.php | 2 +- src/Entity/Tag.php | 4 +- .../AuthenticatorProvider.php | 2 +- src/Helper/DownloadImages.php | 4 +- src/Security/Voter/AdminVoter.php | 13 ++--- src/Security/Voter/AnnotationVoter.php | 11 ++-- src/Security/Voter/EntryVoter.php | 23 ++------- .../Voter/IgnoreOriginInstanceRuleVoter.php | 11 ++-- .../Voter/IgnoreOriginUserRuleVoter.php | 11 ++-- src/Security/Voter/MainVoter.php | 21 ++------ src/Security/Voter/SiteCredentialVoter.php | 11 ++-- src/Security/Voter/TagVoter.php | 12 ++--- src/Security/Voter/TaggingRuleVoter.php | 11 ++-- src/SiteConfig/ArraySiteConfigBuilder.php | 2 +- src/SiteConfig/GrabySiteConfigBuilder.php | 2 +- src/SiteConfig/LoginFormAuthenticator.php | 4 +- src/Twig/WallabagExtension.php | 27 +++------- tests/WallabagTestCase.php | 2 +- 31 files changed, 97 insertions(+), 199 deletions(-) diff --git a/app/AppKernel.php b/app/AppKernel.php index 7beb05630..0b0cf7455 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -120,19 +120,12 @@ class AppKernel extends Kernel private function processDatabaseParameters(ContainerBuilder $container) { - switch ($container->getParameter('database_driver')) { - case 'pdo_mysql': - $scheme = 'mysql'; - break; - case 'pdo_pgsql': - $scheme = 'pgsql'; - break; - case 'pdo_sqlite': - $scheme = 'sqlite'; - break; - default: - throw new RuntimeException('Unsupported database driver: ' . $container->getParameter('database_driver')); - } + $scheme = match ($container->getParameter('database_driver')) { + 'pdo_mysql' => 'mysql', + 'pdo_pgsql' => 'pgsql', + 'pdo_sqlite' => 'sqlite', + default => throw new RuntimeException('Unsupported database driver: ' . $container->getParameter('database_driver')), + }; $container->setParameter('database_scheme', $scheme); diff --git a/rector.php b/rector.php index c2a859f6f..7480ccf1c 100644 --- a/rector.php +++ b/rector.php @@ -23,5 +23,5 @@ return RectorConfig::configure() __DIR__ . '/src/Entity/*', ], ]) - ->withPhpSets(php74: true) + ->withPhpSets(php80: true) ->withTypeCoverageLevel(0); diff --git a/src/Command/CleanDuplicatesCommand.php b/src/Command/CleanDuplicatesCommand.php index 0da8d630c..100c5b9e6 100644 --- a/src/Command/CleanDuplicatesCommand.php +++ b/src/Command/CleanDuplicatesCommand.php @@ -51,7 +51,7 @@ class CleanDuplicatesCommand extends Command try { $user = $this->getUser($username); $this->cleanDuplicates($user); - } catch (NoResultException $e) { + } catch (NoResultException) { $this->io->error(\sprintf('User "%s" not found.', $username)); return 1; diff --git a/src/Command/GenerateUrlHashesCommand.php b/src/Command/GenerateUrlHashesCommand.php index 47d9c7b38..82a8574c6 100644 --- a/src/Command/GenerateUrlHashesCommand.php +++ b/src/Command/GenerateUrlHashesCommand.php @@ -45,7 +45,7 @@ class GenerateUrlHashesCommand extends Command try { $user = $this->getUser($username); $this->generateHashedUrls($user); - } catch (NoResultException $e) { + } catch (NoResultException) { $output->writeln(\sprintf('User "%s" not found.', $username)); return 1; diff --git a/src/Command/Import/ImportCommand.php b/src/Command/Import/ImportCommand.php index 56aa04122..e3bff092c 100644 --- a/src/Command/Import/ImportCommand.php +++ b/src/Command/Import/ImportCommand.php @@ -97,43 +97,20 @@ class ImportCommand extends Command $this->tokenStorage->setToken($token); $user = $this->tokenStorage->getToken()->getUser(); - switch ($input->getOption('importer')) { - case 'v2': - $import = $this->wallabagV2Import; - break; - case 'firefox': - $import = $this->firefoxImport; - break; - case 'chrome': - $import = $this->chromeImport; - break; - case 'readability': - $import = $this->readabilityImport; - break; - case 'instapaper': - $import = $this->instapaperImport; - break; - case 'pinboard': - $import = $this->pinboardImport; - break; - case 'delicious': - $import = $this->deliciousImport; - break; - case 'elcurator': - $import = $this->elcuratorImport; - break; - case 'shaarli': - $import = $this->shaarliImport; - break; - case 'pocket': - $import = $this->pocketHtmlImport; - break; - case 'omnivore': - $import = $this->omnivoreImport; - break; - default: - $import = $this->wallabagV1Import; - } + $import = match ($input->getOption('importer')) { + 'v2' => $this->wallabagV2Import, + 'firefox' => $this->firefoxImport, + 'chrome' => $this->chromeImport, + 'readability' => $this->readabilityImport, + 'instapaper' => $this->instapaperImport, + 'pinboard' => $this->pinboardImport, + 'delicious' => $this->deliciousImport, + 'elcurator' => $this->elcuratorImport, + 'shaarli' => $this->shaarliImport, + 'pocket' => $this->pocketHtmlImport, + 'omnivore' => $this->omnivoreImport, + default => $this->wallabagV1Import, + }; $import->setMarkAsRead($input->getOption('markAsRead')); $import->setDisableContentUpdate($input->getOption('disableContentUpdate')); diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index af9f3a1a1..66a1cc1fe 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -402,7 +402,7 @@ class InstallCommand extends Command try { return \in_array($databaseName, $schemaManager->listDatabases(), true); - } catch (DriverException $e) { + } catch (DriverException) { // it means we weren't able to get database list, assume the database doesn't exist return false; diff --git a/src/Command/ReloadEntryCommand.php b/src/Command/ReloadEntryCommand.php index 68a47e5d0..7bfbaef3c 100644 --- a/src/Command/ReloadEntryCommand.php +++ b/src/Command/ReloadEntryCommand.php @@ -55,7 +55,7 @@ class ReloadEntryCommand extends Command $userId = $this->userRepository ->findOneByUserName($username) ->getId(); - } catch (NoResultException $e) { + } catch (NoResultException) { $io->error(\sprintf('User "%s" not found.', $username)); return 1; diff --git a/src/Command/ShowUserCommand.php b/src/Command/ShowUserCommand.php index be771df1c..f1b68c4cd 100644 --- a/src/Command/ShowUserCommand.php +++ b/src/Command/ShowUserCommand.php @@ -44,7 +44,7 @@ class ShowUserCommand extends Command try { $user = $this->getUser($username); $this->showUser($user); - } catch (NoResultException $e) { + } catch (NoResultException) { $this->io->error(\sprintf('User "%s" not found.', $username)); return 1; diff --git a/src/Command/TagAllCommand.php b/src/Command/TagAllCommand.php index bc135f42a..99fcf32ba 100644 --- a/src/Command/TagAllCommand.php +++ b/src/Command/TagAllCommand.php @@ -43,7 +43,7 @@ class TagAllCommand extends Command try { $user = $this->getUser($input->getArgument('username')); - } catch (NoResultException $e) { + } catch (NoResultException) { $io->error(\sprintf('User "%s" not found.', $input->getArgument('username'))); return 1; diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index 278731f23..84ba851f8 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -379,7 +379,7 @@ class EntryController extends AbstractController try { $entry = $this->entryRepository ->getRandomEntry($this->getUser()->getId(), $type); - } catch (NoResultException $e) { + } catch (NoResultException) { $this->addFlash('notice', 'flashes.entry.notice.no_random_entry'); return $this->redirect($this->generateUrl($type)); @@ -670,7 +670,7 @@ class EntryController extends AbstractController try { $entries->setCurrentPage($page); - } catch (OutOfRangeCurrentPageException $e) { + } catch (OutOfRangeCurrentPageException) { if ($page > 1) { return $this->redirect($this->generateUrl($type, ['page' => $entries->getNbPages()]), 302); } @@ -699,7 +699,7 @@ class EntryController extends AbstractController try { $this->contentProxy->updateEntry($entry, $entry->getUrl()); - } catch (\Exception $e) { + } catch (\Exception) { // $this->logger->error('Error while saving an entry', [ // 'exception' => $e, // 'entry' => $entry, diff --git a/src/Controller/FeedController.php b/src/Controller/FeedController.php index 6317ed8dd..c643052a8 100644 --- a/src/Controller/FeedController.php +++ b/src/Controller/FeedController.php @@ -141,7 +141,7 @@ class FeedController extends AbstractController try { $entries->setCurrentPage($page); - } catch (OutOfRangeCurrentPageException $e) { + } catch (OutOfRangeCurrentPageException) { if ($page > 1) { return $this->redirect($url . '?page=' . $entries->getNbPages(), 302); } @@ -189,22 +189,13 @@ class FeedController extends AbstractController */ private function showEntries(string $type, User $user, $page = 1) { - switch ($type) { - case 'starred': - $qb = $this->entryRepository->getBuilderForStarredByUser($user->getId()); - break; - case 'archive': - $qb = $this->entryRepository->getBuilderForArchiveByUser($user->getId()); - break; - case 'unread': - $qb = $this->entryRepository->getBuilderForUnreadByUser($user->getId()); - break; - case 'all': - $qb = $this->entryRepository->getBuilderForAllByUser($user->getId()); - break; - default: - throw new \InvalidArgumentException(\sprintf('Type "%s" is not implemented.', $type)); - } + $qb = match ($type) { + 'starred' => $this->entryRepository->getBuilderForStarredByUser($user->getId()), + 'archive' => $this->entryRepository->getBuilderForArchiveByUser($user->getId()), + 'unread' => $this->entryRepository->getBuilderForUnreadByUser($user->getId()), + 'all' => $this->entryRepository->getBuilderForAllByUser($user->getId()), + default => throw new \InvalidArgumentException(\sprintf('Type "%s" is not implemented.', $type)), + }; $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false); $entries = new Pagerfanta($pagerAdapter); @@ -223,7 +214,7 @@ class FeedController extends AbstractController try { $entries->setCurrentPage((int) $page); - } catch (OutOfRangeCurrentPageException $e) { + } catch (OutOfRangeCurrentPageException) { if ($page > 1) { return $this->redirect($url . '/' . $entries->getNbPages()); } diff --git a/src/Controller/Import/ImportController.php b/src/Controller/Import/ImportController.php index fe09e06a2..17a72a567 100644 --- a/src/Controller/Import/ImportController.php +++ b/src/Controller/Import/ImportController.php @@ -62,7 +62,7 @@ class ImportController extends AbstractController + $this->rabbitMQConsumerTotalProxy->getTotalMessage('pocket_html') + $this->rabbitMQConsumerTotalProxy->getTotalMessage('omnivore') ; - } catch (\Exception $e) { + } catch (\Exception) { $rabbitNotInstalled = true; } } elseif ($craueConfig->get('import_with_redis')) { @@ -81,7 +81,7 @@ class ImportController extends AbstractController + $this->redisClient->llen('wallabag.import.pocket_html') + $this->redisClient->llen('wallabag.import.omnivore') ; - } catch (\Exception $e) { + } catch (\Exception) { $redisNotInstalled = true; } } diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 859a9305d..87cb38322 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -153,7 +153,7 @@ class TagController extends AbstractController try { $entries->setCurrentPage($page); - } catch (OutOfRangeCurrentPageException $e) { + } catch (OutOfRangeCurrentPageException) { if ($page > 1) { return $this->redirect($this->generateUrl($request->attributes->get('_route'), [ 'slug' => $tag->getSlug(), diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index ae9568407..ef37bfe0c 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -169,7 +169,7 @@ class UserController extends AbstractController try { $pagerFanta->setCurrentPage($page); - } catch (OutOfRangeCurrentPageException $e) { + } catch (OutOfRangeCurrentPageException) { if ($page > 1) { return $this->redirect($this->generateUrl('user_index', ['page' => $pagerFanta->getNbPages()]), 302); } diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php index 47102f3ab..0816a5633 100644 --- a/src/Entity/Tag.php +++ b/src/Entity/Tag.php @@ -19,7 +19,7 @@ use Wallabag\Repository\TagRepository; #[ORM\Table(name: '`tag`')] #[ORM\Index(columns: ['label'])] #[ORM\Entity(repositoryClass: TagRepository::class)] -class Tag +class Tag implements \Stringable { /** * @var int @@ -54,7 +54,7 @@ class Tag $this->entries = new ArrayCollection(); } - public function __toString() + public function __toString(): string { return $this->label; } diff --git a/src/ExpressionLanguage/AuthenticatorProvider.php b/src/ExpressionLanguage/AuthenticatorProvider.php index 2d26a5ef0..f7a3d6392 100644 --- a/src/ExpressionLanguage/AuthenticatorProvider.php +++ b/src/ExpressionLanguage/AuthenticatorProvider.php @@ -67,7 +67,7 @@ class AuthenticatorProvider implements ExpressionFunctionProviderInterface $crawler = new Crawler((string) $html); $crawler = $crawler->filterXPath($xpathQuery); - } catch (\Throwable $e) { + } catch (\Throwable) { return ''; } diff --git a/src/Helper/DownloadImages.php b/src/Helper/DownloadImages.php index a997d3a0f..b3eedfc14 100644 --- a/src/Helper/DownloadImages.php +++ b/src/Helper/DownloadImages.php @@ -171,7 +171,7 @@ class DownloadImages try { $im = imagecreatefromstring($res->getContent()); - } catch (\Exception $e) { + } catch (\Exception) { $im = false; } @@ -190,7 +190,7 @@ class DownloadImages $imagick->readImageBlob($res->getContent()); $imagick->setImageFormat('gif'); $imagick->writeImages($localPath, true); - } catch (\Exception $e) { + } catch (\Exception) { // if Imagick fail, fallback to the default solution imagegif($im, $localPath); } diff --git a/src/Security/Voter/AdminVoter.php b/src/Security/Voter/AdminVoter.php index fdd5fef47..4baa12612 100644 --- a/src/Security/Voter/AdminVoter.php +++ b/src/Security/Voter/AdminVoter.php @@ -36,14 +36,9 @@ class AdminVoter extends Voter return false; } - switch ($attribute) { - case self::LIST_USERS: - case self::CREATE_USERS: - case self::LIST_IGNORE_ORIGIN_INSTANCE_RULES: - case self::CREATE_IGNORE_ORIGIN_INSTANCE_RULES: - return $this->security->isGranted('ROLE_SUPER_ADMIN'); - } - - return false; + return match ($attribute) { + self::LIST_USERS, self::CREATE_USERS, self::LIST_IGNORE_ORIGIN_INSTANCE_RULES, self::CREATE_IGNORE_ORIGIN_INSTANCE_RULES => $this->security->isGranted('ROLE_SUPER_ADMIN'), + default => false, + }; } } diff --git a/src/Security/Voter/AnnotationVoter.php b/src/Security/Voter/AnnotationVoter.php index 7bed72dbc..a4b021de6 100644 --- a/src/Security/Voter/AnnotationVoter.php +++ b/src/Security/Voter/AnnotationVoter.php @@ -35,12 +35,9 @@ class AnnotationVoter extends Voter return false; } - switch ($attribute) { - case self::EDIT: - case self::DELETE: - return $subject->getUser() === $user; - } - - return false; + return match ($attribute) { + self::EDIT, self::DELETE => $subject->getUser() === $user, + default => false, + }; } } diff --git a/src/Security/Voter/EntryVoter.php b/src/Security/Voter/EntryVoter.php index a9b354fea..202dacb8c 100644 --- a/src/Security/Voter/EntryVoter.php +++ b/src/Security/Voter/EntryVoter.php @@ -47,24 +47,9 @@ class EntryVoter extends Voter return false; } - switch ($attribute) { - case self::VIEW: - case self::EDIT: - case self::RELOAD: - case self::STAR: - case self::ARCHIVE: - case self::SHARE: - case self::UNSHARE: - case self::EXPORT: - case self::DELETE: - case self::LIST_ANNOTATIONS: - case self::CREATE_ANNOTATIONS: - case self::LIST_TAGS: - case self::TAG: - case self::UNTAG: - return $user === $subject->getUser(); - } - - return false; + return match ($attribute) { + self::VIEW, self::EDIT, self::RELOAD, self::STAR, self::ARCHIVE, self::SHARE, self::UNSHARE, self::EXPORT, self::DELETE, self::LIST_ANNOTATIONS, self::CREATE_ANNOTATIONS, self::LIST_TAGS, self::TAG, self::UNTAG => $user === $subject->getUser(), + default => false, + }; } } diff --git a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php index a63c24772..9fc6eb4a9 100644 --- a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php +++ b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php @@ -32,12 +32,9 @@ class IgnoreOriginInstanceRuleVoter extends Voter protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { - switch ($attribute) { - case self::EDIT: - case self::DELETE: - return $this->security->isGranted('ROLE_SUPER_ADMIN'); - } - - return false; + return match ($attribute) { + self::EDIT, self::DELETE => $this->security->isGranted('ROLE_SUPER_ADMIN'), + default => false, + }; } } diff --git a/src/Security/Voter/IgnoreOriginUserRuleVoter.php b/src/Security/Voter/IgnoreOriginUserRuleVoter.php index f7186f835..d6f9b15b6 100644 --- a/src/Security/Voter/IgnoreOriginUserRuleVoter.php +++ b/src/Security/Voter/IgnoreOriginUserRuleVoter.php @@ -35,12 +35,9 @@ class IgnoreOriginUserRuleVoter extends Voter return false; } - switch ($attribute) { - case self::EDIT: - case self::DELETE: - return $subject->getConfig()->getUser() === $user; - } - - return false; + return match ($attribute) { + self::EDIT, self::DELETE => $subject->getConfig()->getUser() === $user, + default => false, + }; } } diff --git a/src/Security/Voter/MainVoter.php b/src/Security/Voter/MainVoter.php index 3b5ff92cd..7915ac9c9 100644 --- a/src/Security/Voter/MainVoter.php +++ b/src/Security/Voter/MainVoter.php @@ -41,22 +41,9 @@ class MainVoter extends Voter protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool { - switch ($attribute) { - case self::LIST_ENTRIES: - case self::CREATE_ENTRIES: - case self::EDIT_ENTRIES: - case self::EXPORT_ENTRIES: - case self::IMPORT_ENTRIES: - case self::DELETE_ENTRIES: - case self::LIST_TAGS: - case self::CREATE_TAGS: - case self::DELETE_TAGS: - case self::LIST_SITE_CREDENTIALS: - case self::CREATE_SITE_CREDENTIALS: - case self::EDIT_CONFIG: - return $this->security->isGranted('ROLE_USER'); - } - - return false; + return match ($attribute) { + self::LIST_ENTRIES, self::CREATE_ENTRIES, self::EDIT_ENTRIES, self::EXPORT_ENTRIES, self::IMPORT_ENTRIES, self::DELETE_ENTRIES, self::LIST_TAGS, self::CREATE_TAGS, self::DELETE_TAGS, self::LIST_SITE_CREDENTIALS, self::CREATE_SITE_CREDENTIALS, self::EDIT_CONFIG => $this->security->isGranted('ROLE_USER'), + default => false, + }; } } diff --git a/src/Security/Voter/SiteCredentialVoter.php b/src/Security/Voter/SiteCredentialVoter.php index 35ab28484..89c6982d4 100644 --- a/src/Security/Voter/SiteCredentialVoter.php +++ b/src/Security/Voter/SiteCredentialVoter.php @@ -35,12 +35,9 @@ class SiteCredentialVoter extends Voter return false; } - switch ($attribute) { - case self::EDIT: - case self::DELETE: - return $user === $subject->getUser(); - } - - return false; + return match ($attribute) { + self::EDIT, self::DELETE => $user === $subject->getUser(), + default => false, + }; } } diff --git a/src/Security/Voter/TagVoter.php b/src/Security/Voter/TagVoter.php index e81b1944d..f5f239b1b 100644 --- a/src/Security/Voter/TagVoter.php +++ b/src/Security/Voter/TagVoter.php @@ -42,13 +42,9 @@ class TagVoter extends Voter return false; } - switch ($attribute) { - case self::VIEW: - case self::EDIT: - case self::DELETE: - return $this->security->isGranted('ROLE_USER'); - } - - return false; + return match ($attribute) { + self::VIEW, self::EDIT, self::DELETE => $this->security->isGranted('ROLE_USER'), + default => false, + }; } } diff --git a/src/Security/Voter/TaggingRuleVoter.php b/src/Security/Voter/TaggingRuleVoter.php index 01113957d..fc98ac66b 100644 --- a/src/Security/Voter/TaggingRuleVoter.php +++ b/src/Security/Voter/TaggingRuleVoter.php @@ -35,12 +35,9 @@ class TaggingRuleVoter extends Voter return false; } - switch ($attribute) { - case self::EDIT: - case self::DELETE: - return $subject->getConfig()->getUser() === $user; - } - - return false; + return match ($attribute) { + self::EDIT, self::DELETE => $subject->getConfig()->getUser() === $user, + default => false, + }; } } diff --git a/src/SiteConfig/ArraySiteConfigBuilder.php b/src/SiteConfig/ArraySiteConfigBuilder.php index 188ca42c9..c6d20a501 100644 --- a/src/SiteConfig/ArraySiteConfigBuilder.php +++ b/src/SiteConfig/ArraySiteConfigBuilder.php @@ -21,7 +21,7 @@ class ArraySiteConfigBuilder implements SiteConfigBuilder { $host = strtolower($host); - if ('www.' === substr($host, 0, 4)) { + if (str_starts_with($host, 'www.')) { $host = substr($host, 4); } diff --git a/src/SiteConfig/GrabySiteConfigBuilder.php b/src/SiteConfig/GrabySiteConfigBuilder.php index 9bb01f6a1..fe8ba1173 100644 --- a/src/SiteConfig/GrabySiteConfigBuilder.php +++ b/src/SiteConfig/GrabySiteConfigBuilder.php @@ -26,7 +26,7 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder // required by credentials below $host = strtolower($host); - if ('www.' === substr($host, 0, 4)) { + if (str_starts_with($host, 'www.')) { $host = substr($host, 4); } diff --git a/src/SiteConfig/LoginFormAuthenticator.php b/src/SiteConfig/LoginFormAuthenticator.php index f59013684..3a4050714 100644 --- a/src/SiteConfig/LoginFormAuthenticator.php +++ b/src/SiteConfig/LoginFormAuthenticator.php @@ -66,7 +66,7 @@ class LoginFormAuthenticator $crawler = new Crawler((string) $html); $loggedIn = $crawler->evaluate((string) $siteConfig->getNotLoggedInXpath()); - } catch (\Throwable $e) { + } catch (\Throwable) { return false; } @@ -98,7 +98,7 @@ class LoginFormAuthenticator $extraFields = []; foreach ($siteConfig->getExtraFields() as $fieldName => $fieldValue) { - if ('@=' === substr($fieldValue, 0, 2)) { + if (str_starts_with($fieldValue, '@=')) { $fieldValue = $this->expressionLanguage->evaluate( substr($fieldValue, 2), [ diff --git a/src/Twig/WallabagExtension.php b/src/Twig/WallabagExtension.php index 2aa5c7a66..649bc3503 100644 --- a/src/Twig/WallabagExtension.php +++ b/src/Twig/WallabagExtension.php @@ -89,25 +89,14 @@ class WallabagExtension extends AbstractExtension implements GlobalsInterface return 0; } - switch ($type) { - case 'starred': - $qb = $this->entryRepository->getCountBuilderForStarredByUser($user->getId())->select('COUNT(e.id)'); - break; - case 'archive': - $qb = $this->entryRepository->getCountBuilderForArchiveByUser($user->getId())->select('COUNT(e.id)'); - break; - case 'unread': - $qb = $this->entryRepository->getCountBuilderForUnreadByUser($user->getId())->select('COUNT(e.id)'); - break; - case 'annotated': - $qb = $this->annotationRepository->getCountBuilderByUser($user->getId())->select('COUNT(DISTINCT e.entry)'); - break; - case 'all': - $qb = $this->entryRepository->getCountBuilderForAllByUser($user->getId())->select('COUNT(e.id)'); - break; - default: - throw new \InvalidArgumentException(\sprintf('Type "%s" is not implemented.', $type)); - } + $qb = match ($type) { + 'starred' => $this->entryRepository->getCountBuilderForStarredByUser($user->getId())->select('COUNT(e.id)'), + 'archive' => $this->entryRepository->getCountBuilderForArchiveByUser($user->getId())->select('COUNT(e.id)'), + 'unread' => $this->entryRepository->getCountBuilderForUnreadByUser($user->getId())->select('COUNT(e.id)'), + 'annotated' => $this->annotationRepository->getCountBuilderByUser($user->getId())->select('COUNT(DISTINCT e.entry)'), + 'all' => $this->entryRepository->getCountBuilderForAllByUser($user->getId())->select('COUNT(e.id)'), + default => throw new \InvalidArgumentException(\sprintf('Type "%s" is not implemented.', $type)), + }; $query = $qb->getQuery(); $query->useQueryCache(true); diff --git a/tests/WallabagTestCase.php b/tests/WallabagTestCase.php index eed714980..9b31f8029 100644 --- a/tests/WallabagTestCase.php +++ b/tests/WallabagTestCase.php @@ -120,7 +120,7 @@ abstract class WallabagTestCase extends WebTestCase { try { $this->client->getContainer()->get(Client::class)->connect(); - } catch (\Exception $e) { + } catch (\Exception) { $this->markTestSkipped('Redis is not installed/activated'); } } From ca018c77e3b93e8ff7a1acdfe4a933f18501ec97 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 13:59:36 +0200 Subject: [PATCH 11/18] Migrate to readonly properties --- fixtures/IgnoreOriginInstanceRuleFixtures.php | 2 +- fixtures/InternalSettingFixtures.php | 2 +- fixtures/SiteCredentialFixtures.php | 2 +- rector.php | 4 +++ src/Command/CleanDownloadedImagesCommand.php | 4 +-- src/Command/CleanDuplicatesCommand.php | 6 ++-- src/Command/ExportCommand.php | 8 ++--- src/Command/GenerateUrlHashesCommand.php | 6 ++-- src/Command/Import/ImportCommand.php | 30 +++++++++---------- src/Command/Import/RedisWorkerCommand.php | 2 +- src/Command/InstallCommand.php | 14 ++++----- src/Command/ListUserCommand.php | 2 +- src/Command/ReloadEntryCommand.php | 10 +++---- src/Command/ShowUserCommand.php | 2 +- src/Command/TagAllCommand.php | 6 ++-- src/Command/UpdatePicturesPathCommand.php | 6 ++-- src/Consumer/RabbitMQConsumerTotalProxy.php | 26 ++++++++-------- src/Controller/ConfigController.php | 16 +++++----- src/Controller/EntryController.php | 16 +++++----- src/Controller/FeedController.php | 2 +- .../IgnoreOriginInstanceRuleController.php | 4 +-- src/Controller/Import/ChromeController.php | 8 ++--- src/Controller/Import/DeliciousController.php | 4 +-- src/Controller/Import/ElcuratorController.php | 8 ++--- src/Controller/Import/FirefoxController.php | 8 ++--- src/Controller/Import/ImportController.php | 4 +-- .../Import/InstapaperController.php | 4 +-- src/Controller/Import/OmnivoreController.php | 4 +-- src/Controller/Import/PinboardController.php | 4 +-- src/Controller/Import/PocketController.php | 8 ++--- .../Import/PocketHtmlController.php | 8 ++--- .../Import/ReadabilityController.php | 4 +-- src/Controller/Import/ShaarliController.php | 8 ++--- .../Import/WallabagV1Controller.php | 8 ++--- .../Import/WallabagV2Controller.php | 8 ++--- src/Controller/SiteCredentialController.php | 8 ++--- src/Controller/TagController.php | 8 ++--- src/Controller/UserController.php | 4 +-- src/Doctrine/MigrationFactoryDecorator.php | 8 ++--- .../AuthenticationFailureListener.php | 4 +-- src/Event/Listener/CreateConfigListener.php | 4 +-- .../Listener/PasswordResettingListener.php | 2 +- src/Event/Listener/RegistrationListener.php | 2 +- src/Event/Listener/UserLocaleListener.php | 2 +- .../Subscriber/DownloadImagesSubscriber.php | 6 ++-- .../GenerateCustomCSSSubscriber.php | 4 +-- .../SQLiteCascadeDeleteSubscriber.php | 2 +- .../Subscriber/SchemaAdapterSubscriber.php | 2 +- .../AuthenticatorProvider.php | 2 +- src/Form/Type/EntryFilterType.php | 4 +-- src/Helper/CryptoProxy.php | 2 +- src/Helper/DownloadImages.php | 4 +-- src/Helper/EntriesExport.php | 4 +-- src/Helper/PreparePagerForEntries.php | 2 +- src/Helper/Redirect.php | 4 +-- src/Helper/RuleBasedTagger.php | 8 ++--- src/HttpClient/Authenticator.php | 4 +-- src/HttpClient/WallabagClient.php | 8 ++--- src/Mailer/AuthCodeMailer.php | 4 +-- .../UsernameFeedTokenConverter.php | 2 +- src/Redis/Producer.php | 2 +- src/Repository/SiteCredentialRepository.php | 2 +- src/Repository/TagRepository.php | 2 +- src/Security/Voter/AdminVoter.php | 2 +- .../Voter/IgnoreOriginInstanceRuleVoter.php | 2 +- src/Security/Voter/MainVoter.php | 2 +- src/Security/Voter/TagVoter.php | 2 +- src/Security/Voter/UserVoter.php | 2 +- src/SiteConfig/GrabySiteConfigBuilder.php | 8 ++--- src/SiteConfig/LoginFormAuthenticator.php | 4 +-- src/Twig/WallabagExtension.php | 12 ++++---- 71 files changed, 203 insertions(+), 199 deletions(-) diff --git a/fixtures/IgnoreOriginInstanceRuleFixtures.php b/fixtures/IgnoreOriginInstanceRuleFixtures.php index d4a3da1c6..f425a0f1f 100644 --- a/fixtures/IgnoreOriginInstanceRuleFixtures.php +++ b/fixtures/IgnoreOriginInstanceRuleFixtures.php @@ -9,7 +9,7 @@ use Wallabag\Entity\IgnoreOriginInstanceRule; class IgnoreOriginInstanceRuleFixtures extends Fixture { public function __construct( - private array $defaultIgnoreOriginInstanceRules, + private readonly array $defaultIgnoreOriginInstanceRules, ) { } diff --git a/fixtures/InternalSettingFixtures.php b/fixtures/InternalSettingFixtures.php index cd81a5e98..1ca6d79cd 100644 --- a/fixtures/InternalSettingFixtures.php +++ b/fixtures/InternalSettingFixtures.php @@ -9,7 +9,7 @@ use Wallabag\Entity\InternalSetting; class InternalSettingFixtures extends Fixture { public function __construct( - private array $defaultInternalSettings, + private readonly array $defaultInternalSettings, ) { } diff --git a/fixtures/SiteCredentialFixtures.php b/fixtures/SiteCredentialFixtures.php index c6a089757..2657d9cec 100644 --- a/fixtures/SiteCredentialFixtures.php +++ b/fixtures/SiteCredentialFixtures.php @@ -12,7 +12,7 @@ use Wallabag\Helper\CryptoProxy; class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface { public function __construct( - private CryptoProxy $cryptoProxy, + private readonly CryptoProxy $cryptoProxy, ) { } diff --git a/rector.php b/rector.php index 7480ccf1c..0b8e5af6e 100644 --- a/rector.php +++ b/rector.php @@ -4,6 +4,7 @@ declare(strict_types=1); use Rector\Config\RectorConfig; use Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector; +use Rector\Php81\Rector\Property\ReadOnlyPropertyRector; return RectorConfig::configure() ->withPaths([ @@ -18,6 +19,9 @@ return RectorConfig::configure() ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) + ->withRules([ + ReadOnlyPropertyRector::class, + ]) ->withSkip([ ClassPropertyAssignToConstructorPromotionRector::class => [ __DIR__ . '/src/Entity/*', diff --git a/src/Command/CleanDownloadedImagesCommand.php b/src/Command/CleanDownloadedImagesCommand.php index fdbe09166..b35825828 100644 --- a/src/Command/CleanDownloadedImagesCommand.php +++ b/src/Command/CleanDownloadedImagesCommand.php @@ -17,8 +17,8 @@ class CleanDownloadedImagesCommand extends Command protected static $defaultDescription = 'Cleans downloaded images which are no more associated to an entry'; public function __construct( - private EntryRepository $entryRepository, - private DownloadImages $downloadImages, + private readonly EntryRepository $entryRepository, + private readonly DownloadImages $downloadImages, ) { parent::__construct(); } diff --git a/src/Command/CleanDuplicatesCommand.php b/src/Command/CleanDuplicatesCommand.php index 100c5b9e6..73e272961 100644 --- a/src/Command/CleanDuplicatesCommand.php +++ b/src/Command/CleanDuplicatesCommand.php @@ -23,9 +23,9 @@ class CleanDuplicatesCommand extends Command protected int $duplicates = 0; public function __construct( - private EntityManagerInterface $entityManager, - private EntryRepository $entryRepository, - private UserRepository $userRepository, + private readonly EntityManagerInterface $entityManager, + private readonly EntryRepository $entryRepository, + private readonly UserRepository $userRepository, ) { parent::__construct(); } diff --git a/src/Command/ExportCommand.php b/src/Command/ExportCommand.php index 399f74d99..85fc85991 100644 --- a/src/Command/ExportCommand.php +++ b/src/Command/ExportCommand.php @@ -18,10 +18,10 @@ class ExportCommand extends Command protected static $defaultDescription = 'Export all entries for an user'; public function __construct( - private EntryRepository $entryRepository, - private UserRepository $userRepository, - private EntriesExport $entriesExport, - private string $projectDir, + private readonly EntryRepository $entryRepository, + private readonly UserRepository $userRepository, + private readonly EntriesExport $entriesExport, + private readonly string $projectDir, ) { parent::__construct(); } diff --git a/src/Command/GenerateUrlHashesCommand.php b/src/Command/GenerateUrlHashesCommand.php index 82a8574c6..df50fd164 100644 --- a/src/Command/GenerateUrlHashesCommand.php +++ b/src/Command/GenerateUrlHashesCommand.php @@ -21,9 +21,9 @@ class GenerateUrlHashesCommand extends Command protected OutputInterface $output; public function __construct( - private EntityManagerInterface $entityManager, - private EntryRepository $entryRepository, - private UserRepository $userRepository, + private readonly EntityManagerInterface $entityManager, + private readonly EntryRepository $entryRepository, + private readonly UserRepository $userRepository, ) { parent::__construct(); } diff --git a/src/Command/Import/ImportCommand.php b/src/Command/Import/ImportCommand.php index e3bff092c..2f5b6ba18 100644 --- a/src/Command/Import/ImportCommand.php +++ b/src/Command/Import/ImportCommand.php @@ -34,21 +34,21 @@ class ImportCommand extends Command protected static $defaultDescription = 'Import entries from a JSON export'; public function __construct( - private EntityManagerInterface $entityManager, - private TokenStorageInterface $tokenStorage, - private UserRepository $userRepository, - private WallabagV2Import $wallabagV2Import, - private FirefoxImport $firefoxImport, - private ChromeImport $chromeImport, - private ReadabilityImport $readabilityImport, - private InstapaperImport $instapaperImport, - private PinboardImport $pinboardImport, - private DeliciousImport $deliciousImport, - private WallabagV1Import $wallabagV1Import, - private ElcuratorImport $elcuratorImport, - private ShaarliImport $shaarliImport, - private PocketHtmlImport $pocketHtmlImport, - private OmnivoreImport $omnivoreImport, + private readonly EntityManagerInterface $entityManager, + private readonly TokenStorageInterface $tokenStorage, + private readonly UserRepository $userRepository, + private readonly WallabagV2Import $wallabagV2Import, + private readonly FirefoxImport $firefoxImport, + private readonly ChromeImport $chromeImport, + private readonly ReadabilityImport $readabilityImport, + private readonly InstapaperImport $instapaperImport, + private readonly PinboardImport $pinboardImport, + private readonly DeliciousImport $deliciousImport, + private readonly WallabagV1Import $wallabagV1Import, + private readonly ElcuratorImport $elcuratorImport, + private readonly ShaarliImport $shaarliImport, + private readonly PocketHtmlImport $pocketHtmlImport, + private readonly OmnivoreImport $omnivoreImport, ) { parent::__construct(); } diff --git a/src/Command/Import/RedisWorkerCommand.php b/src/Command/Import/RedisWorkerCommand.php index bb614b48f..266863be2 100644 --- a/src/Command/Import/RedisWorkerCommand.php +++ b/src/Command/Import/RedisWorkerCommand.php @@ -17,7 +17,7 @@ class RedisWorkerCommand extends Command protected static $defaultDescription = 'Launch Redis worker'; public function __construct( - private ContainerInterface $container, + private readonly ContainerInterface $container, ) { parent::__construct(); } diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index 66a1cc1fe..fd6802b0c 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -38,13 +38,13 @@ class InstallCommand extends Command ]; public function __construct( - private EntityManagerInterface $entityManager, - private EventDispatcherInterface $dispatcher, - private UserManagerInterface $userManager, - private TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, - private string $databaseDriver, - private array $defaultSettings, - private array $defaultIgnoreOriginInstanceRules, + private readonly EntityManagerInterface $entityManager, + private readonly EventDispatcherInterface $dispatcher, + private readonly UserManagerInterface $userManager, + private readonly TableMetadataStorageConfiguration $tableMetadataStorageConfiguration, + private readonly string $databaseDriver, + private readonly array $defaultSettings, + private readonly array $defaultIgnoreOriginInstanceRules, ) { parent::__construct(); } diff --git a/src/Command/ListUserCommand.php b/src/Command/ListUserCommand.php index 28dac48b1..b76e059d3 100644 --- a/src/Command/ListUserCommand.php +++ b/src/Command/ListUserCommand.php @@ -16,7 +16,7 @@ class ListUserCommand extends Command protected static $defaultDescription = 'List all users'; public function __construct( - private UserRepository $userRepository, + private readonly UserRepository $userRepository, ) { parent::__construct(); } diff --git a/src/Command/ReloadEntryCommand.php b/src/Command/ReloadEntryCommand.php index 7bfbaef3c..2ba48d2fe 100644 --- a/src/Command/ReloadEntryCommand.php +++ b/src/Command/ReloadEntryCommand.php @@ -22,11 +22,11 @@ class ReloadEntryCommand extends Command protected static $defaultDescription = 'Reload entries'; public function __construct( - private EntryRepository $entryRepository, - private UserRepository $userRepository, - private EntityManagerInterface $entityManager, - private ContentProxy $contentProxy, - private EventDispatcherInterface $dispatcher, + private readonly EntryRepository $entryRepository, + private readonly UserRepository $userRepository, + private readonly EntityManagerInterface $entityManager, + private readonly ContentProxy $contentProxy, + private readonly EventDispatcherInterface $dispatcher, ) { parent::__construct(); } diff --git a/src/Command/ShowUserCommand.php b/src/Command/ShowUserCommand.php index f1b68c4cd..ad03c63bc 100644 --- a/src/Command/ShowUserCommand.php +++ b/src/Command/ShowUserCommand.php @@ -19,7 +19,7 @@ class ShowUserCommand extends Command protected SymfonyStyle $io; public function __construct( - private UserRepository $userRepository, + private readonly UserRepository $userRepository, ) { parent::__construct(); } diff --git a/src/Command/TagAllCommand.php b/src/Command/TagAllCommand.php index 99fcf32ba..4a0fa0905 100644 --- a/src/Command/TagAllCommand.php +++ b/src/Command/TagAllCommand.php @@ -19,9 +19,9 @@ class TagAllCommand extends Command protected static $defaultDescription = 'Tag all entries using the tagging rules.'; public function __construct( - private EntityManagerInterface $entityManager, - private RuleBasedTagger $ruleBasedTagger, - private UserRepository $userRepository, + private readonly EntityManagerInterface $entityManager, + private readonly RuleBasedTagger $ruleBasedTagger, + private readonly UserRepository $userRepository, ) { parent::__construct(); } diff --git a/src/Command/UpdatePicturesPathCommand.php b/src/Command/UpdatePicturesPathCommand.php index aff65bc33..40f144369 100644 --- a/src/Command/UpdatePicturesPathCommand.php +++ b/src/Command/UpdatePicturesPathCommand.php @@ -16,9 +16,9 @@ class UpdatePicturesPathCommand extends Command protected static $defaultDescription = 'Update the path of the pictures for each entry when you changed your wallabag instance URL.'; public function __construct( - private EntityManagerInterface $entityManager, - private EntryRepository $entryRepository, - private string $wallabagUrl, + private readonly EntityManagerInterface $entityManager, + private readonly EntryRepository $entryRepository, + private readonly string $wallabagUrl, ) { parent::__construct(); } diff --git a/src/Consumer/RabbitMQConsumerTotalProxy.php b/src/Consumer/RabbitMQConsumerTotalProxy.php index 7906ac5d8..b32a0653a 100644 --- a/src/Consumer/RabbitMQConsumerTotalProxy.php +++ b/src/Consumer/RabbitMQConsumerTotalProxy.php @@ -11,19 +11,19 @@ use OldSound\RabbitMqBundle\RabbitMq\Consumer; class RabbitMQConsumerTotalProxy { public function __construct( - private Consumer $pocketConsumer, - private Consumer $readabilityConsumer, - private Consumer $wallabagV1Consumer, - private Consumer $wallabagV2Consumer, - private Consumer $firefoxConsumer, - private Consumer $chromeConsumer, - private Consumer $instapaperConsumer, - private Consumer $pinboardConsumer, - private Consumer $deliciousConsumer, - private Consumer $elcuratorConsumer, - private Consumer $shaarliConsumer, - private Consumer $pocketHtmlConsumer, - private Consumer $omnivoreConsumer, + private readonly Consumer $pocketConsumer, + private readonly Consumer $readabilityConsumer, + private readonly Consumer $wallabagV1Consumer, + private readonly Consumer $wallabagV2Consumer, + private readonly Consumer $firefoxConsumer, + private readonly Consumer $chromeConsumer, + private readonly Consumer $instapaperConsumer, + private readonly Consumer $pinboardConsumer, + private readonly Consumer $deliciousConsumer, + private readonly Consumer $elcuratorConsumer, + private readonly Consumer $shaarliConsumer, + private readonly Consumer $pocketHtmlConsumer, + private readonly Consumer $omnivoreConsumer, ) { } diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index d3776d996..0d3e344d4 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -45,14 +45,14 @@ use Wallabag\Tools\Utils; class ConfigController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private UserManagerInterface $userManager, - private EntryRepository $entryRepository, - private TagRepository $tagRepository, - private AnnotationRepository $annotationRepository, - private ConfigRepository $configRepository, - private EventDispatcherInterface $eventDispatcher, - private Redirect $redirectHelper, + private readonly EntityManagerInterface $entityManager, + private readonly UserManagerInterface $userManager, + private readonly EntryRepository $entryRepository, + private readonly TagRepository $tagRepository, + private readonly AnnotationRepository $annotationRepository, + private readonly ConfigRepository $configRepository, + private readonly EventDispatcherInterface $eventDispatcher, + private readonly Redirect $redirectHelper, ) { } diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index 84ba851f8..c5c25289b 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -34,14 +34,14 @@ use Wallabag\Repository\TagRepository; class EntryController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private EventDispatcherInterface $eventDispatcher, - private EntryRepository $entryRepository, - private Redirect $redirectHelper, - private PreparePagerForEntries $preparePagerForEntriesHelper, - private FilterBuilderUpdaterInterface $filterBuilderUpdater, - private ContentProxy $contentProxy, - private Security $security, + private readonly EntityManagerInterface $entityManager, + private readonly EventDispatcherInterface $eventDispatcher, + private readonly EntryRepository $entryRepository, + private readonly Redirect $redirectHelper, + private readonly PreparePagerForEntries $preparePagerForEntriesHelper, + private readonly FilterBuilderUpdaterInterface $filterBuilderUpdater, + private readonly ContentProxy $contentProxy, + private readonly Security $security, ) { } diff --git a/src/Controller/FeedController.php b/src/Controller/FeedController.php index c643052a8..8756f0fbd 100644 --- a/src/Controller/FeedController.php +++ b/src/Controller/FeedController.php @@ -21,7 +21,7 @@ use Wallabag\Repository\EntryRepository; class FeedController extends AbstractController { public function __construct( - private EntryRepository $entryRepository, + private readonly EntryRepository $entryRepository, ) { } diff --git a/src/Controller/IgnoreOriginInstanceRuleController.php b/src/Controller/IgnoreOriginInstanceRuleController.php index 6b4d3c2d6..39029311c 100644 --- a/src/Controller/IgnoreOriginInstanceRuleController.php +++ b/src/Controller/IgnoreOriginInstanceRuleController.php @@ -21,8 +21,8 @@ use Wallabag\Repository\IgnoreOriginInstanceRuleRepository; class IgnoreOriginInstanceRuleController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private TranslatorInterface $translator, + private readonly EntityManagerInterface $entityManager, + private readonly TranslatorInterface $translator, ) { } diff --git a/src/Controller/Import/ChromeController.php b/src/Controller/Import/ChromeController.php index 7feb2714e..b579d6196 100644 --- a/src/Controller/Import/ChromeController.php +++ b/src/Controller/Import/ChromeController.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class ChromeController extends BrowserController { public function __construct( - private ChromeImport $chromeImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly ChromeImport $chromeImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/DeliciousController.php b/src/Controller/Import/DeliciousController.php index 4d110398f..20fb5d892 100644 --- a/src/Controller/Import/DeliciousController.php +++ b/src/Controller/Import/DeliciousController.php @@ -16,8 +16,8 @@ use Wallabag\Redis\Producer as RedisProducer; class DeliciousController extends AbstractController { public function __construct( - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/ElcuratorController.php b/src/Controller/Import/ElcuratorController.php index f5cc28162..595fa20b0 100644 --- a/src/Controller/Import/ElcuratorController.php +++ b/src/Controller/Import/ElcuratorController.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class ElcuratorController extends WallabagController { public function __construct( - private ElcuratorImport $elcuratorImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly ElcuratorImport $elcuratorImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/FirefoxController.php b/src/Controller/Import/FirefoxController.php index c3891ae2f..c65447c44 100644 --- a/src/Controller/Import/FirefoxController.php +++ b/src/Controller/Import/FirefoxController.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class FirefoxController extends BrowserController { public function __construct( - private FirefoxImport $firefoxImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly FirefoxImport $firefoxImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/ImportController.php b/src/Controller/Import/ImportController.php index 17a72a567..dbdbd6377 100644 --- a/src/Controller/Import/ImportController.php +++ b/src/Controller/Import/ImportController.php @@ -14,8 +14,8 @@ use Wallabag\Import\ImportChain; class ImportController extends AbstractController { public function __construct( - private RabbitMQConsumerTotalProxy $rabbitMQConsumerTotalProxy, - private Client $redisClient, + private readonly RabbitMQConsumerTotalProxy $rabbitMQConsumerTotalProxy, + private readonly Client $redisClient, ) { } diff --git a/src/Controller/Import/InstapaperController.php b/src/Controller/Import/InstapaperController.php index c764e8457..88a62c1e7 100644 --- a/src/Controller/Import/InstapaperController.php +++ b/src/Controller/Import/InstapaperController.php @@ -16,8 +16,8 @@ use Wallabag\Redis\Producer as RedisProducer; class InstapaperController extends AbstractController { public function __construct( - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/OmnivoreController.php b/src/Controller/Import/OmnivoreController.php index ae41f6c98..3101a99fe 100644 --- a/src/Controller/Import/OmnivoreController.php +++ b/src/Controller/Import/OmnivoreController.php @@ -16,8 +16,8 @@ use Wallabag\Redis\Producer as RedisProducer; class OmnivoreController extends AbstractController { public function __construct( - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/PinboardController.php b/src/Controller/Import/PinboardController.php index 2fa3381a6..1ac75bd75 100644 --- a/src/Controller/Import/PinboardController.php +++ b/src/Controller/Import/PinboardController.php @@ -16,8 +16,8 @@ use Wallabag\Redis\Producer as RedisProducer; class PinboardController extends AbstractController { public function __construct( - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/PocketController.php b/src/Controller/Import/PocketController.php index 0197ef4dd..7cd0ec06c 100644 --- a/src/Controller/Import/PocketController.php +++ b/src/Controller/Import/PocketController.php @@ -18,10 +18,10 @@ use Wallabag\Redis\Producer as RedisProducer; class PocketController extends AbstractController { public function __construct( - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, - private SessionInterface $session, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, + private readonly SessionInterface $session, ) { } diff --git a/src/Controller/Import/PocketHtmlController.php b/src/Controller/Import/PocketHtmlController.php index fa0ecee67..1f9db0b06 100644 --- a/src/Controller/Import/PocketHtmlController.php +++ b/src/Controller/Import/PocketHtmlController.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class PocketHtmlController extends HtmlController { public function __construct( - private PocketHtmlImport $pocketHtmlImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly PocketHtmlImport $pocketHtmlImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/ReadabilityController.php b/src/Controller/Import/ReadabilityController.php index 0d90f1eec..4af63f5ae 100644 --- a/src/Controller/Import/ReadabilityController.php +++ b/src/Controller/Import/ReadabilityController.php @@ -16,8 +16,8 @@ use Wallabag\Redis\Producer as RedisProducer; class ReadabilityController extends AbstractController { public function __construct( - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/ShaarliController.php b/src/Controller/Import/ShaarliController.php index f02539365..b936d0251 100644 --- a/src/Controller/Import/ShaarliController.php +++ b/src/Controller/Import/ShaarliController.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class ShaarliController extends HtmlController { public function __construct( - private ShaarliImport $shaarliImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly ShaarliImport $shaarliImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/WallabagV1Controller.php b/src/Controller/Import/WallabagV1Controller.php index 7ad6e32fe..47f4c74c5 100644 --- a/src/Controller/Import/WallabagV1Controller.php +++ b/src/Controller/Import/WallabagV1Controller.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class WallabagV1Controller extends WallabagController { public function __construct( - private WallabagV1Import $wallabagImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly WallabagV1Import $wallabagImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/Import/WallabagV2Controller.php b/src/Controller/Import/WallabagV2Controller.php index f676438cd..d185cae0b 100644 --- a/src/Controller/Import/WallabagV2Controller.php +++ b/src/Controller/Import/WallabagV2Controller.php @@ -14,10 +14,10 @@ use Wallabag\Redis\Producer as RedisProducer; class WallabagV2Controller extends WallabagController { public function __construct( - private WallabagV2Import $wallabagImport, - private Config $craueConfig, - private RabbitMqProducer $rabbitMqProducer, - private RedisProducer $redisProducer, + private readonly WallabagV2Import $wallabagImport, + private readonly Config $craueConfig, + private readonly RabbitMqProducer $rabbitMqProducer, + private readonly RedisProducer $redisProducer, ) { } diff --git a/src/Controller/SiteCredentialController.php b/src/Controller/SiteCredentialController.php index 2e6a55e38..7f60d692a 100644 --- a/src/Controller/SiteCredentialController.php +++ b/src/Controller/SiteCredentialController.php @@ -24,10 +24,10 @@ use Wallabag\Repository\SiteCredentialRepository; class SiteCredentialController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private TranslatorInterface $translator, - private CryptoProxy $cryptoProxy, - private Config $craueConfig, + private readonly EntityManagerInterface $entityManager, + private readonly TranslatorInterface $translator, + private readonly CryptoProxy $cryptoProxy, + private readonly Config $craueConfig, ) { } diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 87cb38322..9a3db5360 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -26,10 +26,10 @@ use Wallabag\Repository\TagRepository; class TagController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private TagsAssigner $tagsAssigner, - private Redirect $redirectHelper, - private Security $security, + private readonly EntityManagerInterface $entityManager, + private readonly TagsAssigner $tagsAssigner, + private readonly Redirect $redirectHelper, + private readonly Security $security, ) { } diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index ef37bfe0c..74af9c3ed 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -30,8 +30,8 @@ use Wallabag\Repository\UserRepository; class UserController extends AbstractController { public function __construct( - private EntityManagerInterface $entityManager, - private TranslatorInterface $translator, + private readonly EntityManagerInterface $entityManager, + private readonly TranslatorInterface $translator, ) { } diff --git a/src/Doctrine/MigrationFactoryDecorator.php b/src/Doctrine/MigrationFactoryDecorator.php index 0737fbfa6..b99f31af0 100644 --- a/src/Doctrine/MigrationFactoryDecorator.php +++ b/src/Doctrine/MigrationFactoryDecorator.php @@ -11,10 +11,10 @@ use Doctrine\Migrations\Version\MigrationFactory; class MigrationFactoryDecorator implements MigrationFactory { public function __construct( - private MigrationFactory $migrationFactory, - private string $tablePrefix, - private array $defaultIgnoreOriginInstanceRules, - private string $fetchingErrorMessage, + private readonly MigrationFactory $migrationFactory, + private readonly string $tablePrefix, + private readonly array $defaultIgnoreOriginInstanceRules, + private readonly string $fetchingErrorMessage, ) { } diff --git a/src/Event/Listener/AuthenticationFailureListener.php b/src/Event/Listener/AuthenticationFailureListener.php index 24d167c71..077eeec80 100644 --- a/src/Event/Listener/AuthenticationFailureListener.php +++ b/src/Event/Listener/AuthenticationFailureListener.php @@ -10,8 +10,8 @@ use Symfony\Component\Security\Http\Event\LoginFailureEvent; class AuthenticationFailureListener implements EventSubscriberInterface { public function __construct( - private RequestStack $requestStack, - private LoggerInterface $logger, + private readonly RequestStack $requestStack, + private readonly LoggerInterface $logger, ) { } diff --git a/src/Event/Listener/CreateConfigListener.php b/src/Event/Listener/CreateConfigListener.php index fe8e1c929..e7af5a15b 100644 --- a/src/Event/Listener/CreateConfigListener.php +++ b/src/Event/Listener/CreateConfigListener.php @@ -16,7 +16,7 @@ use Wallabag\Entity\Config; class CreateConfigListener implements EventSubscriberInterface { public function __construct( - private EntityManagerInterface $em, + private readonly EntityManagerInterface $em, private $itemsOnPage, private $feedLimit, private $language, @@ -24,7 +24,7 @@ class CreateConfigListener implements EventSubscriberInterface private $actionMarkAsRead, private $listMode, private $displayThumbnails, - private RequestStack $requestStack, + private readonly RequestStack $requestStack, ) { } diff --git a/src/Event/Listener/PasswordResettingListener.php b/src/Event/Listener/PasswordResettingListener.php index 4d3954b7d..b34522167 100644 --- a/src/Event/Listener/PasswordResettingListener.php +++ b/src/Event/Listener/PasswordResettingListener.php @@ -16,7 +16,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class PasswordResettingListener implements EventSubscriberInterface { public function __construct( - private UrlGeneratorInterface $router, + private readonly UrlGeneratorInterface $router, ) { } diff --git a/src/Event/Listener/RegistrationListener.php b/src/Event/Listener/RegistrationListener.php index 3581c074a..eaeef75f5 100644 --- a/src/Event/Listener/RegistrationListener.php +++ b/src/Event/Listener/RegistrationListener.php @@ -15,7 +15,7 @@ class RegistrationListener implements EventSubscriberInterface */ public function __construct( private $registrationEnabled, - private UrlGeneratorInterface $urlGenerator, + private readonly UrlGeneratorInterface $urlGenerator, ) { } diff --git a/src/Event/Listener/UserLocaleListener.php b/src/Event/Listener/UserLocaleListener.php index 7387de92f..5c9403376 100644 --- a/src/Event/Listener/UserLocaleListener.php +++ b/src/Event/Listener/UserLocaleListener.php @@ -17,7 +17,7 @@ use Wallabag\Entity\User; class UserLocaleListener { public function __construct( - private SessionInterface $session, + private readonly SessionInterface $session, ) { } diff --git a/src/Event/Subscriber/DownloadImagesSubscriber.php b/src/Event/Subscriber/DownloadImagesSubscriber.php index 68c5a2049..5324f449c 100644 --- a/src/Event/Subscriber/DownloadImagesSubscriber.php +++ b/src/Event/Subscriber/DownloadImagesSubscriber.php @@ -13,10 +13,10 @@ use Wallabag\Helper\DownloadImages; class DownloadImagesSubscriber implements EventSubscriberInterface { public function __construct( - private EntityManagerInterface $em, - private DownloadImages $downloadImages, + private readonly EntityManagerInterface $em, + private readonly DownloadImages $downloadImages, private $enabled, - private LoggerInterface $logger, + private readonly LoggerInterface $logger, ) { } diff --git a/src/Event/Subscriber/GenerateCustomCSSSubscriber.php b/src/Event/Subscriber/GenerateCustomCSSSubscriber.php index f6a47889f..06dfbdbd5 100644 --- a/src/Event/Subscriber/GenerateCustomCSSSubscriber.php +++ b/src/Event/Subscriber/GenerateCustomCSSSubscriber.php @@ -10,8 +10,8 @@ use Wallabag\Event\ConfigUpdatedEvent; class GenerateCustomCSSSubscriber implements EventSubscriberInterface { public function __construct( - private EntityManagerInterface $em, - private Compiler $compiler, + private readonly EntityManagerInterface $em, + private readonly Compiler $compiler, ) { } diff --git a/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php b/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php index 622cad030..5e3e2ea68 100644 --- a/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php +++ b/src/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php @@ -18,7 +18,7 @@ use Wallabag\Entity\Entry; class SQLiteCascadeDeleteSubscriber implements EventSubscriber { public function __construct( - private ManagerRegistry $doctrine, + private readonly ManagerRegistry $doctrine, ) { } diff --git a/src/Event/Subscriber/SchemaAdapterSubscriber.php b/src/Event/Subscriber/SchemaAdapterSubscriber.php index dcee8c540..ae02181dd 100644 --- a/src/Event/Subscriber/SchemaAdapterSubscriber.php +++ b/src/Event/Subscriber/SchemaAdapterSubscriber.php @@ -9,7 +9,7 @@ use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs; class SchemaAdapterSubscriber implements EventSubscriber { public function __construct( - private string $databaseTablePrefix, + private readonly string $databaseTablePrefix, ) { } diff --git a/src/ExpressionLanguage/AuthenticatorProvider.php b/src/ExpressionLanguage/AuthenticatorProvider.php index f7a3d6392..c98db51fd 100644 --- a/src/ExpressionLanguage/AuthenticatorProvider.php +++ b/src/ExpressionLanguage/AuthenticatorProvider.php @@ -10,7 +10,7 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; class AuthenticatorProvider implements ExpressionFunctionProviderInterface { public function __construct( - private HttpClientInterface $requestHtmlFunctionClient, + private readonly HttpClientInterface $requestHtmlFunctionClient, ) { } diff --git a/src/Form/Type/EntryFilterType.php b/src/Form/Type/EntryFilterType.php index c95cb22f2..f4e9b76f0 100644 --- a/src/Form/Type/EntryFilterType.php +++ b/src/Form/Type/EntryFilterType.php @@ -25,8 +25,8 @@ class EntryFilterType extends AbstractType * Repository & user are used to get a list of language entries for this user. */ public function __construct( - private EntryRepository $repository, - private TokenStorageInterface $tokenStorage, + private readonly EntryRepository $repository, + private readonly TokenStorageInterface $tokenStorage, ) { } diff --git a/src/Helper/CryptoProxy.php b/src/Helper/CryptoProxy.php index 434e8e04d..fc1814109 100644 --- a/src/Helper/CryptoProxy.php +++ b/src/Helper/CryptoProxy.php @@ -17,7 +17,7 @@ class CryptoProxy public function __construct( $encryptionKeyPath, - private LoggerInterface $logger, + private readonly LoggerInterface $logger, ) { if (!file_exists($encryptionKeyPath)) { $key = Key::createNewRandomKey(); diff --git a/src/Helper/DownloadImages.php b/src/Helper/DownloadImages.php index b3eedfc14..afce04c90 100644 --- a/src/Helper/DownloadImages.php +++ b/src/Helper/DownloadImages.php @@ -20,10 +20,10 @@ class DownloadImages private $wallabagUrl; public function __construct( - private HttpClientInterface $client, + private readonly HttpClientInterface $client, private $baseFolder, $wallabagUrl, - private LoggerInterface $logger, + private readonly LoggerInterface $logger, ) { $this->wallabagUrl = rtrim($wallabagUrl, '/'); $this->mimeTypes = new MimeTypes(); diff --git a/src/Helper/EntriesExport.php b/src/Helper/EntriesExport.php index da004b05e..64360c3e2 100644 --- a/src/Helper/EntriesExport.php +++ b/src/Helper/EntriesExport.php @@ -31,10 +31,10 @@ class EntriesExport * @param TokenStorageInterface $tokenStorage Needed to retrieve the current user */ public function __construct( - private TranslatorInterface $translator, + private readonly TranslatorInterface $translator, private $wallabagUrl, private $logoPath, - private TokenStorageInterface $tokenStorage, + private readonly TokenStorageInterface $tokenStorage, ) { } diff --git a/src/Helper/PreparePagerForEntries.php b/src/Helper/PreparePagerForEntries.php index 808c70ccf..fe0446e6a 100644 --- a/src/Helper/PreparePagerForEntries.php +++ b/src/Helper/PreparePagerForEntries.php @@ -11,7 +11,7 @@ use Wallabag\Entity\User; class PreparePagerForEntries { public function __construct( - private TokenStorageInterface $tokenStorage, + private readonly TokenStorageInterface $tokenStorage, ) { } diff --git a/src/Helper/Redirect.php b/src/Helper/Redirect.php index cd2b7b23d..77aec7ab4 100644 --- a/src/Helper/Redirect.php +++ b/src/Helper/Redirect.php @@ -14,8 +14,8 @@ use Wallabag\Entity\User; class Redirect { public function __construct( - private UrlGeneratorInterface $router, - private TokenStorageInterface $tokenStorage, + private readonly UrlGeneratorInterface $router, + private readonly TokenStorageInterface $tokenStorage, ) { } diff --git a/src/Helper/RuleBasedTagger.php b/src/Helper/RuleBasedTagger.php index a3a17d651..d40604d50 100644 --- a/src/Helper/RuleBasedTagger.php +++ b/src/Helper/RuleBasedTagger.php @@ -15,10 +15,10 @@ use Wallabag\Repository\TagRepository; class RuleBasedTagger { public function __construct( - private RulerZ $rulerz, - private TagRepository $tagRepository, - private EntryRepository $entryRepository, - private LoggerInterface $logger, + private readonly RulerZ $rulerz, + private readonly TagRepository $tagRepository, + private readonly EntryRepository $entryRepository, + private readonly LoggerInterface $logger, ) { } diff --git a/src/HttpClient/Authenticator.php b/src/HttpClient/Authenticator.php index 8191c02a4..40028e5ec 100644 --- a/src/HttpClient/Authenticator.php +++ b/src/HttpClient/Authenticator.php @@ -18,8 +18,8 @@ class Authenticator implements LoggerAwareInterface private $logger; public function __construct( - private SiteConfigBuilder $configBuilder, - private LoginFormAuthenticator $authenticator, + private readonly SiteConfigBuilder $configBuilder, + private readonly LoginFormAuthenticator $authenticator, ) { $this->logger = new NullLogger(); } diff --git a/src/HttpClient/WallabagClient.php b/src/HttpClient/WallabagClient.php index 0eb900318..0bf9947ae 100644 --- a/src/HttpClient/WallabagClient.php +++ b/src/HttpClient/WallabagClient.php @@ -11,13 +11,13 @@ use Symfony\Contracts\HttpClient\ResponseStreamInterface; class WallabagClient implements HttpClientInterface { - private HttpClientInterface $httpClient; + private readonly HttpClientInterface $httpClient; public function __construct( private $restrictedAccess, - private HttpBrowser $browser, - private Authenticator $authenticator, - private LoggerInterface $logger, + private readonly HttpBrowser $browser, + private readonly Authenticator $authenticator, + private readonly LoggerInterface $logger, ) { $this->httpClient = HttpClient::create([ 'timeout' => 10, diff --git a/src/Mailer/AuthCodeMailer.php b/src/Mailer/AuthCodeMailer.php index 3cbc4674a..858ba547f 100644 --- a/src/Mailer/AuthCodeMailer.php +++ b/src/Mailer/AuthCodeMailer.php @@ -22,8 +22,8 @@ class AuthCodeMailer implements AuthCodeMailerInterface * @param string $supportUrl support URL to report any bugs */ public function __construct( - private MailerInterface $mailer, - private Environment $twig, + private readonly MailerInterface $mailer, + private readonly Environment $twig, private $senderEmail, private $senderName, private $supportUrl, diff --git a/src/ParamConverter/UsernameFeedTokenConverter.php b/src/ParamConverter/UsernameFeedTokenConverter.php index 186e725c3..8e54e874c 100644 --- a/src/ParamConverter/UsernameFeedTokenConverter.php +++ b/src/ParamConverter/UsernameFeedTokenConverter.php @@ -22,7 +22,7 @@ class UsernameFeedTokenConverter implements ParamConverterInterface * @param ManagerRegistry $registry Manager registry */ public function __construct( - private ?ManagerRegistry $registry = null, + private readonly ?ManagerRegistry $registry = null, ) { } diff --git a/src/Redis/Producer.php b/src/Redis/Producer.php index 8c455e0fc..1e8c487d1 100644 --- a/src/Redis/Producer.php +++ b/src/Redis/Producer.php @@ -16,7 +16,7 @@ use Simpleue\Queue\RedisQueue; class Producer implements ProducerInterface { public function __construct( - private RedisQueue $queue, + private readonly RedisQueue $queue, ) { } diff --git a/src/Repository/SiteCredentialRepository.php b/src/Repository/SiteCredentialRepository.php index 631231b29..3e1d1a357 100644 --- a/src/Repository/SiteCredentialRepository.php +++ b/src/Repository/SiteCredentialRepository.php @@ -16,7 +16,7 @@ class SiteCredentialRepository extends ServiceEntityRepository { public function __construct( ManagerRegistry $registry, - private CryptoProxy $cryptoProxy, + private readonly CryptoProxy $cryptoProxy, ) { parent::__construct($registry, SiteCredential::class); } diff --git a/src/Repository/TagRepository.php b/src/Repository/TagRepository.php index 3fe8a2e88..7440bf3c0 100644 --- a/src/Repository/TagRepository.php +++ b/src/Repository/TagRepository.php @@ -16,7 +16,7 @@ class TagRepository extends ServiceEntityRepository { public function __construct( ManagerRegistry $registry, - private string $tablePrefix, + private readonly string $tablePrefix, ) { parent::__construct($registry, Tag::class); } diff --git a/src/Security/Voter/AdminVoter.php b/src/Security/Voter/AdminVoter.php index 4baa12612..4b96b75e7 100644 --- a/src/Security/Voter/AdminVoter.php +++ b/src/Security/Voter/AdminVoter.php @@ -15,7 +15,7 @@ class AdminVoter extends Voter public const CREATE_IGNORE_ORIGIN_INSTANCE_RULES = 'CREATE_IGNORE_ORIGIN_INSTANCE_RULES'; public function __construct( - private Security $security, + private readonly Security $security, ) { } diff --git a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php index 9fc6eb4a9..8035aed28 100644 --- a/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php +++ b/src/Security/Voter/IgnoreOriginInstanceRuleVoter.php @@ -13,7 +13,7 @@ class IgnoreOriginInstanceRuleVoter extends Voter public const DELETE = 'DELETE'; public function __construct( - private Security $security, + private readonly Security $security, ) { } diff --git a/src/Security/Voter/MainVoter.php b/src/Security/Voter/MainVoter.php index 7915ac9c9..478a08099 100644 --- a/src/Security/Voter/MainVoter.php +++ b/src/Security/Voter/MainVoter.php @@ -22,7 +22,7 @@ class MainVoter extends Voter public const EDIT_CONFIG = 'EDIT_CONFIG'; public function __construct( - private Security $security, + private readonly Security $security, ) { } diff --git a/src/Security/Voter/TagVoter.php b/src/Security/Voter/TagVoter.php index f5f239b1b..dccdde979 100644 --- a/src/Security/Voter/TagVoter.php +++ b/src/Security/Voter/TagVoter.php @@ -15,7 +15,7 @@ class TagVoter extends Voter public const DELETE = 'DELETE'; public function __construct( - private Security $security, + private readonly Security $security, ) { } diff --git a/src/Security/Voter/UserVoter.php b/src/Security/Voter/UserVoter.php index 9e1bdced9..8d111eeea 100644 --- a/src/Security/Voter/UserVoter.php +++ b/src/Security/Voter/UserVoter.php @@ -13,7 +13,7 @@ class UserVoter extends Voter public const DELETE = 'DELETE'; public function __construct( - private Security $security, + private readonly Security $security, ) { } diff --git a/src/SiteConfig/GrabySiteConfigBuilder.php b/src/SiteConfig/GrabySiteConfigBuilder.php index fe8ba1173..422e54fa0 100644 --- a/src/SiteConfig/GrabySiteConfigBuilder.php +++ b/src/SiteConfig/GrabySiteConfigBuilder.php @@ -13,10 +13,10 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder * GrabySiteConfigBuilder constructor. */ public function __construct( - private ConfigBuilder $grabyConfigBuilder, - private TokenStorageInterface $token, - private SiteCredentialRepository $credentialRepository, - private LoggerInterface $logger, + private readonly ConfigBuilder $grabyConfigBuilder, + private readonly TokenStorageInterface $token, + private readonly SiteCredentialRepository $credentialRepository, + private readonly LoggerInterface $logger, ) { } diff --git a/src/SiteConfig/LoginFormAuthenticator.php b/src/SiteConfig/LoginFormAuthenticator.php index 3a4050714..f50ea3a1c 100644 --- a/src/SiteConfig/LoginFormAuthenticator.php +++ b/src/SiteConfig/LoginFormAuthenticator.php @@ -9,10 +9,10 @@ use Wallabag\ExpressionLanguage\AuthenticatorProvider; class LoginFormAuthenticator { - private ExpressionLanguage $expressionLanguage; + private readonly ExpressionLanguage $expressionLanguage; public function __construct( - private HttpBrowser $browser, + private readonly HttpBrowser $browser, AuthenticatorProvider $authenticatorProvider, ) { $this->expressionLanguage = new ExpressionLanguage(null, [$authenticatorProvider]); diff --git a/src/Twig/WallabagExtension.php b/src/Twig/WallabagExtension.php index 649bc3503..81cbffbc5 100644 --- a/src/Twig/WallabagExtension.php +++ b/src/Twig/WallabagExtension.php @@ -16,13 +16,13 @@ use Wallabag\Repository\TagRepository; class WallabagExtension extends AbstractExtension implements GlobalsInterface { public function __construct( - private EntryRepository $entryRepository, - private AnnotationRepository $annotationRepository, - private TagRepository $tagRepository, - private TokenStorageInterface $tokenStorage, + private readonly EntryRepository $entryRepository, + private readonly AnnotationRepository $annotationRepository, + private readonly TagRepository $tagRepository, + private readonly TokenStorageInterface $tokenStorage, private $lifeTime, - private TranslatorInterface $translator, - private string $projectDir, + private readonly TranslatorInterface $translator, + private readonly string $projectDir, ) { } From 9e2720cddc8bf7dab092e3ebc1f0369915760f7a Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 14:01:48 +0200 Subject: [PATCH 12/18] Modernize to PHP 8.1 --- rector.php | 6 +----- src/Command/CleanDuplicatesCommand.php | 4 ++-- src/Command/InstallCommand.php | 2 +- src/Controller/ConfigController.php | 2 +- src/Controller/EntryController.php | 4 ++-- src/Controller/TagController.php | 6 +++--- src/Doctrine/JsonArrayType.php | 2 +- src/Entity/User.php | 2 +- src/Helper/DownloadImages.php | 4 ++-- src/Helper/TagsAssigner.php | 2 +- src/Import/ChromeImport.php | 2 +- src/Import/FirefoxImport.php | 2 +- src/Import/PinboardImport.php | 2 +- src/Operator/PHP/Matches.php | 2 +- src/Operator/PHP/NotMatches.php | 2 +- src/Operator/PHP/PatternMatches.php | 2 +- src/SiteConfig/GrabySiteConfigBuilder.php | 4 ++-- src/SiteConfig/LoginFormAuthenticator.php | 4 ++-- src/Twig/WallabagExtension.php | 16 ++++++++-------- tests/Controller/Api/DeveloperControllerTest.php | 2 +- tests/Controller/ConfigControllerTest.php | 4 ++-- tests/Controller/EntryControllerTest.php | 2 +- tests/Controller/ExportControllerTest.php | 8 ++++---- tests/Controller/FeedControllerTest.php | 2 +- tests/Helper/ContentProxyTest.php | 4 ++-- tests/functions.php | 8 ++++---- 26 files changed, 48 insertions(+), 52 deletions(-) diff --git a/rector.php b/rector.php index 0b8e5af6e..1500a8cf6 100644 --- a/rector.php +++ b/rector.php @@ -4,7 +4,6 @@ declare(strict_types=1); use Rector\Config\RectorConfig; use Rector\Php80\Rector\Class_\ClassPropertyAssignToConstructorPromotionRector; -use Rector\Php81\Rector\Property\ReadOnlyPropertyRector; return RectorConfig::configure() ->withPaths([ @@ -19,13 +18,10 @@ return RectorConfig::configure() ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) - ->withRules([ - ReadOnlyPropertyRector::class, - ]) ->withSkip([ ClassPropertyAssignToConstructorPromotionRector::class => [ __DIR__ . '/src/Entity/*', ], ]) - ->withPhpSets(php80: true) + ->withPhpSets(php81: true) ->withTypeCoverageLevel(0); diff --git a/src/Command/CleanDuplicatesCommand.php b/src/Command/CleanDuplicatesCommand.php index 73e272961..6d68f00de 100644 --- a/src/Command/CleanDuplicatesCommand.php +++ b/src/Command/CleanDuplicatesCommand.php @@ -100,8 +100,8 @@ class CleanDuplicatesCommand extends Command private function similarUrl($url) { - if (\in_array(substr($url, -1), ['/', '#'], true)) { // get rid of "/" and "#" and the end of urls - return substr($url, 0, \strlen($url)); + if (\in_array(substr((string) $url, -1), ['/', '#'], true)) { // get rid of "/" and "#" and the end of urls + return substr((string) $url, 0, \strlen((string) $url)); } return $url; diff --git a/src/Command/InstallCommand.php b/src/Command/InstallCommand.php index fd6802b0c..026bb4e8e 100644 --- a/src/Command/InstallCommand.php +++ b/src/Command/InstallCommand.php @@ -144,7 +144,7 @@ class InstallCommand extends Command // return version should be like "PostgreSQL 9.5.4 on x86_64-apple-darwin15.6.0, compiled by Apple LLVM version 8.0.0 (clang-800.0.38), 64-bit" $version = $conn->executeQuery('SELECT version();')->fetchOne(); - preg_match('/PostgreSQL ([0-9\.]+)/i', $version, $matches); + preg_match('/PostgreSQL ([0-9\.]+)/i', (string) $version, $matches); if (isset($matches[1]) & version_compare($matches[1], '9.2.0', '<')) { $fulfilled = false; diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index 0d3e344d4..00bb6ea35 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -350,7 +350,7 @@ class ConfigController extends AbstractController $backupCodes = (new BackupCodes())->toArray(); $backupCodesHashed = array_map( - fn ($backupCode) => password_hash($backupCode, \PASSWORD_DEFAULT), + fn ($backupCode) => password_hash((string) $backupCode, \PASSWORD_DEFAULT), $backupCodes ); diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index c5c25289b..40bbd2c7d 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -67,7 +67,7 @@ class EntryController extends AbstractController $action = 'tag'; if (isset($values['tags'])) { - $labels = array_filter(explode(',', $values['tags']), + $labels = array_filter(explode(',', (string) $values['tags']), function ($v) { $v = trim($v); @@ -616,7 +616,7 @@ class EntryController extends AbstractController */ private function showEntries($type, Request $request, $page) { - $searchTerm = (isset($request->query->all('search_entry')['term']) ? trim($request->query->all('search_entry')['term']) : ''); + $searchTerm = (isset($request->query->all('search_entry')['term']) ? trim((string) $request->query->all('search_entry')['term']) : ''); $currentRoute = $request->query->get('currentRoute') ?? ''; $currentEntryId = $request->attributes->getInt('id'); diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 9a3db5360..97854edbf 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -45,10 +45,10 @@ class TagController extends AbstractController $form->handleRequest($request); $tags = $form->get('label')->getData() ?? ''; - $tagsExploded = explode(',', $tags); + $tagsExploded = explode(',', (string) $tags); // avoid too much tag to be added - if (\count($tagsExploded) >= NewTagType::MAX_TAGS || \strlen($tags) >= NewTagType::MAX_LENGTH) { + if (\count($tagsExploded) >= NewTagType::MAX_TAGS || \strlen((string) $tags) >= NewTagType::MAX_LENGTH) { $message = $translator->trans('flashes.tag.notice.too_much_tags', [ '%tags%' => NewTagType::MAX_TAGS, '%characters%' => NewTagType::MAX_LENGTH, @@ -250,7 +250,7 @@ class TagController extends AbstractController // check to avoid duplicate tags creation foreach ($this->entityManager->getUnitOfWork()->getScheduledEntityInsertions() as $entity) { - if ($entity instanceof Tag && strtolower($entity->getLabel()) === strtolower($filter)) { + if ($entity instanceof Tag && strtolower($entity->getLabel()) === strtolower((string) $filter)) { continue 2; } $this->entityManager->persist($entry); diff --git a/src/Doctrine/JsonArrayType.php b/src/Doctrine/JsonArrayType.php index 8925c1201..0f2a80e58 100644 --- a/src/Doctrine/JsonArrayType.php +++ b/src/Doctrine/JsonArrayType.php @@ -22,7 +22,7 @@ class JsonArrayType extends JsonType $value = \is_resource($value) ? stream_get_contents($value) : $value; - return json_decode($value, true); + return json_decode((string) $value, true); } public function getName(): string diff --git a/src/Entity/User.php b/src/Entity/User.php index 5146b47dc..752f02da6 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -383,7 +383,7 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI foreach ($this->backupCodes as $key => $backupCode) { // backup code are hashed using `password_hash` // see ConfigController->otpAppAction - if (password_verify($code, $backupCode)) { + if (password_verify($code, (string) $backupCode)) { return $key; } } diff --git a/src/Helper/DownloadImages.php b/src/Helper/DownloadImages.php index afce04c90..156100dc4 100644 --- a/src/Helper/DownloadImages.php +++ b/src/Helper/DownloadImages.php @@ -25,7 +25,7 @@ class DownloadImages $wallabagUrl, private readonly LoggerInterface $logger, ) { - $this->wallabagUrl = rtrim($wallabagUrl, '/'); + $this->wallabagUrl = rtrim((string) $wallabagUrl, '/'); $this->mimeTypes = new MimeTypes(); $this->setFolder(); @@ -291,7 +291,7 @@ class DownloadImages preg_match_all($pattern, $srcsetAttribute, $matches); $srcset = \call_user_func_array('array_merge', $matches); - $srcsetUrls = array_map(fn ($src) => trim(explode(' ', $src, 2)[0]), $srcset); + $srcsetUrls = array_map(fn ($src) => trim(explode(' ', (string) $src, 2)[0]), $srcset); $urls = array_merge($srcsetUrls, $urls); } diff --git a/src/Helper/TagsAssigner.php b/src/Helper/TagsAssigner.php index 20c787a37..470c53b86 100644 --- a/src/Helper/TagsAssigner.php +++ b/src/Helper/TagsAssigner.php @@ -39,7 +39,7 @@ class TagsAssigner } foreach ($tags as $label) { - $label = trim(mb_convert_case($label, \MB_CASE_LOWER)); + $label = trim(mb_convert_case((string) $label, \MB_CASE_LOWER)); // avoid empty tag if ('' === $label) { diff --git a/src/Import/ChromeImport.php b/src/Import/ChromeImport.php index 27ae96221..20333c269 100644 --- a/src/Import/ChromeImport.php +++ b/src/Import/ChromeImport.php @@ -39,7 +39,7 @@ class ChromeImport extends BrowserImport 'is_archived' => (int) $this->markAsRead, 'is_starred' => false, 'tags' => '', - 'created_at' => substr($entry['date_added'], 0, 10), + 'created_at' => substr((string) $entry['date_added'], 0, 10), ]; if (\array_key_exists('tags', $entry) && '' !== $entry['tags']) { diff --git a/src/Import/FirefoxImport.php b/src/Import/FirefoxImport.php index 2dba50d6a..efd9d2052 100644 --- a/src/Import/FirefoxImport.php +++ b/src/Import/FirefoxImport.php @@ -39,7 +39,7 @@ class FirefoxImport extends BrowserImport 'is_archived' => (int) $this->markAsRead, 'is_starred' => false, 'tags' => '', - 'created_at' => substr($entry['dateAdded'], 0, 10), + 'created_at' => substr((string) $entry['dateAdded'], 0, 10), ]; if (\array_key_exists('tags', $entry) && '' !== $entry['tags']) { diff --git a/src/Import/PinboardImport.php b/src/Import/PinboardImport.php index f5da3f768..fa0bcfe3d 100644 --- a/src/Import/PinboardImport.php +++ b/src/Import/PinboardImport.php @@ -95,7 +95,7 @@ class PinboardImport extends AbstractImport 'is_archived' => ('no' === $importedEntry['toread']) || $this->markAsRead, 'is_starred' => false, 'created_at' => $importedEntry['time'], - 'tags' => explode(' ', $importedEntry['tags']), + 'tags' => explode(' ', (string) $importedEntry['tags']), ]; $entry = new Entry($this->user); diff --git a/src/Operator/PHP/Matches.php b/src/Operator/PHP/Matches.php index 0d3f2bfab..c1c57b95f 100644 --- a/src/Operator/PHP/Matches.php +++ b/src/Operator/PHP/Matches.php @@ -20,6 +20,6 @@ class Matches return false; } - return false !== stripos($subject, (string) $pattern); + return false !== stripos((string) $subject, (string) $pattern); } } diff --git a/src/Operator/PHP/NotMatches.php b/src/Operator/PHP/NotMatches.php index 49556815c..ba36247f8 100644 --- a/src/Operator/PHP/NotMatches.php +++ b/src/Operator/PHP/NotMatches.php @@ -20,6 +20,6 @@ class NotMatches return true; } - return false === stripos($subject, (string) $pattern); + return false === stripos((string) $subject, (string) $pattern); } } diff --git a/src/Operator/PHP/PatternMatches.php b/src/Operator/PHP/PatternMatches.php index 9c2aede3a..9321286e5 100644 --- a/src/Operator/PHP/PatternMatches.php +++ b/src/Operator/PHP/PatternMatches.php @@ -16,7 +16,7 @@ class PatternMatches { public function __invoke($subject, $pattern) { - $count = preg_match("`$pattern`i", $subject); + $count = preg_match("`$pattern`i", (string) $subject); return \is_int($count) && $count > 0; } diff --git a/src/SiteConfig/GrabySiteConfigBuilder.php b/src/SiteConfig/GrabySiteConfigBuilder.php index 422e54fa0..91b143402 100644 --- a/src/SiteConfig/GrabySiteConfigBuilder.php +++ b/src/SiteConfig/GrabySiteConfigBuilder.php @@ -95,11 +95,11 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder $extraFields = []; foreach ($extraFieldsStrings as $extraField) { - if (!str_contains($extraField, '=')) { + if (!str_contains((string) $extraField, '=')) { continue; } - [$fieldName, $fieldValue] = explode('=', $extraField, 2); + [$fieldName, $fieldValue] = explode('=', (string) $extraField, 2); $extraFields[$fieldName] = $fieldValue; } diff --git a/src/SiteConfig/LoginFormAuthenticator.php b/src/SiteConfig/LoginFormAuthenticator.php index f50ea3a1c..5afd89648 100644 --- a/src/SiteConfig/LoginFormAuthenticator.php +++ b/src/SiteConfig/LoginFormAuthenticator.php @@ -98,9 +98,9 @@ class LoginFormAuthenticator $extraFields = []; foreach ($siteConfig->getExtraFields() as $fieldName => $fieldValue) { - if (str_starts_with($fieldValue, '@=')) { + if (str_starts_with((string) $fieldValue, '@=')) { $fieldValue = $this->expressionLanguage->evaluate( - substr($fieldValue, 2), + substr((string) $fieldValue, 2), [ 'config' => $siteConfig, ] diff --git a/src/Twig/WallabagExtension.php b/src/Twig/WallabagExtension.php index 81cbffbc5..604b5c526 100644 --- a/src/Twig/WallabagExtension.php +++ b/src/Twig/WallabagExtension.php @@ -34,20 +34,20 @@ class WallabagExtension extends AbstractExtension implements GlobalsInterface public function getFilters(): array { return [ - new TwigFilter('removeWww', [$this, 'removeWww']), - new TwigFilter('removeScheme', [$this, 'removeScheme']), - new TwigFilter('removeSchemeAndWww', [$this, 'removeSchemeAndWww']), + new TwigFilter('removeWww', $this->removeWww(...)), + new TwigFilter('removeScheme', $this->removeScheme(...)), + new TwigFilter('removeSchemeAndWww', $this->removeSchemeAndWww(...)), ]; } public function getFunctions(): array { return [ - new TwigFunction('count_entries', [$this, 'countEntries']), - new TwigFunction('count_tags', [$this, 'countTags']), - new TwigFunction('display_stats', [$this, 'displayStats']), - new TwigFunction('asset_file_exists', [$this, 'assetFileExists']), - new TwigFunction('theme_class', [$this, 'themeClass']), + new TwigFunction('count_entries', $this->countEntries(...)), + new TwigFunction('count_tags', $this->countTags(...)), + new TwigFunction('display_stats', $this->displayStats(...)), + new TwigFunction('asset_file_exists', $this->assetFileExists(...)), + new TwigFunction('theme_class', $this->themeClass(...)), ]; } diff --git a/tests/Controller/Api/DeveloperControllerTest.php b/tests/Controller/Api/DeveloperControllerTest.php index f37923121..ab0b62d7d 100644 --- a/tests/Controller/Api/DeveloperControllerTest.php +++ b/tests/Controller/Api/DeveloperControllerTest.php @@ -50,7 +50,7 @@ class DeveloperControllerTest extends WallabagTestCase $this->assertSame(200, $client->getResponse()->getStatusCode()); - $data = json_decode($client->getResponse()->getContent(), true); + $data = json_decode((string) $client->getResponse()->getContent(), true); $this->assertArrayHasKey('access_token', $data); $this->assertArrayHasKey('expires_in', $data); $this->assertArrayHasKey('token_type', $data); diff --git a/tests/Controller/ConfigControllerTest.php b/tests/Controller/ConfigControllerTest.php index 3e097994c..301ece136 100644 --- a/tests/Controller/ConfigControllerTest.php +++ b/tests/Controller/ConfigControllerTest.php @@ -351,7 +351,7 @@ class ConfigControllerTest extends WallabagTestCase ); $this->assertSame(200, $client->getResponse()->getStatusCode()); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode((string) $client->getResponse()->getContent(), true); $this->assertArrayHasKey('token', $content); } @@ -1296,7 +1296,7 @@ class ConfigControllerTest extends WallabagTestCase $this->assertSame('attachment; filename="tagging_rules_admin.json"', $headers->get('content-disposition')); $this->assertSame('UTF-8', $headers->get('content-transfer-encoding')); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode((string) $client->getResponse()->getContent(), true); $this->assertCount(4, $content); $this->assertSame('content matches "spurs"', $content[0]['rule']); diff --git a/tests/Controller/EntryControllerTest.php b/tests/Controller/EntryControllerTest.php index dd1a33c3f..b7d020a80 100644 --- a/tests/Controller/EntryControllerTest.php +++ b/tests/Controller/EntryControllerTest.php @@ -1283,7 +1283,7 @@ class EntryControllerTest extends WallabagTestCase $this->assertSame($url, $entry->getUrl()); $this->assertStringContainsString('Comment Hidalgo', $entry->getTitle()); // instead of checking for the filename (which might change) check that the image is now local - $this->assertStringContainsString(rtrim($client->getContainer()->getParameter('domain_name'), '/') . '/assets/images/', $entry->getContent()); + $this->assertStringContainsString(rtrim((string) $client->getContainer()->getParameter('domain_name'), '/') . '/assets/images/', $entry->getContent()); $client->getContainer()->get(Config::class)->set('download_images_enabled', 0); } diff --git a/tests/Controller/ExportControllerTest.php b/tests/Controller/ExportControllerTest.php index bb8e6995f..0a5c56c2e 100644 --- a/tests/Controller/ExportControllerTest.php +++ b/tests/Controller/ExportControllerTest.php @@ -177,7 +177,7 @@ class ExportControllerTest extends WallabagTestCase $this->assertSame('attachment; filename="Archive articles.csv"', $headers->get('content-disposition')); $this->assertSame('UTF-8', $headers->get('content-transfer-encoding')); - $csv = str_getcsv($client->getResponse()->getContent(), "\n"); + $csv = str_getcsv((string) $client->getResponse()->getContent(), "\n"); $this->assertGreaterThan(1, $csv); // +1 for title line @@ -216,7 +216,7 @@ class ExportControllerTest extends WallabagTestCase $this->assertSame('attachment; filename="' . $this->getSanitizedFilename($contentInDB->getTitle()) . '.json"', $headers->get('content-disposition')); $this->assertSame('UTF-8', $headers->get('content-transfer-encoding')); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode((string) $client->getResponse()->getContent(), true); $this->assertArrayHasKey('id', $content[0]); $this->assertArrayHasKey('title', $content[0]); $this->assertArrayHasKey('url', $content[0]); @@ -262,7 +262,7 @@ class ExportControllerTest extends WallabagTestCase $this->assertSame('attachment; filename="Search entry search articles.json"', $headers->get('content-disposition')); $this->assertSame('UTF-8', $headers->get('content-transfer-encoding')); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode((string) $client->getResponse()->getContent(), true); $this->assertCount(1, $content); $this->tearDownForJsonExportFromSearch(); @@ -339,7 +339,7 @@ class ExportControllerTest extends WallabagTestCase $this->assertSame('attachment; filename="Same domain articles.json"', $headers->get('content-disposition')); $this->assertSame('UTF-8', $headers->get('content-transfer-encoding')); - $content = json_decode($client->getResponse()->getContent(), true); + $content = json_decode((string) $client->getResponse()->getContent(), true); $this->assertCount(4, $content); } diff --git a/tests/Controller/FeedControllerTest.php b/tests/Controller/FeedControllerTest.php index 80cdeabb4..0359e8888 100644 --- a/tests/Controller/FeedControllerTest.php +++ b/tests/Controller/FeedControllerTest.php @@ -36,7 +36,7 @@ class FeedControllerTest extends WallabagTestCase $this->assertSame('admin', $xpath->query('/a:feed/a:author/a:name')->item(0)->nodeValue); $this->assertSame(1, $xpath->query('/a:feed/a:subtitle')->length); - if (null !== $tagValue && str_starts_with($type, 'tag')) { + if (null !== $tagValue && str_starts_with((string) $type, 'tag')) { $this->assertSame('wallabag — ' . $type . ' ' . $tagValue . ' feed', $xpath->query('/a:feed/a:title')->item(0)->nodeValue); $this->assertSame('Atom feed for entries tagged with ' . $tagValue, $xpath->query('/a:feed/a:subtitle')->item(0)->nodeValue); } else { diff --git a/tests/Helper/ContentProxyTest.php b/tests/Helper/ContentProxyTest.php index 18e349135..075c66cf7 100644 --- a/tests/Helper/ContentProxyTest.php +++ b/tests/Helper/ContentProxyTest.php @@ -1074,7 +1074,7 @@ class ContentProxyTest extends TestCase private function strToHex($string) { $hex = ''; - for ($i = 0; $i < \strlen($string); ++$i) { + for ($i = 0; $i < \strlen((string) $string); ++$i) { $ord = \ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0' . $hexCode, -2); @@ -1093,7 +1093,7 @@ class ContentProxyTest extends TestCase private function hexToStr($hex) { $string = ''; - for ($i = 0; $i < \strlen($hex) - 1; $i += 2) { + for ($i = 0; $i < \strlen((string) $hex) - 1; $i += 2) { $string .= \chr(hexdec($hex[$i] . $hex[$i + 1])); } diff --git a/tests/functions.php b/tests/functions.php index a9b8881a7..02ab70fe7 100644 --- a/tests/functions.php +++ b/tests/functions.php @@ -11,19 +11,19 @@ function isPartialRun(): bool { foreach ($_SERVER['argv'] as $arg) { - if (str_starts_with($arg, '--filter')) { + if (str_starts_with((string) $arg, '--filter')) { return true; } - if (str_starts_with($arg, '--testsuite')) { + if (str_starts_with((string) $arg, '--testsuite')) { return true; } - if (str_starts_with($arg, '--group')) { + if (str_starts_with((string) $arg, '--group')) { return true; } - if (str_starts_with($arg, '--exclude-group')) { + if (str_starts_with((string) $arg, '--exclude-group')) { return true; } } From 42a63be61acd86d67e7657f0d3b97761e59ec642 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 14:15:38 +0200 Subject: [PATCH 13/18] Modernize to app min PHP version --- rector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rector.php b/rector.php index 1500a8cf6..59d4ec7ef 100644 --- a/rector.php +++ b/rector.php @@ -23,5 +23,5 @@ return RectorConfig::configure() __DIR__ . '/src/Entity/*', ], ]) - ->withPhpSets(php81: true) + ->withPhpSets() ->withTypeCoverageLevel(0); From 6a3780ce811600cf025064e026e52b49a4a3b3bb Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 14:51:50 +0200 Subject: [PATCH 14/18] Add root files to Rector configuration --- rector.php | 1 + 1 file changed, 1 insertion(+) diff --git a/rector.php b/rector.php index 59d4ec7ef..a0a6bd794 100644 --- a/rector.php +++ b/rector.php @@ -13,6 +13,7 @@ return RectorConfig::configure() __DIR__ . '/tests', __DIR__ . '/web', ]) + ->withRootFiles() ->withImportNames(importShortClasses: false) ->withAttributesSets(doctrine: true) ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ From 2a60d8473d31ce3650eea08056581e8bc3746c70 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 15:06:57 +0200 Subject: [PATCH 15/18] Migrate to Symfony attributes --- composer-dependency-analyser.php | 1 - rector.php | 2 +- src/Consumer/AbstractConsumer.php | 1 - src/Controller/AnnotationController.php | 12 ++-- .../Api/AnnotationRestController.php | 11 ++-- src/Controller/Api/ConfigRestController.php | 3 +- src/Controller/Api/DeveloperController.php | 12 ++-- src/Controller/Api/EntryRestController.php | 37 +++++------ src/Controller/Api/SearchRestController.php | 2 +- src/Controller/Api/TagRestController.php | 12 ++-- .../Api/TaggingRuleRestController.php | 3 +- src/Controller/Api/WallabagRestController.php | 6 +- src/Controller/ConfigController.php | 45 +++++-------- src/Controller/EntryController.php | 66 +++++++------------ src/Controller/ExportController.php | 12 +--- src/Controller/FeedController.php | 15 ++--- .../IgnoreOriginInstanceRuleController.php | 11 ++-- src/Controller/Import/BrowserController.php | 3 +- src/Controller/Import/ChromeController.php | 2 +- src/Controller/Import/DeliciousController.php | 2 +- src/Controller/Import/ElcuratorController.php | 2 +- src/Controller/Import/FirefoxController.php | 2 +- src/Controller/Import/HtmlController.php | 3 +- src/Controller/Import/ImportController.php | 2 +- .../Import/InstapaperController.php | 2 +- src/Controller/Import/OmnivoreController.php | 2 +- src/Controller/Import/PinboardController.php | 2 +- src/Controller/Import/PocketController.php | 6 +- .../Import/PocketHtmlController.php | 2 +- .../Import/ReadabilityController.php | 2 +- src/Controller/Import/ShaarliController.php | 2 +- .../Import/WallabagV1Controller.php | 2 +- .../Import/WallabagV2Controller.php | 2 +- src/Controller/SiteCredentialController.php | 11 ++-- src/Controller/StaticController.php | 6 +- src/Controller/TagController.php | 21 ++---- src/Controller/UserController.php | 9 ++- src/Entity/Annotation.php | 6 +- src/Entity/Config.php | 18 ++--- src/Entity/Entry.php | 7 +- src/Entity/IgnoreOriginInstanceRule.php | 4 +- src/Entity/IgnoreOriginUserRule.php | 4 +- src/Entity/SiteCredential.php | 11 ++-- src/Entity/TaggingRule.php | 7 +- src/Entity/User.php | 5 +- src/Import/AbstractImport.php | 1 - 46 files changed, 143 insertions(+), 256 deletions(-) diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index e9fd6f437..99641e883 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -42,7 +42,6 @@ $config 'shipmonk/composer-dependency-analyser', 'symfony/asset', 'symfony/css-selector', - 'symfony/doctrine-bridge', 'symfony/google-mailer', 'symfony/intl', 'symfony/phpunit-bridge', diff --git a/rector.php b/rector.php index a0a6bd794..bf0b1b965 100644 --- a/rector.php +++ b/rector.php @@ -15,7 +15,7 @@ return RectorConfig::configure() ]) ->withRootFiles() ->withImportNames(importShortClasses: false) - ->withAttributesSets(doctrine: true) + ->withAttributesSets(symfony: true, doctrine: true) ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) diff --git a/src/Consumer/AbstractConsumer.php b/src/Consumer/AbstractConsumer.php index 67b861921..7a0736114 100644 --- a/src/Consumer/AbstractConsumer.php +++ b/src/Consumer/AbstractConsumer.php @@ -7,7 +7,6 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Wallabag\Entity\Entry; -use Wallabag\Entity\Tag; use Wallabag\Event\EntrySavedEvent; use Wallabag\Import\AbstractImport; use Wallabag\Repository\UserRepository; diff --git a/src/Controller/AnnotationController.php b/src/Controller/AnnotationController.php index b9a9f97a9..a2731d374 100644 --- a/src/Controller/AnnotationController.php +++ b/src/Controller/AnnotationController.php @@ -32,11 +32,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @Route("/annotations/{entry}.{_format}", name="annotations_get_annotations", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_ANNOTATIONS", subject="entry") - * * @return JsonResponse */ + #[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])] public function getAnnotationsAction(Entry $entry, AnnotationRepository $annotationRepository) { $annotationRows = $annotationRepository->findByEntryIdAndUserId($entry->getId(), $this->getUser()->getId()); @@ -54,11 +53,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @Route("/annotations/{entry}.{_format}", name="annotations_post_annotation", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("CREATE_ANNOTATIONS", subject="entry") - * * @return JsonResponse */ + #[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])] public function postAnnotationAction(Request $request, Entry $entry) { $data = json_decode($request->getContent(), true); @@ -89,11 +87,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @Route("/annotations/{annotation}.{_format}", name="annotations_put_annotation", methods={"PUT"}, defaults={"_format": "json"}) * @IsGranted("EDIT", subject="annotation") - * * @return JsonResponse */ + #[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])] public function putAnnotationAction(Request $request, Annotation $annotation) { try { @@ -125,11 +122,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @Route("/annotations/{annotation}.{_format}", name="annotations_delete_annotation", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("DELETE", subject="annotation") - * * @return JsonResponse */ + #[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteAnnotationAction(Annotation $annotation) { try { diff --git a/src/Controller/Api/AnnotationRestController.php b/src/Controller/Api/AnnotationRestController.php index 31e6150fb..a68cd5b2d 100644 --- a/src/Controller/Api/AnnotationRestController.php +++ b/src/Controller/Api/AnnotationRestController.php @@ -34,12 +34,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/annotations/{entry}.{_format}", name="api_get_annotations", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_ANNOTATIONS", subject="entry") * * @return Response */ + #[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])] public function getAnnotationsAction(Entry $entry) { return $this->forward('Wallabag\Controller\AnnotationController::getAnnotationsAction', [ @@ -100,11 +99,11 @@ class AnnotationRestController extends WallabagRestController * ) * ) * - * @Route("/api/annotations/{entry}.{_format}", name="api_post_annotation", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("CREATE_ANNOTATIONS", subject="entry") * * @return Response */ + #[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])] public function postAnnotationAction(Request $request, Entry $entry) { return $this->forward('Wallabag\Controller\AnnotationController::postAnnotationAction', [ @@ -134,12 +133,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/annotations/{annotation}.{_format}", name="api_put_annotation", methods={"PUT"}, defaults={"_format": "json"}) * @IsGranted("EDIT", subject="annotation") * * @return Response */ + #[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])] public function putAnnotationAction(Annotation $annotation, Request $request) { return $this->forward('Wallabag\Controller\AnnotationController::putAnnotationAction', [ @@ -169,12 +167,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/annotations/{annotation}.{_format}", name="api_delete_annotation", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("DELETE", subject="annotation") * * @return Response */ + #[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteAnnotationAction(Annotation $annotation) { return $this->forward('Wallabag\Controller\AnnotationController::deleteAnnotationAction', [ diff --git a/src/Controller/Api/ConfigRestController.php b/src/Controller/Api/ConfigRestController.php index 47659fc30..bdc23843f 100644 --- a/src/Controller/Api/ConfigRestController.php +++ b/src/Controller/Api/ConfigRestController.php @@ -23,10 +23,9 @@ class ConfigRestController extends WallabagRestController * ) * ) * - * @Route("/api/config.{_format}", name="api_get_config", methods={"GET"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/config.{_format}', name: 'api_get_config', methods: ['GET'], defaults: ['_format' => 'json'])] public function getConfigAction(SerializerInterface $serializer) { $this->validateAuthentication(); diff --git a/src/Controller/Api/DeveloperController.php b/src/Controller/Api/DeveloperController.php index a2097c211..1fd1da554 100644 --- a/src/Controller/Api/DeveloperController.php +++ b/src/Controller/Api/DeveloperController.php @@ -18,10 +18,9 @@ class DeveloperController extends AbstractController /** * List all clients and link to create a new one. * - * @Route("/developer", name="developer", methods={"GET"}) - * * @return Response */ + #[Route(path: '/developer', name: 'developer', methods: ['GET'])] public function indexAction(ClientRepository $repo) { $clients = $repo->findByUser($this->getUser()->getId()); @@ -34,10 +33,9 @@ class DeveloperController extends AbstractController /** * Create a client (an app). * - * @Route("/developer/client/create", name="developer_create_client", methods={"GET", "POST"}) - * * @return Response */ + #[Route(path: '/developer/client/create', name: 'developer_create_client', methods: ['GET', 'POST'])] public function createClientAction(Request $request, EntityManagerInterface $entityManager, TranslatorInterface $translator) { $client = new Client($this->getUser()); @@ -69,10 +67,9 @@ class DeveloperController extends AbstractController /** * Remove a client. * - * @Route("/developer/client/delete/{id}", name="developer_delete_client", methods={"POST"}, requirements={"id" = "\d+"}) - * * @return RedirectResponse */ + #[Route(path: '/developer/client/delete/{id}', name: 'developer_delete_client', methods: ['POST'], requirements: ['id' => '\d+'])] public function deleteClientAction(Request $request, Client $client, EntityManagerInterface $entityManager, TranslatorInterface $translator) { if (!$this->isCsrfTokenValid('delete-client', $request->request->get('token'))) { @@ -97,10 +94,9 @@ class DeveloperController extends AbstractController /** * Display developer how to use an existing app. * - * @Route("/developer/howto/first-app", name="developer_howto_firstapp", methods={"GET"}) - * * @return Response */ + #[Route(path: '/developer/howto/first-app', name: 'developer_howto_firstapp', methods: ['GET'])] public function howtoFirstAppAction() { return $this->render('Developer/howto_app.html.twig'); diff --git a/src/Controller/Api/EntryRestController.php b/src/Controller/Api/EntryRestController.php index 5406f5c75..0870c2948 100644 --- a/src/Controller/Api/EntryRestController.php +++ b/src/Controller/Api/EntryRestController.php @@ -85,11 +85,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/exists.{_format}", name="api_get_entries_exists", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_ENTRIES") * * @return JsonResponse */ + #[Route(path: '/api/entries/exists.{_format}', name: 'api_get_entries_exists', methods: ['GET'], defaults: ['_format' => 'json'])] public function getEntriesExistsAction(Request $request, EntryRepository $entryRepository) { $returnId = (null === $request->query->get('return_id')) ? false : (bool) $request->query->get('return_id'); @@ -297,11 +297,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries.{_format}", name="api_get_entries", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_ENTRIES") * * @return JsonResponse */ + #[Route(path: '/api/entries.{_format}', name: 'api_get_entries', methods: ['GET'], defaults: ['_format' => 'json'])] public function getEntriesAction(Request $request, EntryRepository $entryRepository) { $isArchived = (null === $request->query->get('archive')) ? null : (bool) $request->query->get('archive'); @@ -387,12 +387,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/{entry}.{_format}", name="api_get_entry", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("VIEW", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_get_entry', methods: ['GET'], defaults: ['_format' => 'json'])] public function getEntryAction(Entry $entry) { return $this->sendResponse($entry); @@ -430,11 +429,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/{entry}/export.{_format}", name="api_get_entry_export", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("VIEW", subject="entry") * * @return Response */ + #[Route(path: '/api/entries/{entry}/export.{_format}', name: 'api_get_entry_export', methods: ['GET'], defaults: ['_format' => 'json'])] public function getEntryExportAction(Entry $entry, Request $request, EntriesExport $entriesExport) { return $entriesExport @@ -462,12 +461,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/list.{_format}", name="api_delete_entries_list", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("DELETE_ENTRIES") * * @return JsonResponse */ + #[Route(path: '/api/entries/list.{_format}', name: 'api_delete_entries_list', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher) { $urls = json_decode($request->query->get('urls', '[]')); @@ -520,13 +518,13 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/lists.{_format}", name="api_post_entries_list", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("CREATE_ENTRIES") * * @throws HttpException When limit is reached * * @return JsonResponse */ + #[Route(path: '/api/entries/lists.{_format}', name: 'api_post_entries_list', methods: ['POST'], defaults: ['_format' => 'json'])] public function postEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher, ContentProxy $contentProxy) { $urls = json_decode($request->query->get('urls', '[]')); @@ -704,11 +702,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries.{_format}", name="api_post_entries", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("CREATE_ENTRIES") * * @return JsonResponse */ + #[Route(path: '/api/entries.{_format}', name: 'api_post_entries', methods: ['POST'], defaults: ['_format' => 'json'])] public function postEntriesAction( Request $request, EntryRepository $entryRepository, @@ -928,11 +926,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/{entry}.{_format}", name="api_patch_entries", methods={"PATCH"}, defaults={"_format": "json"}) * @IsGranted("EDIT", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_patch_entries', methods: ['PATCH'], defaults: ['_format' => 'json'])] public function patchEntriesAction(Entry $entry, Request $request, ContentProxy $contentProxy, LoggerInterface $logger, TagsAssigner $tagsAssigner, EventDispatcherInterface $eventDispatcher) { $data = $this->retrieveValueFromRequest($request); @@ -1042,12 +1040,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/{entry}/reload.{_format}", name="api_patch_entries_reload", methods={"PATCH"}, defaults={"_format": "json"}) * @IsGranted("RELOAD", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}/reload.{_format}', name: 'api_patch_entries_reload', methods: ['PATCH'], defaults: ['_format' => 'json'])] public function patchEntriesReloadAction(Entry $entry, ContentProxy $contentProxy, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher) { try { @@ -1097,12 +1094,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/{entry}.{_format}", name="api_delete_entries", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("DELETE", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_delete_entries', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteEntriesAction(Entry $entry, Request $request, EventDispatcherInterface $eventDispatcher) { $expect = $request->query->get('expect', 'entry'); @@ -1149,12 +1145,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/{entry}/tags.{_format}", name="api_get_entries_tags", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_TAGS", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_get_entries_tags', methods: ['GET'], defaults: ['_format' => 'json'])] public function getEntriesTagsAction(Entry $entry) { return $this->sendResponse($entry->getTags()); @@ -1192,11 +1187,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/{entry}/tags.{_format}", name="api_post_entries_tags", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("TAG", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_post_entries_tags', methods: ['POST'], defaults: ['_format' => 'json'])] public function postEntriesTagsAction(Request $request, Entry $entry, TagsAssigner $tagsAssigner) { $tags = $request->request->get('tags', ''); @@ -1242,11 +1237,11 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @Route("/api/entries/{entry}/tags/{tag}.{_format}", name="api_delete_entries_tags", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("UNTAG", subject="entry") * * @return JsonResponse */ + #[Route(path: '/api/entries/{entry}/tags/{tag}.{_format}', name: 'api_delete_entries_tags', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteEntriesTagsAction(Entry $entry, Tag $tag) { $entry->removeTag($tag); @@ -1275,12 +1270,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/tags/list.{_format}", name="api_delete_entries_tags_list", methods={"DELETE"}, defaults={"_format": "json"}) * @IsGranted("DELETE_TAGS") * * @return JsonResponse */ + #[Route(path: '/api/entries/tags/list.{_format}', name: 'api_delete_entries_tags_list', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteEntriesTagsListAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $list = json_decode($request->query->get('list', '[]')); @@ -1341,12 +1335,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * - * @Route("/api/entries/tags/lists.{_format}", name="api_post_entries_tags_list", methods={"POST"}, defaults={"_format": "json"}) * @IsGranted("CREATE_TAGS") * * @return JsonResponse */ + #[Route(path: '/api/entries/tags/lists.{_format}', name: 'api_post_entries_tags_list', methods: ['POST'], defaults: ['_format' => 'json'])] public function postEntriesTagsListAction(Request $request, EntryRepository $entryRepository, TagsAssigner $tagsAssigner) { $list = json_decode($request->query->get('list', '[]')); diff --git a/src/Controller/Api/SearchRestController.php b/src/Controller/Api/SearchRestController.php index e00920c7b..72fc97fba 100644 --- a/src/Controller/Api/SearchRestController.php +++ b/src/Controller/Api/SearchRestController.php @@ -55,11 +55,11 @@ class SearchRestController extends WallabagRestController * ) * ) * - * @Route("/api/search.{_format}", name="api_get_search", methods={"GET"}, defaults={"_format": "json"}) * @IsGranted("LIST_ENTRIES") * * @return JsonResponse */ + #[Route(path: '/api/search.{_format}', name: 'api_get_search', methods: ['GET'], defaults: ['_format' => 'json'])] public function getSearchAction(Request $request, EntryRepository $entryRepository) { $term = $request->query->get('term'); diff --git a/src/Controller/Api/TagRestController.php b/src/Controller/Api/TagRestController.php index d8757cd92..1fac9f13f 100644 --- a/src/Controller/Api/TagRestController.php +++ b/src/Controller/Api/TagRestController.php @@ -26,10 +26,9 @@ class TagRestController extends WallabagRestController * ) * ) * - * @Route("/api/tags.{_format}", name="api_get_tags", methods={"GET"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/tags.{_format}', name: 'api_get_tags', methods: ['GET'], defaults: ['_format' => 'json'])] public function getTagsAction(TagRepository $tagRepository) { $this->validateAuthentication(); @@ -63,10 +62,9 @@ class TagRestController extends WallabagRestController * ) * ) * - * @Route("/api/tag/label.{_format}", name="api_delete_tag_label", methods={"DELETE"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/tag/label.{_format}', name: 'api_delete_tag_label', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteTagLabelAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $this->validateAuthentication(); @@ -111,10 +109,9 @@ class TagRestController extends WallabagRestController * ) * ) * - * @Route("/api/tags/label.{_format}", name="api_delete_tags_label", methods={"DELETE"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/tags/label.{_format}', name: 'api_delete_tags_label', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteTagsLabelAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $this->validateAuthentication(); @@ -158,10 +155,9 @@ class TagRestController extends WallabagRestController * ) * ) * - * @Route("/api/tags/{tag}.{_format}", name="api_delete_tag", methods={"DELETE"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/tags/{tag}.{_format}', name: 'api_delete_tag', methods: ['DELETE'], defaults: ['_format' => 'json'])] public function deleteTagAction(Tag $tag, TagRepository $tagRepository, EntryRepository $entryRepository) { $this->validateAuthentication(); diff --git a/src/Controller/Api/TaggingRuleRestController.php b/src/Controller/Api/TaggingRuleRestController.php index 6137da796..7f9f11d5f 100644 --- a/src/Controller/Api/TaggingRuleRestController.php +++ b/src/Controller/Api/TaggingRuleRestController.php @@ -23,10 +23,9 @@ class TaggingRuleRestController extends WallabagRestController * ) * ) * - * @Route("/api/taggingrule/export.{_format}", name="api_get_taggingrule_export", methods={"GET"}, defaults={"_format": "json"}) - * * @return Response */ + #[Route(path: '/api/taggingrule/export.{_format}', name: 'api_get_taggingrule_export', methods: ['GET'], defaults: ['_format' => 'json'])] public function getTaggingruleExportAction() { $this->validateAuthentication(); diff --git a/src/Controller/Api/WallabagRestController.php b/src/Controller/Api/WallabagRestController.php index d3b493e48..fad611536 100644 --- a/src/Controller/Api/WallabagRestController.php +++ b/src/Controller/Api/WallabagRestController.php @@ -50,10 +50,9 @@ class WallabagRestController extends AbstractFOSRestController * * @deprecated Should use info endpoint instead * - * @Route("/api/version.{_format}", name="api_get_version", methods={"GET"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/version.{_format}', name: 'api_get_version', methods: ['GET'], defaults: ['_format' => 'json'])] public function getVersionAction() { $version = $this->getParameter('wallabag.version'); @@ -73,10 +72,9 @@ class WallabagRestController extends AbstractFOSRestController * ) * ) * - * @Route("/api/info.{_format}", name="api_get_info", methods={"GET"}, defaults={"_format": "json"}) - * * @return JsonResponse */ + #[Route(path: '/api/info.{_format}', name: 'api_get_info', methods: ['GET'], defaults: ['_format' => 'json'])] public function getInfoAction(Config $craueConfig) { $info = new ApplicationInfo( diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index 00bb6ea35..c60f53d43 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -57,9 +57,9 @@ class ConfigController extends AbstractController } /** - * @Route("/config", name="config", methods={"GET", "POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config', name: 'config', methods: ['GET', 'POST'])] public function indexAction(Request $request, Config $craueConfig, TaggingRuleRepository $taggingRuleRepository, IgnoreOriginUserRuleRepository $ignoreOriginUserRuleRepository, UserRepository $userRepository) { $config = $this->getConfig(); @@ -250,9 +250,9 @@ class ConfigController extends AbstractController /** * Disable 2FA using email. * - * @Route("/config/otp/email/disable", name="disable_otp_email", methods={"POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config/otp/email/disable', name: 'disable_otp_email', methods: ['POST'])] public function disableOtpEmailAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -276,9 +276,9 @@ class ConfigController extends AbstractController /** * Enable 2FA using email. * - * @Route("/config/otp/email", name="config_otp_email", methods={"POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config/otp/email', name: 'config_otp_email', methods: ['POST'])] public function otpEmailAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -305,9 +305,9 @@ class ConfigController extends AbstractController /** * Disable 2FA using OTP app. * - * @Route("/config/otp/app/disable", name="disable_otp_app", methods={"POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config/otp/app/disable', name: 'disable_otp_app', methods: ['POST'])] public function disableOtpAppAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -333,9 +333,9 @@ class ConfigController extends AbstractController /** * Enable 2FA using OTP app, user will need to confirm the generated code from the app. * - * @Route("/config/otp/app", name="config_otp_app", methods={"POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config/otp/app', name: 'config_otp_app', methods: ['POST'])] public function otpAppAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -393,9 +393,9 @@ class ConfigController extends AbstractController /** * Validate OTP code. * - * @Route("/config/otp/app/check", name="config_otp_app_check", methods={"POST"}) * @IsGranted("EDIT_CONFIG") */ + #[Route(path: '/config/otp/app/check', name: 'config_otp_app_check', methods: ['POST'])] public function otpAppCheckAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -430,11 +430,10 @@ class ConfigController extends AbstractController } /** - * @Route("/generate-token", name="generate_token", methods={"GET"}) * @IsGranted("EDIT_CONFIG") - * * @return RedirectResponse|JsonResponse */ + #[Route(path: '/generate-token', name: 'generate_token', methods: ['GET'])] public function generateTokenAction(Request $request) { $config = $this->getConfig(); @@ -456,11 +455,10 @@ class ConfigController extends AbstractController } /** - * @Route("/revoke-token", name="revoke_token", methods={"GET"}) * @IsGranted("EDIT_CONFIG") - * * @return RedirectResponse|JsonResponse */ + #[Route(path: '/revoke-token', name: 'revoke_token', methods: ['GET'])] public function revokeTokenAction(Request $request) { $config = $this->getConfig(); @@ -484,11 +482,10 @@ class ConfigController extends AbstractController /** * Deletes a tagging rule and redirect to the config homepage. * - * @Route("/tagging-rule/delete/{taggingRule}", name="delete_tagging_rule", methods={"GET"}, requirements={"taggingRule" = "\d+"}) * @IsGranted("DELETE", subject="taggingRule") - * * @return RedirectResponse */ + #[Route(path: '/tagging-rule/delete/{taggingRule}', name: 'delete_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])] public function deleteTaggingRuleAction(TaggingRule $taggingRule) { $this->entityManager->remove($taggingRule); @@ -505,11 +502,10 @@ class ConfigController extends AbstractController /** * Edit a tagging rule. * - * @Route("/tagging-rule/edit/{taggingRule}", name="edit_tagging_rule", methods={"GET"}, requirements={"taggingRule" = "\d+"}) * @IsGranted("EDIT", subject="taggingRule") - * * @return RedirectResponse */ + #[Route(path: '/tagging-rule/edit/{taggingRule}', name: 'edit_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])] public function editTaggingRuleAction(TaggingRule $taggingRule) { return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $taggingRule->getId() . '#set5'); @@ -518,11 +514,10 @@ class ConfigController extends AbstractController /** * Deletes an ignore origin rule and redirect to the config homepage. * - * @Route("/ignore-origin-user-rule/delete/{ignoreOriginUserRule}", name="delete_ignore_origin_rule", methods={"GET"}, requirements={"ignoreOriginUserRule" = "\d+"}) * @IsGranted("DELETE", subject="ignoreOriginUserRule") - * * @return RedirectResponse */ + #[Route(path: '/ignore-origin-user-rule/delete/{ignoreOriginUserRule}', name: 'delete_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])] public function deleteIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule) { $this->entityManager->remove($ignoreOriginUserRule); @@ -539,11 +534,10 @@ class ConfigController extends AbstractController /** * Edit an ignore origin rule. * - * @Route("/ignore-origin-user-rule/edit/{ignoreOriginUserRule}", name="edit_ignore_origin_rule", methods={"GET"}, requirements={"ignoreOriginUserRule" = "\d+"}) * @IsGranted("EDIT", subject="ignoreOriginUserRule") - * * @return RedirectResponse */ + #[Route(path: '/ignore-origin-user-rule/edit/{ignoreOriginUserRule}', name: 'edit_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])] public function editIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule) { return $this->redirect($this->generateUrl('config') . '?ignore-origin-user-rule=' . $ignoreOriginUserRule->getId() . '#set6'); @@ -552,11 +546,10 @@ class ConfigController extends AbstractController /** * Remove all annotations OR tags OR entries for the current user. * - * @Route("/reset/{type}", name="config_reset", methods={"POST"}, requirements={"id" = "annotations|tags|entries|tagging_rules"}) * @IsGranted("EDIT_CONFIG") - * * @return RedirectResponse */ + #[Route(path: '/reset/{type}', name: 'config_reset', methods: ['POST'], requirements: ['id' => 'annotations|tags|entries|tagging_rules'])] public function resetAction(Request $request, string $type, AnnotationRepository $annotationRepository, EntryRepository $entryRepository, TaggingRuleRepository $taggingRuleRepository) { if (!$this->isCsrfTokenValid('reset-area', $request->request->get('token'))) { @@ -608,13 +601,12 @@ class ConfigController extends AbstractController /** * Delete account for current user. * - * @Route("/account/delete", name="delete_account", methods={"POST"}) * @IsGranted("EDIT_CONFIG") * * @throws AccessDeniedHttpException - * * @return RedirectResponse */ + #[Route(path: '/account/delete', name: 'delete_account', methods: ['POST'])] public function deleteAccountAction(Request $request, UserRepository $userRepository, TokenStorageInterface $tokenStorage) { if (!$this->isCsrfTokenValid('delete-account', $request->request->get('token'))) { @@ -641,11 +633,10 @@ class ConfigController extends AbstractController /** * Switch view mode for current user. * - * @Route("/config/view-mode", name="switch_view_mode", methods={"GET"}) * @IsGranted("EDIT_CONFIG") - * * @return RedirectResponse */ + #[Route(path: '/config/view-mode', name: 'switch_view_mode', methods: ['GET'])] public function changeViewModeAction(Request $request) { $user = $this->getUser(); @@ -664,11 +655,10 @@ class ConfigController extends AbstractController * * @param string $language * - * @Route("/locale/{language}", name="changeLocale", methods={"GET"}) * @IsGranted("PUBLIC_ACCESS") - * * @return RedirectResponse */ + #[Route(path: '/locale/{language}', name: 'changeLocale', methods: ['GET'])] public function setLocaleAction(Request $request, ValidatorInterface $validator, $language = null) { $errors = $validator->validate($language, new LocaleConstraint(['canonicalize' => true])); @@ -683,11 +673,10 @@ class ConfigController extends AbstractController /** * Export tagging rules for the logged in user. * - * @Route("/tagging-rule/export", name="export_tagging_rule", methods={"GET"}) * @IsGranted("EDIT_CONFIG") - * * @return Response */ + #[Route(path: '/tagging-rule/export', name: 'export_tagging_rule', methods: ['GET'])] public function exportTaggingRulesAction() { $data = SerializerBuilder::create()->build()->serialize( diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index 40bbd2c7d..96c2695ec 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -46,11 +46,10 @@ class EntryController extends AbstractController } /** - * @Route("/mass", name="mass_action", methods={"POST"}) * @IsGranted("EDIT_ENTRIES") - * * @return Response */ + #[Route(path: '/mass', name: 'mass_action', methods: ['POST'])] public function massAction(Request $request, TagRepository $tagRepository) { $values = $request->request->all(); @@ -132,14 +131,13 @@ class EntryController extends AbstractController /** * @param int $page * - * @Route("/search/{page}", name="search", methods={"GET", "POST"}, defaults={"page" = 1}) * @IsGranted("LIST_ENTRIES") * * Default parameter for page is hardcoded (in duplication of the defaults from the Route) * because this controller is also called inside the layout template without any page as argument - * * @return Response */ + #[Route(path: '/search/{page}', name: 'search', methods: ['GET', 'POST'], defaults: ['page' => 1])] public function searchFormAction(Request $request, $page = 1, $currentRoute = null) { // fallback to retrieve currentRoute from query parameter instead of injected one (when using inside a template) @@ -162,11 +160,10 @@ class EntryController extends AbstractController } /** - * @Route("/new-entry", name="new_entry", methods={"GET", "POST"}) * @IsGranted("CREATE_ENTRIES") - * * @return Response */ + #[Route(path: '/new-entry', name: 'new_entry', methods: ['GET', 'POST'])] public function addEntryFormAction(Request $request, TranslatorInterface $translator) { $entry = new Entry($this->getUser()); @@ -206,11 +203,10 @@ class EntryController extends AbstractController } /** - * @Route("/bookmarklet", name="bookmarklet", methods={"GET"}) * @IsGranted("CREATE_ENTRIES") - * * @return Response */ + #[Route(path: '/bookmarklet', name: 'bookmarklet', methods: ['GET'])] public function addEntryViaBookmarkletAction(Request $request) { $entry = new Entry($this->getUser()); @@ -230,11 +226,10 @@ class EntryController extends AbstractController } /** - * @Route("/new", name="new", methods={"GET"}) * @IsGranted("CREATE_ENTRIES") - * * @return Response */ + #[Route(path: '/new', name: 'new', methods: ['GET'])] public function addEntryAction() { return $this->render('Entry/new.html.twig'); @@ -243,11 +238,10 @@ class EntryController extends AbstractController /** * Edit an entry content. * - * @Route("/edit/{id}", name="edit", methods={"GET", "POST"}, requirements={"id" = "\d+"}) * @IsGranted("EDIT", subject="entry") - * * @return Response */ + #[Route(path: '/edit/{id}', name: 'edit', methods: ['GET', 'POST'], requirements: ['id' => '\d+'])] public function editEntryAction(Request $request, Entry $entry) { $form = $this->createForm(EditEntryType::class, $entry); @@ -276,11 +270,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/all/list/{page}", name="all", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/all/list/{page}', name: 'all', methods: ['GET'], defaults: ['page' => '1'])] public function showAllAction(Request $request, $page) { return $this->showEntries('all', $request, $page); @@ -291,11 +284,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/unread/list/{page}", name="unread", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/unread/list/{page}', name: 'unread', methods: ['GET'], defaults: ['page' => '1'])] public function showUnreadAction(Request $request, $page) { // load the quickstart if no entry in database @@ -311,11 +303,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/archive/list/{page}", name="archive", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/archive/list/{page}', name: 'archive', methods: ['GET'], defaults: ['page' => '1'])] public function showArchiveAction(Request $request, $page) { return $this->showEntries('archive', $request, $page); @@ -326,11 +317,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/starred/list/{page}", name="starred", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/starred/list/{page}', name: 'starred', methods: ['GET'], defaults: ['page' => '1'])] public function showStarredAction(Request $request, $page) { return $this->showEntries('starred', $request, $page); @@ -341,11 +331,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/untagged/list/{page}", name="untagged", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/untagged/list/{page}', name: 'untagged', methods: ['GET'], defaults: ['page' => '1'])] public function showUntaggedEntriesAction(Request $request, $page) { return $this->showEntries('untagged', $request, $page); @@ -356,11 +345,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/annotated/list/{page}", name="annotated", methods={"GET"}, defaults={"page" = "1"}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/annotated/list/{page}', name: 'annotated', methods: ['GET'], defaults: ['page' => '1'])] public function showWithAnnotationsEntriesAction(Request $request, $page) { return $this->showEntries('annotated', $request, $page); @@ -369,11 +357,10 @@ class EntryController extends AbstractController /** * Shows random entry depending on the given type. * - * @Route("/{type}/random", name="random_entry", methods={"GET"}, requirements={"type": "unread|starred|archive|untagged|annotated|all"}) * @IsGranted("LIST_ENTRIES") - * * @return RedirectResponse */ + #[Route(path: '/{type}/random', name: 'random_entry', methods: ['GET'], requirements: ['type' => 'unread|starred|archive|untagged|annotated|all'])] public function redirectRandomEntryAction(string $type = 'all') { try { @@ -391,11 +378,10 @@ class EntryController extends AbstractController /** * Shows entry content. * - * @Route("/view/{id}", name="view", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("VIEW", subject="entry") - * * @return Response */ + #[Route(path: '/view/{id}', name: 'view', methods: ['GET'], requirements: ['id' => '\d+'])] public function viewAction(Entry $entry) { return $this->render( @@ -408,11 +394,10 @@ class EntryController extends AbstractController * Reload an entry. * Refetch content from the website and make it readable again. * - * @Route("/reload/{id}", name="reload_entry", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("RELOAD", subject="entry") - * * @return RedirectResponse */ + #[Route(path: '/reload/{id}', name: 'reload_entry', methods: ['GET'], requirements: ['id' => '\d+'])] public function reloadAction(Entry $entry) { $this->updateEntry($entry, 'entry_reloaded'); @@ -436,11 +421,10 @@ class EntryController extends AbstractController /** * Changes read status for an entry. * - * @Route("/archive/{id}", name="archive_entry", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("ARCHIVE", subject="entry") - * * @return RedirectResponse */ + #[Route(path: '/archive/{id}', name: 'archive_entry', methods: ['GET'], requirements: ['id' => '\d+'])] public function toggleArchiveAction(Request $request, Entry $entry) { $entry->toggleArchive(); @@ -464,11 +448,10 @@ class EntryController extends AbstractController /** * Changes starred status for an entry. * - * @Route("/star/{id}", name="star_entry", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("STAR", subject="entry") - * * @return RedirectResponse */ + #[Route(path: '/star/{id}', name: 'star_entry', methods: ['GET'], requirements: ['id' => '\d+'])] public function toggleStarAction(Request $request, Entry $entry) { $entry->toggleStar(); @@ -493,11 +476,10 @@ class EntryController extends AbstractController /** * Deletes entry and redirect to the homepage or the last viewed page. * - * @Route("/delete/{id}", name="delete_entry", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("DELETE", subject="entry") - * * @return RedirectResponse */ + #[Route(path: '/delete/{id}', name: 'delete_entry', methods: ['GET'], requirements: ['id' => '\d+'])] public function deleteEntryAction(Request $request, Entry $entry) { // generates the view url for this entry to check for redirection later @@ -530,11 +512,10 @@ class EntryController extends AbstractController /** * Get public URL for entry (and generate it if necessary). * - * @Route("/share/{id}", name="share", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("SHARE", subject="entry") - * * @return Response */ + #[Route(path: '/share/{id}', name: 'share', methods: ['GET'], requirements: ['id' => '\d+'])] public function shareAction(Entry $entry) { if (null === $entry->getUid()) { @@ -552,11 +533,10 @@ class EntryController extends AbstractController /** * Disable public sharing for an entry. * - * @Route("/share/delete/{id}", name="delete_share", methods={"GET"}, requirements={"id" = "\d+"}) * @IsGranted("UNSHARE", subject="entry") - * * @return Response */ + #[Route(path: '/share/delete/{id}', name: 'delete_share', methods: ['GET'], requirements: ['id' => '\d+'])] public function deleteShareAction(Entry $entry) { $entry->cleanUid(); @@ -572,12 +552,11 @@ class EntryController extends AbstractController /** * Ability to view a content publicly. * - * @Route("/share/{uid}", name="share_entry", methods={"GET"}, requirements={"uid" = ".+"}) * @Cache(maxage="25200", smaxage="25200", public=true) * @IsGranted("PUBLIC_ACCESS") - * * @return Response */ + #[Route(path: '/share/{uid}', name: 'share_entry', methods: ['GET'], requirements: ['uid' => '.+'])] public function shareEntryAction(Entry $entry, Config $craueConfig) { if (!$craueConfig->get('share_public')) { @@ -595,11 +574,10 @@ class EntryController extends AbstractController * * @param int $page * - * @Route("/domain/{id}/{page}", name="same_domain", methods={"GET"}, requirements={"id" = "\d+"}, defaults={"page" = 1}) * @IsGranted("LIST_ENTRIES") - * * @return Response */ + #[Route(path: '/domain/{id}/{page}', name: 'same_domain', methods: ['GET'], requirements: ['id' => '\d+'], defaults: ['page' => 1])] public function getSameDomainEntries(Request $request, $page = 1) { return $this->showEntries('same-domain', $request, $page); diff --git a/src/Controller/ExportController.php b/src/Controller/ExportController.php index 64f75c3a2..9999373ba 100644 --- a/src/Controller/ExportController.php +++ b/src/Controller/ExportController.php @@ -21,14 +21,10 @@ class ExportController extends AbstractController /** * Gets one entry content. * - * @Route("/export/{entry}.{format}", name="export_entry", methods={"GET"}, requirements={ - * "format": "epub|pdf|json|xml|txt|csv|md", - * "entry": "\d+" - * }) * @IsGranted("EXPORT", subject="entry") - * * @return Response */ + #[Route(path: '/export/{entry}.{format}', name: 'export_entry', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'entry' => '\d+'])] public function downloadEntryAction(Request $request, EntryRepository $entryRepository, EntriesExport $entriesExport, string $format, Entry $entry) { try { @@ -45,14 +41,10 @@ class ExportController extends AbstractController /** * Export all entries for current user. * - * @Route("/export/{category}.{format}", name="export_entries", methods={"GET"}, requirements={ - * "format": "epub|pdf|json|xml|txt|csv|md", - * "category": "all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain" - * }) * @IsGranted("EXPORT_ENTRIES") - * * @return Response */ + #[Route(path: '/export/{category}.{format}', name: 'export_entries', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'category' => 'all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain'])] public function downloadEntriesAction(Request $request, EntryRepository $entryRepository, TagRepository $tagRepository, EntriesExport $entriesExport, string $format, string $category, int $entry = 0) { $method = ucfirst($category); diff --git a/src/Controller/FeedController.php b/src/Controller/FeedController.php index 8756f0fbd..b3e8f015d 100644 --- a/src/Controller/FeedController.php +++ b/src/Controller/FeedController.php @@ -28,13 +28,12 @@ class FeedController extends AbstractController /** * Shows unread entries for current user. * - * @Route("/feed/{username}/{token}/unread/{page}", name="unread_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"}) * @IsGranted("PUBLIC_ACCESS") * * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") - * * @return Response */ + #[Route(path: '/feed/{username}/{token}/unread/{page}', name: 'unread_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] public function showUnreadFeedAction(User $user, $page) { return $this->showEntries('unread', $user, $page); @@ -43,13 +42,12 @@ class FeedController extends AbstractController /** * Shows read entries for current user. * - * @Route("/feed/{username}/{token}/archive/{page}", name="archive_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"}) * @IsGranted("PUBLIC_ACCESS") * * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") - * * @return Response */ + #[Route(path: '/feed/{username}/{token}/archive/{page}', name: 'archive_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] public function showArchiveFeedAction(User $user, $page) { return $this->showEntries('archive', $user, $page); @@ -58,13 +56,12 @@ class FeedController extends AbstractController /** * Shows starred entries for current user. * - * @Route("/feed/{username}/{token}/starred/{page}", name="starred_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"}) * @IsGranted("PUBLIC_ACCESS") * * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") - * * @return Response */ + #[Route(path: '/feed/{username}/{token}/starred/{page}', name: 'starred_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] public function showStarredFeedAction(User $user, $page) { return $this->showEntries('starred', $user, $page); @@ -73,13 +70,12 @@ class FeedController extends AbstractController /** * Shows all entries for current user. * - * @Route("/feed/{username}/{token}/all/{page}", name="all_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"}) * @IsGranted("PUBLIC_ACCESS") * * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") - * * @return Response */ + #[Route(path: '/feed/{username}/{token}/all/{page}', name: 'all_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] public function showAllFeedAction(User $user, $page) { return $this->showEntries('all', $user, $page); @@ -88,14 +84,13 @@ class FeedController extends AbstractController /** * Shows entries associated to a tag for current user. * - * @Route("/feed/{username}/{token}/tags/{slug}/{page}", name="tag_feed", methods={"GET"}, defaults={"page"=1, "_format"="xml"}) * @IsGranted("PUBLIC_ACCESS") * * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) - * * @return Response */ + #[Route(path: '/feed/{username}/{token}/tags/{slug}/{page}', name: 'tag_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] public function showTagsFeedAction(Request $request, User $user, Tag $tag, PreparePagerForEntries $preparePagerForEntries, $page) { $sort = $request->query->get('sort', 'created'); diff --git a/src/Controller/IgnoreOriginInstanceRuleController.php b/src/Controller/IgnoreOriginInstanceRuleController.php index 39029311c..d4c7d2156 100644 --- a/src/Controller/IgnoreOriginInstanceRuleController.php +++ b/src/Controller/IgnoreOriginInstanceRuleController.php @@ -29,9 +29,9 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Lists all IgnoreOriginInstanceRule entities. * - * @Route("/ignore-origin-instance-rules", name="ignore_origin_instance_rules_index", methods={"GET"}) * @IsGranted("LIST_IGNORE_ORIGIN_INSTANCE_RULES") */ + #[Route(path: '/ignore-origin-instance-rules', name: 'ignore_origin_instance_rules_index', methods: ['GET'])] public function indexAction(IgnoreOriginInstanceRuleRepository $repository) { $rules = $repository->findAll(); @@ -44,11 +44,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Creates a new ignore origin instance rule entity. * - * @Route("/ignore-origin-instance-rules/new", name="ignore_origin_instance_rules_new", methods={"GET", "POST"}) * @IsGranted("CREATE_IGNORE_ORIGIN_INSTANCE_RULES") - * * @return Response */ + #[Route(path: '/ignore-origin-instance-rules/new', name: 'ignore_origin_instance_rules_new', methods: ['GET', 'POST'])] public function newAction(Request $request) { $ignoreOriginInstanceRule = new IgnoreOriginInstanceRule(); @@ -77,11 +76,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Displays a form to edit an existing ignore origin instance rule entity. * - * @Route("/ignore-origin-instance-rules/{id}/edit", name="ignore_origin_instance_rules_edit", methods={"GET", "POST"}) * @IsGranted("EDIT", subject="ignoreOriginInstanceRule") - * * @return Response */ + #[Route(path: '/ignore-origin-instance-rules/{id}/edit', name: 'ignore_origin_instance_rules_edit', methods: ['GET', 'POST'])] public function editAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule) { $deleteForm = $this->createDeleteForm($ignoreOriginInstanceRule); @@ -110,11 +108,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Deletes a site credential entity. * - * @Route("/ignore-origin-instance-rules/{id}", name="ignore_origin_instance_rules_delete", methods={"DELETE"}) * @IsGranted("DELETE", subject="ignoreOriginInstanceRule") - * * @return RedirectResponse */ + #[Route(path: '/ignore-origin-instance-rules/{id}', name: 'ignore_origin_instance_rules_delete', methods: ['DELETE'])] public function deleteAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule) { $form = $this->createDeleteForm($ignoreOriginInstanceRule); diff --git a/src/Controller/Import/BrowserController.php b/src/Controller/Import/BrowserController.php index 8cf1bd5ab..594da2c7d 100644 --- a/src/Controller/Import/BrowserController.php +++ b/src/Controller/Import/BrowserController.php @@ -14,11 +14,10 @@ use Wallabag\Import\ImportInterface; abstract class BrowserController extends AbstractController { /** - * @Route("/import/browser", name="import_browser", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") - * * @return Response */ + #[Route(path: '/import/browser', name: 'import_browser', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ChromeController.php b/src/Controller/Import/ChromeController.php index b579d6196..60dd549e1 100644 --- a/src/Controller/Import/ChromeController.php +++ b/src/Controller/Import/ChromeController.php @@ -22,9 +22,9 @@ class ChromeController extends BrowserController } /** - * @Route("/import/chrome", name="import_chrome", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/chrome', name: 'import_chrome', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/DeliciousController.php b/src/Controller/Import/DeliciousController.php index 20fb5d892..9c34852e0 100644 --- a/src/Controller/Import/DeliciousController.php +++ b/src/Controller/Import/DeliciousController.php @@ -22,9 +22,9 @@ class DeliciousController extends AbstractController } /** - * @Route("/import/delicious", name="import_delicious", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/delicious', name: 'import_delicious', methods: ['GET', 'POST'])] public function indexAction(Request $request, DeliciousImport $delicious, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ElcuratorController.php b/src/Controller/Import/ElcuratorController.php index 595fa20b0..9e125d167 100644 --- a/src/Controller/Import/ElcuratorController.php +++ b/src/Controller/Import/ElcuratorController.php @@ -22,9 +22,9 @@ class ElcuratorController extends WallabagController } /** - * @Route("/import/elcurator", name="import_elcurator", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/elcurator', name: 'import_elcurator', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/FirefoxController.php b/src/Controller/Import/FirefoxController.php index c65447c44..054a1c42e 100644 --- a/src/Controller/Import/FirefoxController.php +++ b/src/Controller/Import/FirefoxController.php @@ -22,9 +22,9 @@ class FirefoxController extends BrowserController } /** - * @Route("/import/firefox", name="import_firefox", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/firefox', name: 'import_firefox', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/HtmlController.php b/src/Controller/Import/HtmlController.php index a8e24a892..5aad57026 100644 --- a/src/Controller/Import/HtmlController.php +++ b/src/Controller/Import/HtmlController.php @@ -14,11 +14,10 @@ use Wallabag\Import\ImportInterface; abstract class HtmlController extends AbstractController { /** - * @Route("/import/html", name="import_html", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") - * * @return Response */ + #[Route(path: '/import/html', name: 'import_html', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ImportController.php b/src/Controller/Import/ImportController.php index dbdbd6377..bd1d1bd2e 100644 --- a/src/Controller/Import/ImportController.php +++ b/src/Controller/Import/ImportController.php @@ -20,9 +20,9 @@ class ImportController extends AbstractController } /** - * @Route("/import/", name="import", methods={"GET"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/', name: 'import', methods: ['GET'])] public function importAction(ImportChain $importChain) { return $this->render('Import/index.html.twig', [ diff --git a/src/Controller/Import/InstapaperController.php b/src/Controller/Import/InstapaperController.php index 88a62c1e7..946e40637 100644 --- a/src/Controller/Import/InstapaperController.php +++ b/src/Controller/Import/InstapaperController.php @@ -22,9 +22,9 @@ class InstapaperController extends AbstractController } /** - * @Route("/import/instapaper", name="import_instapaper", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/instapaper', name: 'import_instapaper', methods: ['GET', 'POST'])] public function indexAction(Request $request, InstapaperImport $instapaper, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/OmnivoreController.php b/src/Controller/Import/OmnivoreController.php index 3101a99fe..4f13c61f2 100644 --- a/src/Controller/Import/OmnivoreController.php +++ b/src/Controller/Import/OmnivoreController.php @@ -22,9 +22,9 @@ class OmnivoreController extends AbstractController } /** - * @Route("/import/omnivore", name="import_omnivore", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/omnivore', name: 'import_omnivore', methods: ['GET', 'POST'])] public function indexAction(Request $request, OmnivoreImport $omnivore, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/PinboardController.php b/src/Controller/Import/PinboardController.php index 1ac75bd75..42ce78aee 100644 --- a/src/Controller/Import/PinboardController.php +++ b/src/Controller/Import/PinboardController.php @@ -22,9 +22,9 @@ class PinboardController extends AbstractController } /** - * @Route("/import/pinboard", name="import_pinboard", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/pinboard', name: 'import_pinboard', methods: ['GET', 'POST'])] public function indexAction(Request $request, PinboardImport $pinboard, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/PocketController.php b/src/Controller/Import/PocketController.php index 7cd0ec06c..5bad8049d 100644 --- a/src/Controller/Import/PocketController.php +++ b/src/Controller/Import/PocketController.php @@ -26,9 +26,9 @@ class PocketController extends AbstractController } /** - * @Route("/import/pocket", name="import_pocket", methods={"GET"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/pocket', name: 'import_pocket', methods: ['GET'])] public function indexAction(PocketImport $pocketImport) { $pocket = $this->getPocketImportService($pocketImport); @@ -48,9 +48,9 @@ class PocketController extends AbstractController } /** - * @Route("/import/pocket/auth", name="import_pocket_auth", methods={"POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/pocket/auth', name: 'import_pocket_auth', methods: ['POST'])] public function authAction(Request $request, PocketImport $pocketImport) { $requestToken = $this->getPocketImportService($pocketImport) @@ -79,9 +79,9 @@ class PocketController extends AbstractController } /** - * @Route("/import/pocket/callback", name="import_pocket_callback", methods={"GET"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/pocket/callback', name: 'import_pocket_callback', methods: ['GET'])] public function callbackAction(PocketImport $pocketImport, TranslatorInterface $translator) { $message = 'flashes.import.notice.failed'; diff --git a/src/Controller/Import/PocketHtmlController.php b/src/Controller/Import/PocketHtmlController.php index 1f9db0b06..6d47b95c6 100644 --- a/src/Controller/Import/PocketHtmlController.php +++ b/src/Controller/Import/PocketHtmlController.php @@ -22,9 +22,9 @@ class PocketHtmlController extends HtmlController } /** - * @Route("/import/pocket_html", name="import_pocket_html", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/pocket_html', name: 'import_pocket_html', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/ReadabilityController.php b/src/Controller/Import/ReadabilityController.php index 4af63f5ae..ee0575cfc 100644 --- a/src/Controller/Import/ReadabilityController.php +++ b/src/Controller/Import/ReadabilityController.php @@ -22,9 +22,9 @@ class ReadabilityController extends AbstractController } /** - * @Route("/import/readability", name="import_readability", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/readability', name: 'import_readability', methods: ['GET', 'POST'])] public function indexAction(Request $request, ReadabilityImport $readability, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ShaarliController.php b/src/Controller/Import/ShaarliController.php index b936d0251..a10b94193 100644 --- a/src/Controller/Import/ShaarliController.php +++ b/src/Controller/Import/ShaarliController.php @@ -22,9 +22,9 @@ class ShaarliController extends HtmlController } /** - * @Route("/import/shaarli", name="import_shaarli", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/shaarli', name: 'import_shaarli', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/WallabagV1Controller.php b/src/Controller/Import/WallabagV1Controller.php index 47f4c74c5..93d9192b3 100644 --- a/src/Controller/Import/WallabagV1Controller.php +++ b/src/Controller/Import/WallabagV1Controller.php @@ -22,9 +22,9 @@ class WallabagV1Controller extends WallabagController } /** - * @Route("/import/wallabag-v1", name="import_wallabag_v1", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/wallabag-v1', name: 'import_wallabag_v1', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/WallabagV2Controller.php b/src/Controller/Import/WallabagV2Controller.php index d185cae0b..9cba58c91 100644 --- a/src/Controller/Import/WallabagV2Controller.php +++ b/src/Controller/Import/WallabagV2Controller.php @@ -22,9 +22,9 @@ class WallabagV2Controller extends WallabagController } /** - * @Route("/import/wallabag-v2", name="import_wallabag_v2", methods={"GET", "POST"}) * @IsGranted("IMPORT_ENTRIES") */ + #[Route(path: '/import/wallabag-v2', name: 'import_wallabag_v2', methods: ['GET', 'POST'])] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/SiteCredentialController.php b/src/Controller/SiteCredentialController.php index 7f60d692a..0a9a648ee 100644 --- a/src/Controller/SiteCredentialController.php +++ b/src/Controller/SiteCredentialController.php @@ -34,9 +34,9 @@ class SiteCredentialController extends AbstractController /** * Lists all User entities. * - * @Route("/site-credentials", name="site_credentials_index", methods={"GET"}) * @IsGranted("LIST_SITE_CREDENTIALS") */ + #[Route(path: '/site-credentials', name: 'site_credentials_index', methods: ['GET'])] public function indexAction(SiteCredentialRepository $repository) { $this->isSiteCredentialsEnabled(); @@ -51,11 +51,10 @@ class SiteCredentialController extends AbstractController /** * Creates a new site credential entity. * - * @Route("/site-credentials/new", name="site_credentials_new", methods={"GET", "POST"}) * @IsGranted("CREATE_SITE_CREDENTIALS") - * * @return Response */ + #[Route(path: '/site-credentials/new', name: 'site_credentials_new', methods: ['GET', 'POST'])] public function newAction(Request $request) { $this->isSiteCredentialsEnabled(); @@ -89,11 +88,10 @@ class SiteCredentialController extends AbstractController /** * Displays a form to edit an existing site credential entity. * - * @Route("/site-credentials/{id}/edit", name="site_credentials_edit", methods={"GET", "POST"}) * @IsGranted("EDIT", subject="siteCredential") - * * @return Response */ + #[Route(path: '/site-credentials/{id}/edit', name: 'site_credentials_edit', methods: ['GET', 'POST'])] public function editAction(Request $request, SiteCredential $siteCredential) { $this->isSiteCredentialsEnabled(); @@ -127,11 +125,10 @@ class SiteCredentialController extends AbstractController /** * Deletes a site credential entity. * - * @Route("/site-credentials/{id}", name="site_credentials_delete", methods={"DELETE"}) * @IsGranted("DELETE", subject="siteCredential") - * * @return RedirectResponse */ + #[Route(path: '/site-credentials/{id}', name: 'site_credentials_delete', methods: ['DELETE'])] public function deleteAction(Request $request, SiteCredential $siteCredential) { $this->isSiteCredentialsEnabled(); diff --git a/src/Controller/StaticController.php b/src/Controller/StaticController.php index 2411ef849..7f7700bed 100644 --- a/src/Controller/StaticController.php +++ b/src/Controller/StaticController.php @@ -8,9 +8,9 @@ use Symfony\Component\Routing\Annotation\Route; class StaticController extends AbstractController { /** - * @Route("/howto", name="howto", methods={"GET"}) * @IsGranted("IS_AUTHENTICATED_FULLY") */ + #[Route(path: '/howto', name: 'howto', methods: ['GET'])] public function howtoAction() { $addonsUrl = $this->getParameter('addons_url'); @@ -24,9 +24,9 @@ class StaticController extends AbstractController } /** - * @Route("/about", name="about", methods={"GET"}) * @IsGranted("IS_AUTHENTICATED_FULLY") */ + #[Route(path: '/about', name: 'about', methods: ['GET'])] public function aboutAction() { return $this->render( @@ -39,9 +39,9 @@ class StaticController extends AbstractController } /** - * @Route("/quickstart", name="quickstart", methods={"GET"}) * @IsGranted("IS_AUTHENTICATED_FULLY") */ + #[Route(path: '/quickstart', name: 'quickstart', methods: ['GET'])] public function quickstartAction() { return $this->render( diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 97854edbf..2c7c837ef 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -34,11 +34,10 @@ class TagController extends AbstractController } /** - * @Route("/new-tag/{entry}", name="new_tag", methods={"POST"}, requirements={"entry" = "\d+"}) * @IsGranted("TAG", subject="entry") - * * @return Response */ + #[Route(path: '/new-tag/{entry}', name: 'new_tag', methods: ['POST'], requirements: ['entry' => '\d+'])] public function addTagFormAction(Request $request, Entry $entry, TranslatorInterface $translator) { $form = $this->createForm(NewTagType::class, new Tag()); @@ -84,11 +83,10 @@ class TagController extends AbstractController /** * Removes tag from entry. * - * @Route("/remove-tag/{entry}/{tag}", name="remove_tag", methods={"GET"}, requirements={"entry" = "\d+", "tag" = "\d+"}) * @IsGranted("UNTAG", subject="entry") - * * @return Response */ + #[Route(path: '/remove-tag/{entry}/{tag}', name: 'remove_tag', methods: ['GET'], requirements: ['entry' => '\d+', 'tag' => '\d+'])] public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag) { $entry->removeTag($tag); @@ -108,11 +106,10 @@ class TagController extends AbstractController /** * Shows tags for current user. * - * @Route("/tag/list", name="tag", methods={"GET"}) * @IsGranted("LIST_TAGS") - * * @return Response */ + #[Route(path: '/tag/list', name: 'tag', methods: ['GET'])] public function showTagAction(TagRepository $tagRepository, EntryRepository $entryRepository) { $allTagsWithNbEntries = $tagRepository->findAllTagsWithNbEntries($this->getUser()->getId()); @@ -133,13 +130,12 @@ class TagController extends AbstractController /** * @param int $page * - * @Route("/tag/list/{slug}/{page}", name="tag_entries", methods={"GET"}, defaults={"page" = "1"}) * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) * @IsGranted("LIST_ENTRIES") * @IsGranted("VIEW", subject="tag") - * * @return Response */ + #[Route(path: '/tag/list/{slug}/{page}', name: 'tag_entries', methods: ['GET'], defaults: ['page' => '1'])] public function showEntriesForTagAction(Tag $tag, EntryRepository $entryRepository, PreparePagerForEntries $preparePagerForEntries, $page, Request $request) { $entriesByTag = $entryRepository->findAllByTagId( @@ -174,12 +170,11 @@ class TagController extends AbstractController * Rename a given tag with a new label * Create a new tag with the new name and drop the old one. * - * @Route("/tag/rename/{slug}", name="tag_rename", methods={"POST"}) * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) * @IsGranted("EDIT", subject="tag") - * * @return Response */ + #[Route(path: '/tag/rename/{slug}', name: 'tag_rename', methods: ['POST'])] public function renameTagAction(Tag $tag, Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $form = $this->createForm(RenameTagType::class, new Tag()); @@ -228,11 +223,10 @@ class TagController extends AbstractController /** * Tag search results with the current search term. * - * @Route("/tag/search/{filter}", name="tag_this_search", methods={"GET"}) * @IsGranted("CREATE_TAGS") - * * @return Response */ + #[Route(path: '/tag/search/{filter}', name: 'tag_this_search', methods: ['GET'])] public function tagThisSearchAction($filter, Request $request, EntryRepository $entryRepository) { $currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : ''; @@ -264,12 +258,11 @@ class TagController extends AbstractController /** * Delete a given tag for the current user. * - * @Route("/tag/delete/{slug}", name="tag_delete", methods={"GET"}) * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) * @IsGranted("DELETE", subject="tag") - * * @return Response */ + #[Route(path: '/tag/delete/{slug}', name: 'tag_delete', methods: ['GET'])] public function removeTagAction(Tag $tag, Request $request, EntryRepository $entryRepository) { foreach ($tag->getEntriesByUserId($this->getUser()->getId()) as $entry) { diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 74af9c3ed..880876879 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -38,9 +38,9 @@ class UserController extends AbstractController /** * Creates a new User entity. * - * @Route("/users/new", name="user_new", methods={"GET", "POST"}) * @IsGranted("CREATE_USERS") */ + #[Route(path: '/users/new', name: 'user_new', methods: ['GET', 'POST'])] public function newAction(Request $request, UserManagerInterface $userManager, EventDispatcherInterface $eventDispatcher) { $user = $userManager->createUser(); @@ -75,9 +75,9 @@ class UserController extends AbstractController /** * Displays a form to edit an existing User entity. * - * @Route("/users/{id}/edit", name="user_edit", methods={"GET", "POST"}) * @IsGranted("EDIT", subject="user") */ + #[Route(path: '/users/{id}/edit', name: 'user_edit', methods: ['GET', 'POST'])] public function editAction(Request $request, User $user, UserManagerInterface $userManager, GoogleAuthenticatorInterface $googleAuthenticator) { $deleteForm = $this->createDeleteForm($user); @@ -118,9 +118,9 @@ class UserController extends AbstractController /** * Deletes a User entity. * - * @Route("/users/{id}", name="user_delete", methods={"DELETE"}) * @IsGranted("DELETE", subject="user") */ + #[Route(path: '/users/{id}', name: 'user_delete', methods: ['DELETE'])] public function deleteAction(Request $request, User $user) { $form = $this->createDeleteForm($user); @@ -142,14 +142,13 @@ class UserController extends AbstractController /** * @param int $page * - * @Route("/users/list/{page}", name="user_index", methods={"GET"}, defaults={"page" = 1}) * @IsGranted("LIST_USERS") * * Default parameter for page is hardcoded (in duplication of the defaults from the Route) * because this controller is also called inside the layout template without any page as argument - * * @return Response */ + #[Route(path: '/users/list/{page}', name: 'user_index', methods: ['GET'], defaults: ['page' => 1])] public function searchFormAction(Request $request, UserRepository $userRepository, $page = 1) { $qb = $userRepository->createQueryBuilder('u'); diff --git a/src/Entity/Annotation.php b/src/Entity/Annotation.php index d816aac46..895dae452 100644 --- a/src/Entity/Annotation.php +++ b/src/Entity/Annotation.php @@ -55,14 +55,10 @@ class Annotation /** * @var string * - * @Assert\Length( - * max = 10000, - * maxMessage = "validator.quote_length_too_high" - * ) - * * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'quote', type: 'text')] + #[Assert\Length(max: 10000, maxMessage: 'validator.quote_length_too_high')] private $quote; /** diff --git a/src/Entity/Config.php b/src/Entity/Config.php index 43d185a83..3913232b2 100644 --- a/src/Entity/Config.php +++ b/src/Entity/Config.php @@ -32,26 +32,20 @@ class Config /** * @var int * - * @Assert\NotBlank() - * @Assert\Range( - * min = 1, - * max = 100000, - * maxMessage = "validator.item_per_page_too_high" - * ) - * * @Groups({"config_api"}) */ #[ORM\Column(name: 'items_per_page', type: 'integer', nullable: false)] + #[Assert\NotBlank] + #[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.item_per_page_too_high')] private $itemsPerPage; /** * @var string * - * @Assert\NotBlank() - * * @Groups({"config_api"}) */ #[ORM\Column(name: 'language', type: 'string', nullable: false)] + #[Assert\NotBlank] private $language; /** @@ -65,14 +59,10 @@ class Config /** * @var int|null * - * @Assert\Range( - * min = 1, - * max = 100000, - * maxMessage = "validator.feed_limit_too_high" - * ) * @Groups({"config_api"}) */ #[ORM\Column(name: 'feed_limit', type: 'integer', nullable: true)] + #[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.feed_limit_too_high')] private $feedLimit; /** diff --git a/src/Entity/Entry.php b/src/Entity/Entry.php index fa348df93..c354a2e1a 100644 --- a/src/Entity/Entry.php +++ b/src/Entity/Entry.php @@ -68,14 +68,11 @@ class Entry * * @var string|null * - * @Assert\NotBlank() - * @Assert\Url( - * message = "The url '{{ value }}' is not a valid url", - * ) - * * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'url', type: 'text', nullable: true)] + #[Assert\NotBlank] + #[Assert\Url(message: "The url '{{ value }}' is not a valid url")] private $url; /** diff --git a/src/Entity/IgnoreOriginInstanceRule.php b/src/Entity/IgnoreOriginInstanceRule.php index 68cd8eab6..d0c1cce31 100644 --- a/src/Entity/IgnoreOriginInstanceRule.php +++ b/src/Entity/IgnoreOriginInstanceRule.php @@ -25,14 +25,14 @@ class IgnoreOriginInstanceRule implements IgnoreOriginRuleInterface, RuleInterfa /** * @var string * - * @Assert\NotBlank() - * @Assert\Length(max=255) * @RulerZAssert\ValidRule( * allowed_variables={"host","_all"}, * allowed_operators={"=","~"} * ) */ #[ORM\Column(name: 'rule', type: 'string', nullable: false)] + #[Assert\NotBlank] + #[Assert\Length(max: 255)] private $rule; /** diff --git a/src/Entity/IgnoreOriginUserRule.php b/src/Entity/IgnoreOriginUserRule.php index 2202c48c8..58af49d82 100644 --- a/src/Entity/IgnoreOriginUserRule.php +++ b/src/Entity/IgnoreOriginUserRule.php @@ -25,14 +25,14 @@ class IgnoreOriginUserRule implements IgnoreOriginRuleInterface, RuleInterface /** * @var string * - * @Assert\NotBlank() - * @Assert\Length(max=255) * @RulerZAssert\ValidRule( * allowed_variables={"host","_all"}, * allowed_operators={"=","~"} * ) */ #[ORM\Column(name: 'rule', type: 'string', nullable: false)] + #[Assert\NotBlank] + #[Assert\Length(max: 255)] private $rule; #[ORM\JoinColumn(nullable: false)] diff --git a/src/Entity/SiteCredential.php b/src/Entity/SiteCredential.php index 2a125181c..4ea007844 100644 --- a/src/Entity/SiteCredential.php +++ b/src/Entity/SiteCredential.php @@ -27,27 +27,24 @@ class SiteCredential /** * @var string - * - * @Assert\NotBlank() - * @Assert\Length(max=255) */ #[ORM\Column(name: 'host', type: 'string', length: 255)] + #[Assert\NotBlank] + #[Assert\Length(max: 255)] private $host; /** * @var string - * - * @Assert\NotBlank() */ #[ORM\Column(name: 'username', type: 'text')] + #[Assert\NotBlank] private $username; /** * @var string - * - * @Assert\NotBlank() */ #[ORM\Column(name: 'password', type: 'text')] + #[Assert\NotBlank] private $password; /** diff --git a/src/Entity/TaggingRule.php b/src/Entity/TaggingRule.php index f9d07d66b..18505c096 100644 --- a/src/Entity/TaggingRule.php +++ b/src/Entity/TaggingRule.php @@ -30,8 +30,6 @@ class TaggingRule implements RuleInterface /** * @var string * - * @Assert\NotBlank() - * @Assert\Length(max=255) * @RulerZAssert\ValidRule( * allowed_variables={"title", "url", "isArchived", "isStarred", "content", "language", "mimetype", "readingTime", "domainName"}, * allowed_operators={">", "<", ">=", "<=", "=", "is", "!=", "and", "not", "or", "matches", "notmatches"} @@ -40,16 +38,17 @@ class TaggingRule implements RuleInterface * @Groups({"export_tagging_rule"}) */ #[ORM\Column(name: 'rule', type: 'string', nullable: false)] + #[Assert\NotBlank] + #[Assert\Length(max: 255)] private $rule; /** * @var array * - * @Assert\NotBlank() - * * @Groups({"export_tagging_rule"}) */ #[ORM\Column(name: 'tags', type: 'simple_array', nullable: false)] + #[Assert\NotBlank] private $tags = []; /** diff --git a/src/Entity/User.php b/src/Entity/User.php index 752f02da6..7c950a8a5 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -22,13 +22,12 @@ use Wallabag\Repository\UserRepository; * User. * * @XmlRoot("user") - * - * @UniqueEntity("email") - * @UniqueEntity("username") */ #[ORM\Table(name: '`user`')] #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\HasLifecycleCallbacks] +#[UniqueEntity('email')] +#[UniqueEntity('username')] class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorInterface, BackupCodeInterface { use EntityTimestampsTrait; diff --git a/src/Import/AbstractImport.php b/src/Import/AbstractImport.php index a51dc49ca..09d551028 100644 --- a/src/Import/AbstractImport.php +++ b/src/Import/AbstractImport.php @@ -7,7 +7,6 @@ use OldSound\RabbitMqBundle\RabbitMq\ProducerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Wallabag\Entity\Entry; -use Wallabag\Entity\Tag; use Wallabag\Entity\User; use Wallabag\Event\EntrySavedEvent; use Wallabag\Helper\ContentProxy; From a1440dffda3e34cb8749c9b584f3d00a22cd4cd4 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 15:08:34 +0200 Subject: [PATCH 16/18] Migrate to Gedmo attributes --- composer-dependency-analyser.php | 3 +++ rector.php | 2 +- src/Entity/Tag.php | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php index 99641e883..6cc280497 100644 --- a/composer-dependency-analyser.php +++ b/composer-dependency-analyser.php @@ -62,6 +62,9 @@ $config 'symfony/web-profiler-bundle', 'symfony/web-server-bundle', ], [ErrorType::DEV_DEPENDENCY_IN_PROD]) + ->ignoreErrorsOnPackages([ + 'gedmo/doctrine-extensions', + ], [ErrorType::SHADOW_DEPENDENCY]) ; return $config; diff --git a/rector.php b/rector.php index bf0b1b965..37bf69394 100644 --- a/rector.php +++ b/rector.php @@ -15,7 +15,7 @@ return RectorConfig::configure() ]) ->withRootFiles() ->withImportNames(importShortClasses: false) - ->withAttributesSets(symfony: true, doctrine: true) + ->withAttributesSets(symfony: true, doctrine: true, gedmo: true) ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php index 0816a5633..e918e9ec5 100644 --- a/src/Entity/Tag.php +++ b/src/Entity/Tag.php @@ -41,9 +41,9 @@ class Tag implements \Stringable /** * @Expose - * @Gedmo\Slug(fields={"label"}, prefix="t:") */ #[ORM\Column(length: 128, unique: true)] + #[Gedmo\Slug(fields: ['label'], prefix: 't:')] private $slug; #[ORM\ManyToMany(targetEntity: Entry::class, mappedBy: 'tags', cascade: ['persist'])] From a766826a69b99e455ec7b5ef7c8299d4355f09f8 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 15:12:30 +0200 Subject: [PATCH 17/18] Migrate to JMS attributes --- rector.php | 2 +- src/Entity/Annotation.php | 32 +++------ src/Entity/Api/Client.php | 15 ++-- src/Entity/Config.php | 39 ++++------- src/Entity/Entry.php | 140 +++++++++++++------------------------ src/Entity/Tag.php | 15 ++-- src/Entity/TaggingRule.php | 13 ++-- src/Entity/User.php | 23 +++--- 8 files changed, 96 insertions(+), 183 deletions(-) diff --git a/rector.php b/rector.php index 37bf69394..c1e604281 100644 --- a/rector.php +++ b/rector.php @@ -15,7 +15,7 @@ return RectorConfig::configure() ]) ->withRootFiles() ->withImportNames(importShortClasses: false) - ->withAttributesSets(symfony: true, doctrine: true, gedmo: true) + ->withAttributesSets(symfony: true, doctrine: true, gedmo: true, jms: true) ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) diff --git a/src/Entity/Annotation.php b/src/Entity/Annotation.php index 895dae452..9c265c4d6 100644 --- a/src/Entity/Annotation.php +++ b/src/Entity/Annotation.php @@ -14,12 +14,11 @@ use Wallabag\Repository\AnnotationRepository; /** * Annotation. - * - * @ExclusionPolicy("none") */ #[ORM\Table(name: 'annotation')] #[ORM\Entity(repositoryClass: AnnotationRepository::class)] #[ORM\HasLifecycleCallbacks] +#[ExclusionPolicy('none')] class Annotation { use EntityTimestampsTrait; @@ -34,10 +33,9 @@ class Annotation /** * @var string - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'text', type: 'text')] + #[Groups(['entries_for_user', 'export_all'])] private $text; /** @@ -54,32 +52,26 @@ class Annotation /** * @var string - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'quote', type: 'text')] #[Assert\Length(max: 10000, maxMessage: 'validator.quote_length_too_high')] + #[Groups(['entries_for_user', 'export_all'])] private $quote; /** * @var array - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'ranges', type: 'array')] + #[Groups(['entries_for_user', 'export_all'])] private $ranges; - /** - * @Exclude - */ #[ORM\ManyToOne(targetEntity: User::class)] + #[Exclude] private $user; - /** - * @Exclude - */ #[ORM\JoinColumn(name: 'entry_id', referencedColumnName: 'id', onDelete: 'cascade')] #[ORM\ManyToOne(targetEntity: Entry::class, inversedBy: 'annotations')] + #[Exclude] private $entry; /* @@ -216,10 +208,8 @@ class Annotation return $this->user; } - /** - * @VirtualProperty - * @SerializedName("user") - */ + #[VirtualProperty] + #[SerializedName('user')] public function getUserName() { return $this->user->getName(); @@ -250,10 +240,8 @@ class Annotation return $this->entry; } - /** - * @VirtualProperty - * @SerializedName("annotator_schema_version") - */ + #[VirtualProperty] + #[SerializedName('annotator_schema_version')] public function getVersion() { return 'v1.0'; diff --git a/src/Entity/Api/Client.php b/src/Entity/Api/Client.php index f01db50b9..af71be3fd 100644 --- a/src/Entity/Api/Client.php +++ b/src/Entity/Api/Client.php @@ -28,9 +28,9 @@ class Client extends BaseClient * type="string", * example="Default Client", * ) - * @Groups({"user_api_with_client"}) */ #[ORM\Column(name: 'name', type: 'text', nullable: false)] + #[Groups(['user_api_with_client'])] protected $name; #[ORM\OneToMany(targetEntity: RefreshToken::class, mappedBy: 'client', cascade: ['remove'])] @@ -47,10 +47,9 @@ class Client extends BaseClient * type="string", * example="2lmubx2m9vy80ss8c4wwcsg8ok44s88ocwcc8wo0w884oc8440", * ) - * - * @SerializedName("client_secret") - * @Groups({"user_api_with_client"}) */ + #[SerializedName('client_secret')] + #[Groups(['user_api_with_client'])] protected $secret; #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'clients')] @@ -95,17 +94,15 @@ class Client extends BaseClient } /** - * @VirtualProperty - * * @OA\Property( * description="Client secret used for authorization", * type="string", * example="3_1lpybsn0od40css4w4ko8gsc8cwwskggs8kgg448ko0owo4c84", * ) - * - * @SerializedName("client_id") - * @Groups({"user_api_with_client"}) */ + #[VirtualProperty] + #[SerializedName('client_id')] + #[Groups(['user_api_with_client'])] public function getClientId() { return $this->getId() . '_' . $this->getRandomId(); diff --git a/src/Entity/Config.php b/src/Entity/Config.php index 3913232b2..5733945af 100644 --- a/src/Entity/Config.php +++ b/src/Entity/Config.php @@ -21,56 +21,50 @@ class Config /** * @var int - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'id', type: 'integer')] #[ORM\Id] #[ORM\GeneratedValue(strategy: 'AUTO')] + #[Groups(['config_api'])] private $id; /** * @var int - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'items_per_page', type: 'integer', nullable: false)] #[Assert\NotBlank] #[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.item_per_page_too_high')] + #[Groups(['config_api'])] private $itemsPerPage; /** * @var string - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'language', type: 'string', nullable: false)] #[Assert\NotBlank] + #[Groups(['config_api'])] private $language; /** * @var string|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'feed_token', type: 'string', nullable: true)] + #[Groups(['config_api'])] private $feedToken; /** * @var int|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'feed_limit', type: 'integer', nullable: true)] #[Assert\Range(min: 1, max: 100000, maxMessage: 'validator.feed_limit_too_high')] + #[Groups(['config_api'])] private $feedLimit; /** * @var float|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'reading_speed', type: 'float', nullable: true)] + #[Groups(['config_api'])] private $readingSpeed; /** @@ -81,58 +75,51 @@ class Config /** * @var int|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'action_mark_as_read', type: 'integer', nullable: true, options: ['default' => 0])] + #[Groups(['config_api'])] private $actionMarkAsRead; /** * @var int|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'list_mode', type: 'integer', nullable: true)] + #[Groups(['config_api'])] private $listMode; /** * @var int|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'display_thumbnails', type: 'integer', nullable: true, options: ['default' => 1])] + #[Groups(['config_api'])] private $displayThumbnails; /** * @var string|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'font', type: 'text', nullable: true)] + #[Groups(['config_api'])] private $font; /** * @var float|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'fontsize', type: 'float', nullable: true)] + #[Groups(['config_api'])] private $fontsize; /** * @var float|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'line_height', type: 'float', nullable: true)] + #[Groups(['config_api'])] private $lineHeight; /** * @var float|null - * - * @Groups({"config_api"}) */ #[ORM\Column(name: 'max_width', type: 'float', nullable: true)] + #[Groups(['config_api'])] private $maxWidth; /** diff --git a/src/Entity/Entry.php b/src/Entity/Entry.php index c354a2e1a..187fb1f24 100644 --- a/src/Entity/Entry.php +++ b/src/Entity/Entry.php @@ -18,7 +18,6 @@ use Wallabag\Repository\EntryRepository; /** * Entry. * - * @XmlRoot("entry") * @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())") */ #[ORM\Table(name: '`entry`')] @@ -32,6 +31,7 @@ use Wallabag\Repository\EntryRepository; #[ORM\Index(columns: ['user_id', 'is_starred', 'starred_at'])] #[ORM\Entity(repositoryClass: EntryRepository::class)] #[ORM\HasLifecycleCallbacks] +#[XmlRoot('entry')] class Entry { use EntityTimestampsTrait; @@ -39,40 +39,36 @@ class Entry /** @Serializer\XmlAttribute */ /** * @var int - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'id', type: 'integer')] #[ORM\Id] #[ORM\GeneratedValue(strategy: 'AUTO')] + #[Groups(['entries_for_user', 'export_all'])] private $id; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'uid', type: 'string', length: 23, nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $uid; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'title', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $title; /** * Define the url fetched by wallabag (the final url after potential redirections). * * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'url', type: 'text', nullable: true)] #[Assert\NotBlank] #[Assert\Url(message: "The url '{{ value }}' is not a valid url")] + #[Groups(['entries_for_user', 'export_all'])] private $url; /** @@ -85,20 +81,18 @@ class Entry * From where user retrieved/found the url (an other article, a twitter, or the given_url if non are provided). * * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'origin_url', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $originUrl; /** * Define the url entered by the user (without redirections). * * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'given_url', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $givenUrl; /** @@ -109,159 +103,134 @@ class Entry /** * @var bool - * - * @Exclude - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'is_archived', type: 'boolean')] + #[Exclude] + #[Groups(['entries_for_user', 'export_all'])] private $isArchived = false; /** * @var \DateTimeInterface|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'archived_at', type: 'datetime', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $archivedAt; /** * @var bool - * - * @Exclude - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'is_starred', type: 'boolean')] + #[Exclude] + #[Groups(['entries_for_user', 'export_all'])] private $isStarred = false; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'content', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $content; /** * @var \DateTimeInterface - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'created_at', type: 'datetime')] + #[Groups(['entries_for_user', 'export_all'])] private $createdAt; /** * @var \DateTimeInterface - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'updated_at', type: 'datetime')] + #[Groups(['entries_for_user', 'export_all'])] private $updatedAt; /** * @var \DateTimeInterface|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'published_at', type: 'datetime', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $publishedAt; /** * @var array|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'published_by', type: 'array', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $publishedBy; /** * @var \DateTimeInterface|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'starred_at', type: 'datetime', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $starredAt; - /** - * @Groups({"entries_for_user", "export_all"}) - */ #[ORM\JoinTable] #[ORM\OneToMany(targetEntity: Annotation::class, mappedBy: 'entry', cascade: ['persist', 'remove'])] + #[Groups(['entries_for_user', 'export_all'])] private $annotations; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'mimetype', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $mimetype; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'language', type: 'string', length: 20, nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $language; /** * @var int - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'reading_time', type: 'integer', nullable: false)] + #[Groups(['entries_for_user', 'export_all'])] private $readingTime = 0; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'domain_name', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $domainName; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'preview_picture', type: 'text', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $previewPicture; /** * @var string|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'http_status', type: 'string', length: 3, nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $httpStatus; /** * @var array|null - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'headers', type: 'array', nullable: true)] + #[Groups(['entries_for_user', 'export_all'])] private $headers; /** * @var bool - * - * @Exclude - * - * @Groups({"entries_for_user", "export_all"}) */ #[ORM\Column(name: 'is_not_parsed', type: 'boolean', options: ['default' => false])] + #[Exclude] + #[Groups(['entries_for_user', 'export_all'])] private $isNotParsed = false; - /** - * @Exclude - * - * @Groups({"export_all"}) - */ #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'entries')] + #[Exclude] + #[Groups(['export_all'])] private $user; #[ORM\JoinTable(name: 'entry_tag')] @@ -400,11 +369,9 @@ class Entry return $this->isArchived; } - /** - * @VirtualProperty - * @SerializedName("is_archived") - * @Groups({"entries_for_user", "export_all"}) - */ + #[VirtualProperty] + #[SerializedName('is_archived')] + #[Groups(['entries_for_user', 'export_all'])] public function is_Archived() { return (int) $this->isArchived(); @@ -441,11 +408,9 @@ class Entry return $this->isStarred; } - /** - * @VirtualProperty - * @SerializedName("is_starred") - * @Groups({"entries_for_user", "export_all"}) - */ + #[VirtualProperty] + #[SerializedName('is_starred')] + #[Groups(['entries_for_user', 'export_all'])] public function is_Starred() { return (int) $this->isStarred(); @@ -490,28 +455,22 @@ class Entry return $this->user; } - /** - * @VirtualProperty - * @SerializedName("user_name") - */ + #[VirtualProperty] + #[SerializedName('user_name')] public function getUserName() { return $this->user->getUserName(); } - /** - * @VirtualProperty - * @SerializedName("user_email") - */ + #[VirtualProperty] + #[SerializedName('user_email')] public function getUserEmail() { return $this->user->getEmail(); } - /** - * @VirtualProperty - * @SerializedName("user_id") - */ + #[VirtualProperty] + #[SerializedName('user_id')] public function getUserId() { return $this->user->getId(); @@ -666,11 +625,9 @@ class Entry return $tags; } - /** - * @VirtualProperty - * @SerializedName("tags") - * @Groups({"entries_for_user", "export_all"}) - */ + #[VirtualProperty] + #[SerializedName('tags')] + #[Groups(['entries_for_user', 'export_all'])] public function getSerializedTags() { $data = []; @@ -820,12 +777,11 @@ class Entry * Used in the entries filter so it's more explicit for the end user than the uid. * Also used in the API. * - * @VirtualProperty - * @SerializedName("is_public") - * @Groups({"entries_for_user"}) - * * @return bool */ + #[VirtualProperty] + #[SerializedName('is_public')] + #[Groups(['entries_for_user'])] public function isPublic() { return null !== $this->uid; diff --git a/src/Entity/Tag.php b/src/Entity/Tag.php index e918e9ec5..2de5381b1 100644 --- a/src/Entity/Tag.php +++ b/src/Entity/Tag.php @@ -12,38 +12,33 @@ use Wallabag\Repository\TagRepository; /** * Tag. - * - * @XmlRoot("tag") - * @ExclusionPolicy("all") */ #[ORM\Table(name: '`tag`')] #[ORM\Index(columns: ['label'])] #[ORM\Entity(repositoryClass: TagRepository::class)] +#[XmlRoot('tag')] +#[ExclusionPolicy('all')] class Tag implements \Stringable { /** * @var int - * - * @Expose */ #[ORM\Column(name: 'id', type: 'integer')] #[ORM\Id] #[ORM\GeneratedValue(strategy: 'AUTO')] + #[Expose] private $id; /** * @var string - * - * @Expose */ #[ORM\Column(name: 'label', type: 'text')] + #[Expose] private $label; - /** - * @Expose - */ #[ORM\Column(length: 128, unique: true)] #[Gedmo\Slug(fields: ['label'], prefix: 't:')] + #[Expose] private $slug; #[ORM\ManyToMany(targetEntity: Entry::class, mappedBy: 'tags', cascade: ['persist'])] diff --git a/src/Entity/TaggingRule.php b/src/Entity/TaggingRule.php index 18505c096..c7729398b 100644 --- a/src/Entity/TaggingRule.php +++ b/src/Entity/TaggingRule.php @@ -12,11 +12,10 @@ use Wallabag\Repository\TaggingRuleRepository; /** * Tagging rule. - * - * @XmlRoot("tagging_rule") */ #[ORM\Table(name: '`tagging_rule`')] #[ORM\Entity(repositoryClass: TaggingRuleRepository::class)] +#[XmlRoot('tagging_rule')] class TaggingRule implements RuleInterface { /** @@ -34,27 +33,23 @@ class TaggingRule implements RuleInterface * allowed_variables={"title", "url", "isArchived", "isStarred", "content", "language", "mimetype", "readingTime", "domainName"}, * allowed_operators={">", "<", ">=", "<=", "=", "is", "!=", "and", "not", "or", "matches", "notmatches"} * ) - * - * @Groups({"export_tagging_rule"}) */ #[ORM\Column(name: 'rule', type: 'string', nullable: false)] #[Assert\NotBlank] #[Assert\Length(max: 255)] + #[Groups(['export_tagging_rule'])] private $rule; /** * @var array - * - * @Groups({"export_tagging_rule"}) */ #[ORM\Column(name: 'tags', type: 'simple_array', nullable: false)] #[Assert\NotBlank] + #[Groups(['export_tagging_rule'])] private $tags = []; - /** - * @Exclude - */ #[ORM\ManyToOne(targetEntity: Config::class, inversedBy: 'taggingRules')] + #[Exclude] private $config; /** diff --git a/src/Entity/User.php b/src/Entity/User.php index 7c950a8a5..50fde090a 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -20,14 +20,13 @@ use Wallabag\Repository\UserRepository; /** * User. - * - * @XmlRoot("user") */ #[ORM\Table(name: '`user`')] #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\HasLifecycleCallbacks] #[UniqueEntity('email')] #[UniqueEntity('username')] +#[XmlRoot('user')] class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorInterface, BackupCodeInterface { use EntityTimestampsTrait; @@ -41,12 +40,11 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="int", * example=12, * ) - * - * @Groups({"user_api", "user_api_with_client"}) */ #[ORM\Column(name: 'id', type: 'integer')] #[ORM\Id] #[ORM\GeneratedValue(strategy: 'AUTO')] + #[Groups(['user_api', 'user_api_with_client'])] protected $id; /** @@ -57,9 +55,9 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="string", * example="Walla Baggger", * ) - * @Groups({"user_api", "user_api_with_client"}) */ #[ORM\Column(name: 'name', type: 'text', nullable: true)] + #[Groups(['user_api', 'user_api_with_client'])] protected $name; /** @@ -70,9 +68,8 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="string", * example="wallabag", * ) - * - * @Groups({"user_api", "user_api_with_client"}) */ + #[Groups(['user_api', 'user_api_with_client'])] protected $username; /** @@ -83,9 +80,8 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="string", * example="wallabag@wallabag.io", * ) - * - * @Groups({"user_api", "user_api_with_client"}) */ + #[Groups(['user_api', 'user_api_with_client'])] protected $email; /** @@ -96,9 +92,9 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="string", * example="2023-06-27T19:25:44+0000", * ) - * @Groups({"user_api", "user_api_with_client"}) */ #[ORM\Column(name: 'created_at', type: 'datetime')] + #[Groups(['user_api', 'user_api_with_client'])] protected $createdAt; /** @@ -109,9 +105,9 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * type="string", * example="2023-06-27T19:37:30+0000", * ) - * @Groups({"user_api", "user_api_with_client"}) */ #[ORM\Column(name: 'updated_at', type: 'datetime')] + #[Groups(['user_api', 'user_api_with_client'])] protected $updatedAt; #[ORM\OneToMany(targetEntity: Entry::class, mappedBy: 'user', cascade: ['remove'])] @@ -139,10 +135,9 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI * description="Default client created during user registration. Used for further authorization", * ref=@Model(type=Client::class, groups={"user_api_with_client"}) * ) - * - * @Groups({"user_api_with_client"}) - * @Accessor(getter="getFirstClient") */ + #[Groups(['user_api_with_client'])] + #[Accessor(getter: 'getFirstClient')] protected $default_client; #[ORM\Column(type: 'integer', nullable: true)] From 4e177e1778780aa0155196441e87e097acd25341 Mon Sep 17 00:00:00 2001 From: Yassine Guedidi Date: Sat, 5 Apr 2025 15:21:29 +0200 Subject: [PATCH 18/18] Migrate to SensioLabs attributes --- rector.php | 2 +- src/Controller/AnnotationController.php | 8 ++-- .../Api/AnnotationRestController.php | 9 ++-- src/Controller/Api/EntryRestController.php | 38 ++++++--------- src/Controller/Api/SearchRestController.php | 3 +- src/Controller/ConfigController.php | 42 +++++++---------- src/Controller/EntryController.php | 47 +++++++++---------- src/Controller/ExportController.php | 4 +- src/Controller/FeedController.php | 27 +++++------ .../IgnoreOriginInstanceRuleController.php | 9 ++-- src/Controller/Import/BrowserController.php | 2 +- src/Controller/Import/ChromeController.php | 4 +- src/Controller/Import/DeliciousController.php | 4 +- src/Controller/Import/ElcuratorController.php | 4 +- src/Controller/Import/FirefoxController.php | 4 +- src/Controller/Import/HtmlController.php | 2 +- src/Controller/Import/ImportController.php | 4 +- .../Import/InstapaperController.php | 4 +- src/Controller/Import/OmnivoreController.php | 4 +- src/Controller/Import/PinboardController.php | 4 +- src/Controller/Import/PocketController.php | 12 ++--- .../Import/PocketHtmlController.php | 4 +- .../Import/ReadabilityController.php | 4 +- src/Controller/Import/ShaarliController.php | 4 +- .../Import/WallabagV1Controller.php | 4 +- .../Import/WallabagV2Controller.php | 4 +- src/Controller/SiteCredentialController.php | 9 ++-- src/Controller/StaticController.php | 12 ++--- src/Controller/TagController.php | 22 ++++----- src/Controller/UserController.php | 14 ++---- 30 files changed, 122 insertions(+), 192 deletions(-) diff --git a/rector.php b/rector.php index c1e604281..1304330e0 100644 --- a/rector.php +++ b/rector.php @@ -15,7 +15,7 @@ return RectorConfig::configure() ]) ->withRootFiles() ->withImportNames(importShortClasses: false) - ->withAttributesSets(symfony: true, doctrine: true, gedmo: true, jms: true) + ->withAttributesSets(symfony: true, doctrine: true, gedmo: true, jms: true, sensiolabs: true) ->withConfiguredRule(ClassPropertyAssignToConstructorPromotionRector::class, [ 'inline_public' => true, ]) diff --git a/src/Controller/AnnotationController.php b/src/Controller/AnnotationController.php index a2731d374..5c88969d7 100644 --- a/src/Controller/AnnotationController.php +++ b/src/Controller/AnnotationController.php @@ -32,10 +32,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @IsGranted("LIST_ANNOTATIONS", subject="entry") * @return JsonResponse */ #[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_ANNOTATIONS', subject: 'entry')] public function getAnnotationsAction(Entry $entry, AnnotationRepository $annotationRepository) { $annotationRows = $annotationRepository->findByEntryIdAndUserId($entry->getId(), $this->getUser()->getId()); @@ -53,10 +53,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @IsGranted("CREATE_ANNOTATIONS", subject="entry") * @return JsonResponse */ #[Route(path: '/annotations/{entry}.{_format}', name: 'annotations_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('CREATE_ANNOTATIONS', subject: 'entry')] public function postAnnotationAction(Request $request, Entry $entry) { $data = json_decode($request->getContent(), true); @@ -87,10 +87,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @IsGranted("EDIT", subject="annotation") * @return JsonResponse */ #[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])] + #[IsGranted('EDIT', subject: 'annotation')] public function putAnnotationAction(Request $request, Annotation $annotation) { try { @@ -122,10 +122,10 @@ class AnnotationController extends AbstractFOSRestController * * @see Api\WallabagRestController * - * @IsGranted("DELETE", subject="annotation") * @return JsonResponse */ #[Route(path: '/annotations/{annotation}.{_format}', name: 'annotations_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('DELETE', subject: 'annotation')] public function deleteAnnotationAction(Annotation $annotation) { try { diff --git a/src/Controller/Api/AnnotationRestController.php b/src/Controller/Api/AnnotationRestController.php index a68cd5b2d..ee3285b03 100644 --- a/src/Controller/Api/AnnotationRestController.php +++ b/src/Controller/Api/AnnotationRestController.php @@ -34,11 +34,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("LIST_ANNOTATIONS", subject="entry") * * @return Response */ #[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_get_annotations', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_ANNOTATIONS', subject: 'entry')] public function getAnnotationsAction(Entry $entry) { return $this->forward('Wallabag\Controller\AnnotationController::getAnnotationsAction', [ @@ -99,11 +99,10 @@ class AnnotationRestController extends WallabagRestController * ) * ) * - * @IsGranted("CREATE_ANNOTATIONS", subject="entry") - * * @return Response */ #[Route(path: '/api/annotations/{entry}.{_format}', name: 'api_post_annotation', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('CREATE_ANNOTATIONS', subject: 'entry')] public function postAnnotationAction(Request $request, Entry $entry) { return $this->forward('Wallabag\Controller\AnnotationController::postAnnotationAction', [ @@ -133,11 +132,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("EDIT", subject="annotation") * * @return Response */ #[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_put_annotation', methods: ['PUT'], defaults: ['_format' => 'json'])] + #[IsGranted('EDIT', subject: 'annotation')] public function putAnnotationAction(Annotation $annotation, Request $request) { return $this->forward('Wallabag\Controller\AnnotationController::putAnnotationAction', [ @@ -167,11 +166,11 @@ class AnnotationRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("DELETE", subject="annotation") * * @return Response */ #[Route(path: '/api/annotations/{annotation}.{_format}', name: 'api_delete_annotation', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('DELETE', subject: 'annotation')] public function deleteAnnotationAction(Annotation $annotation) { return $this->forward('Wallabag\Controller\AnnotationController::deleteAnnotationAction', [ diff --git a/src/Controller/Api/EntryRestController.php b/src/Controller/Api/EntryRestController.php index 0870c2948..a7dac9b07 100644 --- a/src/Controller/Api/EntryRestController.php +++ b/src/Controller/Api/EntryRestController.php @@ -85,11 +85,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("LIST_ENTRIES") - * * @return JsonResponse */ #[Route(path: '/api/entries/exists.{_format}', name: 'api_get_entries_exists', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_ENTRIES')] public function getEntriesExistsAction(Request $request, EntryRepository $entryRepository) { $returnId = (null === $request->query->get('return_id')) ? false : (bool) $request->query->get('return_id'); @@ -297,11 +296,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("LIST_ENTRIES") - * * @return JsonResponse */ #[Route(path: '/api/entries.{_format}', name: 'api_get_entries', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_ENTRIES')] public function getEntriesAction(Request $request, EntryRepository $entryRepository) { $isArchived = (null === $request->query->get('archive')) ? null : (bool) $request->query->get('archive'); @@ -387,11 +385,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("VIEW", subject="entry") * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_get_entry', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('VIEW', subject: 'entry')] public function getEntryAction(Entry $entry) { return $this->sendResponse($entry); @@ -429,11 +427,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("VIEW", subject="entry") - * * @return Response */ #[Route(path: '/api/entries/{entry}/export.{_format}', name: 'api_get_entry_export', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('VIEW', subject: 'entry')] public function getEntryExportAction(Entry $entry, Request $request, EntriesExport $entriesExport) { return $entriesExport @@ -461,11 +458,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("DELETE_ENTRIES") * * @return JsonResponse */ #[Route(path: '/api/entries/list.{_format}', name: 'api_delete_entries_list', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('DELETE_ENTRIES')] public function deleteEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher) { $urls = json_decode($request->query->get('urls', '[]')); @@ -518,13 +515,12 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("CREATE_ENTRIES") - * * @throws HttpException When limit is reached * * @return JsonResponse */ #[Route(path: '/api/entries/lists.{_format}', name: 'api_post_entries_list', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('CREATE_ENTRIES')] public function postEntriesListAction(Request $request, EntryRepository $entryRepository, EventDispatcherInterface $eventDispatcher, ContentProxy $contentProxy) { $urls = json_decode($request->query->get('urls', '[]')); @@ -702,11 +698,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("CREATE_ENTRIES") - * * @return JsonResponse */ #[Route(path: '/api/entries.{_format}', name: 'api_post_entries', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('CREATE_ENTRIES')] public function postEntriesAction( Request $request, EntryRepository $entryRepository, @@ -926,11 +921,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("EDIT", subject="entry") - * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_patch_entries', methods: ['PATCH'], defaults: ['_format' => 'json'])] + #[IsGranted('EDIT', subject: 'entry')] public function patchEntriesAction(Entry $entry, Request $request, ContentProxy $contentProxy, LoggerInterface $logger, TagsAssigner $tagsAssigner, EventDispatcherInterface $eventDispatcher) { $data = $this->retrieveValueFromRequest($request); @@ -1040,11 +1034,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("RELOAD", subject="entry") * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}/reload.{_format}', name: 'api_patch_entries_reload', methods: ['PATCH'], defaults: ['_format' => 'json'])] + #[IsGranted('RELOAD', subject: 'entry')] public function patchEntriesReloadAction(Entry $entry, ContentProxy $contentProxy, LoggerInterface $logger, EventDispatcherInterface $eventDispatcher) { try { @@ -1094,11 +1088,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("DELETE", subject="entry") * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}.{_format}', name: 'api_delete_entries', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('DELETE', subject: 'entry')] public function deleteEntriesAction(Entry $entry, Request $request, EventDispatcherInterface $eventDispatcher) { $expect = $request->query->get('expect', 'entry'); @@ -1145,11 +1139,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("LIST_TAGS", subject="entry") * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_get_entries_tags', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_TAGS', subject: 'entry')] public function getEntriesTagsAction(Entry $entry) { return $this->sendResponse($entry->getTags()); @@ -1187,11 +1181,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("TAG", subject="entry") - * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}/tags.{_format}', name: 'api_post_entries_tags', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('TAG', subject: 'entry')] public function postEntriesTagsAction(Request $request, Entry $entry, TagsAssigner $tagsAssigner) { $tags = $request->request->get('tags', ''); @@ -1237,11 +1230,10 @@ class EntryRestController extends WallabagRestController * ) * ) * - * @IsGranted("UNTAG", subject="entry") - * * @return JsonResponse */ #[Route(path: '/api/entries/{entry}/tags/{tag}.{_format}', name: 'api_delete_entries_tags', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('UNTAG', subject: 'entry')] public function deleteEntriesTagsAction(Entry $entry, Tag $tag) { $entry->removeTag($tag); @@ -1270,11 +1262,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("DELETE_TAGS") * * @return JsonResponse */ #[Route(path: '/api/entries/tags/list.{_format}', name: 'api_delete_entries_tags_list', methods: ['DELETE'], defaults: ['_format' => 'json'])] + #[IsGranted('DELETE_TAGS')] public function deleteEntriesTagsListAction(Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $list = json_decode($request->query->get('list', '[]')); @@ -1335,11 +1327,11 @@ class EntryRestController extends WallabagRestController * description="Returned when successful" * ) * ) - * @IsGranted("CREATE_TAGS") * * @return JsonResponse */ #[Route(path: '/api/entries/tags/lists.{_format}', name: 'api_post_entries_tags_list', methods: ['POST'], defaults: ['_format' => 'json'])] + #[IsGranted('CREATE_TAGS')] public function postEntriesTagsListAction(Request $request, EntryRepository $entryRepository, TagsAssigner $tagsAssigner) { $list = json_decode($request->query->get('list', '[]')); diff --git a/src/Controller/Api/SearchRestController.php b/src/Controller/Api/SearchRestController.php index 72fc97fba..98a3f6c81 100644 --- a/src/Controller/Api/SearchRestController.php +++ b/src/Controller/Api/SearchRestController.php @@ -55,11 +55,10 @@ class SearchRestController extends WallabagRestController * ) * ) * - * @IsGranted("LIST_ENTRIES") - * * @return JsonResponse */ #[Route(path: '/api/search.{_format}', name: 'api_get_search', methods: ['GET'], defaults: ['_format' => 'json'])] + #[IsGranted('LIST_ENTRIES')] public function getSearchAction(Request $request, EntryRepository $entryRepository) { $term = $request->query->get('term'); diff --git a/src/Controller/ConfigController.php b/src/Controller/ConfigController.php index c60f53d43..017c84aa8 100644 --- a/src/Controller/ConfigController.php +++ b/src/Controller/ConfigController.php @@ -56,10 +56,8 @@ class ConfigController extends AbstractController ) { } - /** - * @IsGranted("EDIT_CONFIG") - */ #[Route(path: '/config', name: 'config', methods: ['GET', 'POST'])] + #[IsGranted('EDIT_CONFIG')] public function indexAction(Request $request, Config $craueConfig, TaggingRuleRepository $taggingRuleRepository, IgnoreOriginUserRuleRepository $ignoreOriginUserRuleRepository, UserRepository $userRepository) { $config = $this->getConfig(); @@ -249,10 +247,9 @@ class ConfigController extends AbstractController /** * Disable 2FA using email. - * - * @IsGranted("EDIT_CONFIG") */ #[Route(path: '/config/otp/email/disable', name: 'disable_otp_email', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function disableOtpEmailAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -275,10 +272,9 @@ class ConfigController extends AbstractController /** * Enable 2FA using email. - * - * @IsGranted("EDIT_CONFIG") */ #[Route(path: '/config/otp/email', name: 'config_otp_email', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function otpEmailAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -304,10 +300,9 @@ class ConfigController extends AbstractController /** * Disable 2FA using OTP app. - * - * @IsGranted("EDIT_CONFIG") */ #[Route(path: '/config/otp/app/disable', name: 'disable_otp_app', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function disableOtpAppAction(Request $request) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -332,10 +327,9 @@ class ConfigController extends AbstractController /** * Enable 2FA using OTP app, user will need to confirm the generated code from the app. - * - * @IsGranted("EDIT_CONFIG") */ #[Route(path: '/config/otp/app', name: 'config_otp_app', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function otpAppAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -392,10 +386,9 @@ class ConfigController extends AbstractController /** * Validate OTP code. - * - * @IsGranted("EDIT_CONFIG") */ #[Route(path: '/config/otp/app/check', name: 'config_otp_app_check', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function otpAppCheckAction(Request $request, GoogleAuthenticatorInterface $googleAuthenticator) { if (!$this->isCsrfTokenValid('otp', $request->request->get('token'))) { @@ -430,10 +423,10 @@ class ConfigController extends AbstractController } /** - * @IsGranted("EDIT_CONFIG") * @return RedirectResponse|JsonResponse */ #[Route(path: '/generate-token', name: 'generate_token', methods: ['GET'])] + #[IsGranted('EDIT_CONFIG')] public function generateTokenAction(Request $request) { $config = $this->getConfig(); @@ -455,10 +448,10 @@ class ConfigController extends AbstractController } /** - * @IsGranted("EDIT_CONFIG") * @return RedirectResponse|JsonResponse */ #[Route(path: '/revoke-token', name: 'revoke_token', methods: ['GET'])] + #[IsGranted('EDIT_CONFIG')] public function revokeTokenAction(Request $request) { $config = $this->getConfig(); @@ -482,10 +475,10 @@ class ConfigController extends AbstractController /** * Deletes a tagging rule and redirect to the config homepage. * - * @IsGranted("DELETE", subject="taggingRule") * @return RedirectResponse */ #[Route(path: '/tagging-rule/delete/{taggingRule}', name: 'delete_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])] + #[IsGranted('DELETE', subject: 'taggingRule')] public function deleteTaggingRuleAction(TaggingRule $taggingRule) { $this->entityManager->remove($taggingRule); @@ -502,10 +495,10 @@ class ConfigController extends AbstractController /** * Edit a tagging rule. * - * @IsGranted("EDIT", subject="taggingRule") * @return RedirectResponse */ #[Route(path: '/tagging-rule/edit/{taggingRule}', name: 'edit_tagging_rule', methods: ['GET'], requirements: ['taggingRule' => '\d+'])] + #[IsGranted('EDIT', subject: 'taggingRule')] public function editTaggingRuleAction(TaggingRule $taggingRule) { return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $taggingRule->getId() . '#set5'); @@ -514,10 +507,10 @@ class ConfigController extends AbstractController /** * Deletes an ignore origin rule and redirect to the config homepage. * - * @IsGranted("DELETE", subject="ignoreOriginUserRule") * @return RedirectResponse */ #[Route(path: '/ignore-origin-user-rule/delete/{ignoreOriginUserRule}', name: 'delete_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])] + #[IsGranted('DELETE', subject: 'ignoreOriginUserRule')] public function deleteIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule) { $this->entityManager->remove($ignoreOriginUserRule); @@ -534,10 +527,10 @@ class ConfigController extends AbstractController /** * Edit an ignore origin rule. * - * @IsGranted("EDIT", subject="ignoreOriginUserRule") * @return RedirectResponse */ #[Route(path: '/ignore-origin-user-rule/edit/{ignoreOriginUserRule}', name: 'edit_ignore_origin_rule', methods: ['GET'], requirements: ['ignoreOriginUserRule' => '\d+'])] + #[IsGranted('EDIT', subject: 'ignoreOriginUserRule')] public function editIgnoreOriginRuleAction(IgnoreOriginUserRule $ignoreOriginUserRule) { return $this->redirect($this->generateUrl('config') . '?ignore-origin-user-rule=' . $ignoreOriginUserRule->getId() . '#set6'); @@ -546,10 +539,10 @@ class ConfigController extends AbstractController /** * Remove all annotations OR tags OR entries for the current user. * - * @IsGranted("EDIT_CONFIG") * @return RedirectResponse */ #[Route(path: '/reset/{type}', name: 'config_reset', methods: ['POST'], requirements: ['id' => 'annotations|tags|entries|tagging_rules'])] + #[IsGranted('EDIT_CONFIG')] public function resetAction(Request $request, string $type, AnnotationRepository $annotationRepository, EntryRepository $entryRepository, TaggingRuleRepository $taggingRuleRepository) { if (!$this->isCsrfTokenValid('reset-area', $request->request->get('token'))) { @@ -601,12 +594,11 @@ class ConfigController extends AbstractController /** * Delete account for current user. * - * @IsGranted("EDIT_CONFIG") - * * @throws AccessDeniedHttpException * @return RedirectResponse */ #[Route(path: '/account/delete', name: 'delete_account', methods: ['POST'])] + #[IsGranted('EDIT_CONFIG')] public function deleteAccountAction(Request $request, UserRepository $userRepository, TokenStorageInterface $tokenStorage) { if (!$this->isCsrfTokenValid('delete-account', $request->request->get('token'))) { @@ -633,10 +625,10 @@ class ConfigController extends AbstractController /** * Switch view mode for current user. * - * @IsGranted("EDIT_CONFIG") * @return RedirectResponse */ #[Route(path: '/config/view-mode', name: 'switch_view_mode', methods: ['GET'])] + #[IsGranted('EDIT_CONFIG')] public function changeViewModeAction(Request $request) { $user = $this->getUser(); @@ -655,10 +647,10 @@ class ConfigController extends AbstractController * * @param string $language * - * @IsGranted("PUBLIC_ACCESS") * @return RedirectResponse */ #[Route(path: '/locale/{language}', name: 'changeLocale', methods: ['GET'])] + #[IsGranted('PUBLIC_ACCESS')] public function setLocaleAction(Request $request, ValidatorInterface $validator, $language = null) { $errors = $validator->validate($language, new LocaleConstraint(['canonicalize' => true])); @@ -673,10 +665,10 @@ class ConfigController extends AbstractController /** * Export tagging rules for the logged in user. * - * @IsGranted("EDIT_CONFIG") * @return Response */ #[Route(path: '/tagging-rule/export', name: 'export_tagging_rule', methods: ['GET'])] + #[IsGranted('EDIT_CONFIG')] public function exportTaggingRulesAction() { $data = SerializerBuilder::create()->build()->serialize( diff --git a/src/Controller/EntryController.php b/src/Controller/EntryController.php index 96c2695ec..ebfebe40b 100644 --- a/src/Controller/EntryController.php +++ b/src/Controller/EntryController.php @@ -46,10 +46,10 @@ class EntryController extends AbstractController } /** - * @IsGranted("EDIT_ENTRIES") * @return Response */ #[Route(path: '/mass', name: 'mass_action', methods: ['POST'])] + #[IsGranted('EDIT_ENTRIES')] public function massAction(Request $request, TagRepository $tagRepository) { $values = $request->request->all(); @@ -131,13 +131,12 @@ class EntryController extends AbstractController /** * @param int $page * - * @IsGranted("LIST_ENTRIES") - * * Default parameter for page is hardcoded (in duplication of the defaults from the Route) * because this controller is also called inside the layout template without any page as argument * @return Response */ #[Route(path: '/search/{page}', name: 'search', methods: ['GET', 'POST'], defaults: ['page' => 1])] + #[IsGranted('LIST_ENTRIES')] public function searchFormAction(Request $request, $page = 1, $currentRoute = null) { // fallback to retrieve currentRoute from query parameter instead of injected one (when using inside a template) @@ -160,10 +159,10 @@ class EntryController extends AbstractController } /** - * @IsGranted("CREATE_ENTRIES") * @return Response */ #[Route(path: '/new-entry', name: 'new_entry', methods: ['GET', 'POST'])] + #[IsGranted('CREATE_ENTRIES')] public function addEntryFormAction(Request $request, TranslatorInterface $translator) { $entry = new Entry($this->getUser()); @@ -203,10 +202,10 @@ class EntryController extends AbstractController } /** - * @IsGranted("CREATE_ENTRIES") * @return Response */ #[Route(path: '/bookmarklet', name: 'bookmarklet', methods: ['GET'])] + #[IsGranted('CREATE_ENTRIES')] public function addEntryViaBookmarkletAction(Request $request) { $entry = new Entry($this->getUser()); @@ -226,10 +225,10 @@ class EntryController extends AbstractController } /** - * @IsGranted("CREATE_ENTRIES") * @return Response */ #[Route(path: '/new', name: 'new', methods: ['GET'])] + #[IsGranted('CREATE_ENTRIES')] public function addEntryAction() { return $this->render('Entry/new.html.twig'); @@ -238,10 +237,10 @@ class EntryController extends AbstractController /** * Edit an entry content. * - * @IsGranted("EDIT", subject="entry") * @return Response */ #[Route(path: '/edit/{id}', name: 'edit', methods: ['GET', 'POST'], requirements: ['id' => '\d+'])] + #[IsGranted('EDIT', subject: 'entry')] public function editEntryAction(Request $request, Entry $entry) { $form = $this->createForm(EditEntryType::class, $entry); @@ -270,10 +269,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/all/list/{page}', name: 'all', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showAllAction(Request $request, $page) { return $this->showEntries('all', $request, $page); @@ -284,10 +283,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/unread/list/{page}', name: 'unread', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showUnreadAction(Request $request, $page) { // load the quickstart if no entry in database @@ -303,10 +302,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/archive/list/{page}', name: 'archive', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showArchiveAction(Request $request, $page) { return $this->showEntries('archive', $request, $page); @@ -317,10 +316,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/starred/list/{page}', name: 'starred', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showStarredAction(Request $request, $page) { return $this->showEntries('starred', $request, $page); @@ -331,10 +330,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/untagged/list/{page}', name: 'untagged', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showUntaggedEntriesAction(Request $request, $page) { return $this->showEntries('untagged', $request, $page); @@ -345,10 +344,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/annotated/list/{page}', name: 'annotated', methods: ['GET'], defaults: ['page' => '1'])] + #[IsGranted('LIST_ENTRIES')] public function showWithAnnotationsEntriesAction(Request $request, $page) { return $this->showEntries('annotated', $request, $page); @@ -357,10 +356,10 @@ class EntryController extends AbstractController /** * Shows random entry depending on the given type. * - * @IsGranted("LIST_ENTRIES") * @return RedirectResponse */ #[Route(path: '/{type}/random', name: 'random_entry', methods: ['GET'], requirements: ['type' => 'unread|starred|archive|untagged|annotated|all'])] + #[IsGranted('LIST_ENTRIES')] public function redirectRandomEntryAction(string $type = 'all') { try { @@ -378,10 +377,10 @@ class EntryController extends AbstractController /** * Shows entry content. * - * @IsGranted("VIEW", subject="entry") * @return Response */ #[Route(path: '/view/{id}', name: 'view', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('VIEW', subject: 'entry')] public function viewAction(Entry $entry) { return $this->render( @@ -394,10 +393,10 @@ class EntryController extends AbstractController * Reload an entry. * Refetch content from the website and make it readable again. * - * @IsGranted("RELOAD", subject="entry") * @return RedirectResponse */ #[Route(path: '/reload/{id}', name: 'reload_entry', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('RELOAD', subject: 'entry')] public function reloadAction(Entry $entry) { $this->updateEntry($entry, 'entry_reloaded'); @@ -421,10 +420,10 @@ class EntryController extends AbstractController /** * Changes read status for an entry. * - * @IsGranted("ARCHIVE", subject="entry") * @return RedirectResponse */ #[Route(path: '/archive/{id}', name: 'archive_entry', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('ARCHIVE', subject: 'entry')] public function toggleArchiveAction(Request $request, Entry $entry) { $entry->toggleArchive(); @@ -448,10 +447,10 @@ class EntryController extends AbstractController /** * Changes starred status for an entry. * - * @IsGranted("STAR", subject="entry") * @return RedirectResponse */ #[Route(path: '/star/{id}', name: 'star_entry', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('STAR', subject: 'entry')] public function toggleStarAction(Request $request, Entry $entry) { $entry->toggleStar(); @@ -476,10 +475,10 @@ class EntryController extends AbstractController /** * Deletes entry and redirect to the homepage or the last viewed page. * - * @IsGranted("DELETE", subject="entry") * @return RedirectResponse */ #[Route(path: '/delete/{id}', name: 'delete_entry', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('DELETE', subject: 'entry')] public function deleteEntryAction(Request $request, Entry $entry) { // generates the view url for this entry to check for redirection later @@ -512,10 +511,10 @@ class EntryController extends AbstractController /** * Get public URL for entry (and generate it if necessary). * - * @IsGranted("SHARE", subject="entry") * @return Response */ #[Route(path: '/share/{id}', name: 'share', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('SHARE', subject: 'entry')] public function shareAction(Entry $entry) { if (null === $entry->getUid()) { @@ -533,10 +532,10 @@ class EntryController extends AbstractController /** * Disable public sharing for an entry. * - * @IsGranted("UNSHARE", subject="entry") * @return Response */ #[Route(path: '/share/delete/{id}', name: 'delete_share', methods: ['GET'], requirements: ['id' => '\d+'])] + #[IsGranted('UNSHARE', subject: 'entry')] public function deleteShareAction(Entry $entry) { $entry->cleanUid(); @@ -552,11 +551,11 @@ class EntryController extends AbstractController /** * Ability to view a content publicly. * - * @Cache(maxage="25200", smaxage="25200", public=true) - * @IsGranted("PUBLIC_ACCESS") * @return Response */ #[Route(path: '/share/{uid}', name: 'share_entry', methods: ['GET'], requirements: ['uid' => '.+'])] + #[Cache(maxage: 25200, smaxage: 25200, public: true)] + #[IsGranted('PUBLIC_ACCESS')] public function shareEntryAction(Entry $entry, Config $craueConfig) { if (!$craueConfig->get('share_public')) { @@ -574,10 +573,10 @@ class EntryController extends AbstractController * * @param int $page * - * @IsGranted("LIST_ENTRIES") * @return Response */ #[Route(path: '/domain/{id}/{page}', name: 'same_domain', methods: ['GET'], requirements: ['id' => '\d+'], defaults: ['page' => 1])] + #[IsGranted('LIST_ENTRIES')] public function getSameDomainEntries(Request $request, $page = 1) { return $this->showEntries('same-domain', $request, $page); diff --git a/src/Controller/ExportController.php b/src/Controller/ExportController.php index 9999373ba..af4f813f8 100644 --- a/src/Controller/ExportController.php +++ b/src/Controller/ExportController.php @@ -21,10 +21,10 @@ class ExportController extends AbstractController /** * Gets one entry content. * - * @IsGranted("EXPORT", subject="entry") * @return Response */ #[Route(path: '/export/{entry}.{format}', name: 'export_entry', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'entry' => '\d+'])] + #[IsGranted('EXPORT', subject: 'entry')] public function downloadEntryAction(Request $request, EntryRepository $entryRepository, EntriesExport $entriesExport, string $format, Entry $entry) { try { @@ -41,10 +41,10 @@ class ExportController extends AbstractController /** * Export all entries for current user. * - * @IsGranted("EXPORT_ENTRIES") * @return Response */ #[Route(path: '/export/{category}.{format}', name: 'export_entries', methods: ['GET'], requirements: ['format' => 'epub|pdf|json|xml|txt|csv|md', 'category' => 'all|unread|starred|archive|tag_entries|untagged|search|annotated|same_domain'])] + #[IsGranted('EXPORT_ENTRIES')] public function downloadEntriesAction(Request $request, EntryRepository $entryRepository, TagRepository $tagRepository, EntriesExport $entriesExport, string $format, string $category, int $entry = 0) { $method = ucfirst($category); diff --git a/src/Controller/FeedController.php b/src/Controller/FeedController.php index b3e8f015d..cd5adf24f 100644 --- a/src/Controller/FeedController.php +++ b/src/Controller/FeedController.php @@ -28,12 +28,11 @@ class FeedController extends AbstractController /** * Shows unread entries for current user. * - * @IsGranted("PUBLIC_ACCESS") - * - * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") * @return Response */ #[Route(path: '/feed/{username}/{token}/unread/{page}', name: 'unread_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] + #[IsGranted('PUBLIC_ACCESS')] + #[ParamConverter('user', class: User::class, converter: 'username_feed_token_converter')] public function showUnreadFeedAction(User $user, $page) { return $this->showEntries('unread', $user, $page); @@ -42,12 +41,11 @@ class FeedController extends AbstractController /** * Shows read entries for current user. * - * @IsGranted("PUBLIC_ACCESS") - * - * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") * @return Response */ #[Route(path: '/feed/{username}/{token}/archive/{page}', name: 'archive_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] + #[IsGranted('PUBLIC_ACCESS')] + #[ParamConverter('user', class: User::class, converter: 'username_feed_token_converter')] public function showArchiveFeedAction(User $user, $page) { return $this->showEntries('archive', $user, $page); @@ -56,12 +54,11 @@ class FeedController extends AbstractController /** * Shows starred entries for current user. * - * @IsGranted("PUBLIC_ACCESS") - * - * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") * @return Response */ #[Route(path: '/feed/{username}/{token}/starred/{page}', name: 'starred_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] + #[IsGranted('PUBLIC_ACCESS')] + #[ParamConverter('user', class: User::class, converter: 'username_feed_token_converter')] public function showStarredFeedAction(User $user, $page) { return $this->showEntries('starred', $user, $page); @@ -70,12 +67,11 @@ class FeedController extends AbstractController /** * Shows all entries for current user. * - * @IsGranted("PUBLIC_ACCESS") - * - * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") * @return Response */ #[Route(path: '/feed/{username}/{token}/all/{page}', name: 'all_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] + #[IsGranted('PUBLIC_ACCESS')] + #[ParamConverter('user', class: User::class, converter: 'username_feed_token_converter')] public function showAllFeedAction(User $user, $page) { return $this->showEntries('all', $user, $page); @@ -84,13 +80,12 @@ class FeedController extends AbstractController /** * Shows entries associated to a tag for current user. * - * @IsGranted("PUBLIC_ACCESS") - * - * @ParamConverter("user", class="Wallabag\Entity\User", converter="username_feed_token_converter") - * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) * @return Response */ #[Route(path: '/feed/{username}/{token}/tags/{slug}/{page}', name: 'tag_feed', methods: ['GET'], defaults: ['page' => 1, '_format' => 'xml'])] + #[IsGranted('PUBLIC_ACCESS')] + #[ParamConverter('user', class: User::class, converter: 'username_feed_token_converter')] + #[ParamConverter('tag', options: ['mapping' => ['slug' => 'slug']])] public function showTagsFeedAction(Request $request, User $user, Tag $tag, PreparePagerForEntries $preparePagerForEntries, $page) { $sort = $request->query->get('sort', 'created'); diff --git a/src/Controller/IgnoreOriginInstanceRuleController.php b/src/Controller/IgnoreOriginInstanceRuleController.php index d4c7d2156..996d7c49f 100644 --- a/src/Controller/IgnoreOriginInstanceRuleController.php +++ b/src/Controller/IgnoreOriginInstanceRuleController.php @@ -28,10 +28,9 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Lists all IgnoreOriginInstanceRule entities. - * - * @IsGranted("LIST_IGNORE_ORIGIN_INSTANCE_RULES") */ #[Route(path: '/ignore-origin-instance-rules', name: 'ignore_origin_instance_rules_index', methods: ['GET'])] + #[IsGranted('LIST_IGNORE_ORIGIN_INSTANCE_RULES')] public function indexAction(IgnoreOriginInstanceRuleRepository $repository) { $rules = $repository->findAll(); @@ -44,10 +43,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Creates a new ignore origin instance rule entity. * - * @IsGranted("CREATE_IGNORE_ORIGIN_INSTANCE_RULES") * @return Response */ #[Route(path: '/ignore-origin-instance-rules/new', name: 'ignore_origin_instance_rules_new', methods: ['GET', 'POST'])] + #[IsGranted('CREATE_IGNORE_ORIGIN_INSTANCE_RULES')] public function newAction(Request $request) { $ignoreOriginInstanceRule = new IgnoreOriginInstanceRule(); @@ -76,10 +75,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Displays a form to edit an existing ignore origin instance rule entity. * - * @IsGranted("EDIT", subject="ignoreOriginInstanceRule") * @return Response */ #[Route(path: '/ignore-origin-instance-rules/{id}/edit', name: 'ignore_origin_instance_rules_edit', methods: ['GET', 'POST'])] + #[IsGranted('EDIT', subject: 'ignoreOriginInstanceRule')] public function editAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule) { $deleteForm = $this->createDeleteForm($ignoreOriginInstanceRule); @@ -108,10 +107,10 @@ class IgnoreOriginInstanceRuleController extends AbstractController /** * Deletes a site credential entity. * - * @IsGranted("DELETE", subject="ignoreOriginInstanceRule") * @return RedirectResponse */ #[Route(path: '/ignore-origin-instance-rules/{id}', name: 'ignore_origin_instance_rules_delete', methods: ['DELETE'])] + #[IsGranted('DELETE', subject: 'ignoreOriginInstanceRule')] public function deleteAction(Request $request, IgnoreOriginInstanceRule $ignoreOriginInstanceRule) { $form = $this->createDeleteForm($ignoreOriginInstanceRule); diff --git a/src/Controller/Import/BrowserController.php b/src/Controller/Import/BrowserController.php index 594da2c7d..3b897248b 100644 --- a/src/Controller/Import/BrowserController.php +++ b/src/Controller/Import/BrowserController.php @@ -14,10 +14,10 @@ use Wallabag\Import\ImportInterface; abstract class BrowserController extends AbstractController { /** - * @IsGranted("IMPORT_ENTRIES") * @return Response */ #[Route(path: '/import/browser', name: 'import_browser', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ChromeController.php b/src/Controller/Import/ChromeController.php index 60dd549e1..0283cdee4 100644 --- a/src/Controller/Import/ChromeController.php +++ b/src/Controller/Import/ChromeController.php @@ -21,10 +21,8 @@ class ChromeController extends BrowserController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/chrome', name: 'import_chrome', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/DeliciousController.php b/src/Controller/Import/DeliciousController.php index 9c34852e0..2caa6bdc1 100644 --- a/src/Controller/Import/DeliciousController.php +++ b/src/Controller/Import/DeliciousController.php @@ -21,10 +21,8 @@ class DeliciousController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/delicious', name: 'import_delicious', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, DeliciousImport $delicious, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ElcuratorController.php b/src/Controller/Import/ElcuratorController.php index 9e125d167..4132f01d4 100644 --- a/src/Controller/Import/ElcuratorController.php +++ b/src/Controller/Import/ElcuratorController.php @@ -21,10 +21,8 @@ class ElcuratorController extends WallabagController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/elcurator', name: 'import_elcurator', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/FirefoxController.php b/src/Controller/Import/FirefoxController.php index 054a1c42e..d3c6ad75d 100644 --- a/src/Controller/Import/FirefoxController.php +++ b/src/Controller/Import/FirefoxController.php @@ -21,10 +21,8 @@ class FirefoxController extends BrowserController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/firefox', name: 'import_firefox', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/HtmlController.php b/src/Controller/Import/HtmlController.php index 5aad57026..c55e114e1 100644 --- a/src/Controller/Import/HtmlController.php +++ b/src/Controller/Import/HtmlController.php @@ -14,10 +14,10 @@ use Wallabag\Import\ImportInterface; abstract class HtmlController extends AbstractController { /** - * @IsGranted("IMPORT_ENTRIES") * @return Response */ #[Route(path: '/import/html', name: 'import_html', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ImportController.php b/src/Controller/Import/ImportController.php index bd1d1bd2e..24ae654c0 100644 --- a/src/Controller/Import/ImportController.php +++ b/src/Controller/Import/ImportController.php @@ -19,10 +19,8 @@ class ImportController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/', name: 'import', methods: ['GET'])] + #[IsGranted('IMPORT_ENTRIES')] public function importAction(ImportChain $importChain) { return $this->render('Import/index.html.twig', [ diff --git a/src/Controller/Import/InstapaperController.php b/src/Controller/Import/InstapaperController.php index 946e40637..7edb4a9e7 100644 --- a/src/Controller/Import/InstapaperController.php +++ b/src/Controller/Import/InstapaperController.php @@ -21,10 +21,8 @@ class InstapaperController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/instapaper', name: 'import_instapaper', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, InstapaperImport $instapaper, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/OmnivoreController.php b/src/Controller/Import/OmnivoreController.php index 4f13c61f2..1796cb4ab 100644 --- a/src/Controller/Import/OmnivoreController.php +++ b/src/Controller/Import/OmnivoreController.php @@ -21,10 +21,8 @@ class OmnivoreController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/omnivore', name: 'import_omnivore', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, OmnivoreImport $omnivore, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/PinboardController.php b/src/Controller/Import/PinboardController.php index 42ce78aee..437faac83 100644 --- a/src/Controller/Import/PinboardController.php +++ b/src/Controller/Import/PinboardController.php @@ -21,10 +21,8 @@ class PinboardController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/pinboard', name: 'import_pinboard', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, PinboardImport $pinboard, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/PocketController.php b/src/Controller/Import/PocketController.php index 5bad8049d..2970f5472 100644 --- a/src/Controller/Import/PocketController.php +++ b/src/Controller/Import/PocketController.php @@ -25,10 +25,8 @@ class PocketController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/pocket', name: 'import_pocket', methods: ['GET'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(PocketImport $pocketImport) { $pocket = $this->getPocketImportService($pocketImport); @@ -47,10 +45,8 @@ class PocketController extends AbstractController ]); } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/pocket/auth', name: 'import_pocket_auth', methods: ['POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function authAction(Request $request, PocketImport $pocketImport) { $requestToken = $this->getPocketImportService($pocketImport) @@ -78,10 +74,8 @@ class PocketController extends AbstractController ); } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/pocket/callback', name: 'import_pocket_callback', methods: ['GET'])] + #[IsGranted('IMPORT_ENTRIES')] public function callbackAction(PocketImport $pocketImport, TranslatorInterface $translator) { $message = 'flashes.import.notice.failed'; diff --git a/src/Controller/Import/PocketHtmlController.php b/src/Controller/Import/PocketHtmlController.php index 6d47b95c6..00f6b7b7d 100644 --- a/src/Controller/Import/PocketHtmlController.php +++ b/src/Controller/Import/PocketHtmlController.php @@ -21,10 +21,8 @@ class PocketHtmlController extends HtmlController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/pocket_html', name: 'import_pocket_html', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/ReadabilityController.php b/src/Controller/Import/ReadabilityController.php index ee0575cfc..6409f5d05 100644 --- a/src/Controller/Import/ReadabilityController.php +++ b/src/Controller/Import/ReadabilityController.php @@ -21,10 +21,8 @@ class ReadabilityController extends AbstractController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/readability', name: 'import_readability', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, ReadabilityImport $readability, Config $craueConfig, TranslatorInterface $translator) { $form = $this->createForm(UploadImportType::class); diff --git a/src/Controller/Import/ShaarliController.php b/src/Controller/Import/ShaarliController.php index a10b94193..8be50a180 100644 --- a/src/Controller/Import/ShaarliController.php +++ b/src/Controller/Import/ShaarliController.php @@ -21,10 +21,8 @@ class ShaarliController extends HtmlController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/shaarli', name: 'import_shaarli', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/WallabagV1Controller.php b/src/Controller/Import/WallabagV1Controller.php index 93d9192b3..7537db124 100644 --- a/src/Controller/Import/WallabagV1Controller.php +++ b/src/Controller/Import/WallabagV1Controller.php @@ -21,10 +21,8 @@ class WallabagV1Controller extends WallabagController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/wallabag-v1', name: 'import_wallabag_v1', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/Import/WallabagV2Controller.php b/src/Controller/Import/WallabagV2Controller.php index 9cba58c91..dee455336 100644 --- a/src/Controller/Import/WallabagV2Controller.php +++ b/src/Controller/Import/WallabagV2Controller.php @@ -21,10 +21,8 @@ class WallabagV2Controller extends WallabagController ) { } - /** - * @IsGranted("IMPORT_ENTRIES") - */ #[Route(path: '/import/wallabag-v2', name: 'import_wallabag_v2', methods: ['GET', 'POST'])] + #[IsGranted('IMPORT_ENTRIES')] public function indexAction(Request $request, TranslatorInterface $translator) { return parent::indexAction($request, $translator); diff --git a/src/Controller/SiteCredentialController.php b/src/Controller/SiteCredentialController.php index 0a9a648ee..70f9af98e 100644 --- a/src/Controller/SiteCredentialController.php +++ b/src/Controller/SiteCredentialController.php @@ -33,10 +33,9 @@ class SiteCredentialController extends AbstractController /** * Lists all User entities. - * - * @IsGranted("LIST_SITE_CREDENTIALS") */ #[Route(path: '/site-credentials', name: 'site_credentials_index', methods: ['GET'])] + #[IsGranted('LIST_SITE_CREDENTIALS')] public function indexAction(SiteCredentialRepository $repository) { $this->isSiteCredentialsEnabled(); @@ -51,10 +50,10 @@ class SiteCredentialController extends AbstractController /** * Creates a new site credential entity. * - * @IsGranted("CREATE_SITE_CREDENTIALS") * @return Response */ #[Route(path: '/site-credentials/new', name: 'site_credentials_new', methods: ['GET', 'POST'])] + #[IsGranted('CREATE_SITE_CREDENTIALS')] public function newAction(Request $request) { $this->isSiteCredentialsEnabled(); @@ -88,10 +87,10 @@ class SiteCredentialController extends AbstractController /** * Displays a form to edit an existing site credential entity. * - * @IsGranted("EDIT", subject="siteCredential") * @return Response */ #[Route(path: '/site-credentials/{id}/edit', name: 'site_credentials_edit', methods: ['GET', 'POST'])] + #[IsGranted('EDIT', subject: 'siteCredential')] public function editAction(Request $request, SiteCredential $siteCredential) { $this->isSiteCredentialsEnabled(); @@ -125,10 +124,10 @@ class SiteCredentialController extends AbstractController /** * Deletes a site credential entity. * - * @IsGranted("DELETE", subject="siteCredential") * @return RedirectResponse */ #[Route(path: '/site-credentials/{id}', name: 'site_credentials_delete', methods: ['DELETE'])] + #[IsGranted('DELETE', subject: 'siteCredential')] public function deleteAction(Request $request, SiteCredential $siteCredential) { $this->isSiteCredentialsEnabled(); diff --git a/src/Controller/StaticController.php b/src/Controller/StaticController.php index 7f7700bed..5c7bb06e3 100644 --- a/src/Controller/StaticController.php +++ b/src/Controller/StaticController.php @@ -7,10 +7,8 @@ use Symfony\Component\Routing\Annotation\Route; class StaticController extends AbstractController { - /** - * @IsGranted("IS_AUTHENTICATED_FULLY") - */ #[Route(path: '/howto', name: 'howto', methods: ['GET'])] + #[IsGranted('IS_AUTHENTICATED_FULLY')] public function howtoAction() { $addonsUrl = $this->getParameter('addons_url'); @@ -23,10 +21,8 @@ class StaticController extends AbstractController ); } - /** - * @IsGranted("IS_AUTHENTICATED_FULLY") - */ #[Route(path: '/about', name: 'about', methods: ['GET'])] + #[IsGranted('IS_AUTHENTICATED_FULLY')] public function aboutAction() { return $this->render( @@ -38,10 +34,8 @@ class StaticController extends AbstractController ); } - /** - * @IsGranted("IS_AUTHENTICATED_FULLY") - */ #[Route(path: '/quickstart', name: 'quickstart', methods: ['GET'])] + #[IsGranted('IS_AUTHENTICATED_FULLY')] public function quickstartAction() { return $this->render( diff --git a/src/Controller/TagController.php b/src/Controller/TagController.php index 2c7c837ef..38e9173ce 100644 --- a/src/Controller/TagController.php +++ b/src/Controller/TagController.php @@ -34,10 +34,10 @@ class TagController extends AbstractController } /** - * @IsGranted("TAG", subject="entry") * @return Response */ #[Route(path: '/new-tag/{entry}', name: 'new_tag', methods: ['POST'], requirements: ['entry' => '\d+'])] + #[IsGranted('TAG', subject: 'entry')] public function addTagFormAction(Request $request, Entry $entry, TranslatorInterface $translator) { $form = $this->createForm(NewTagType::class, new Tag()); @@ -83,10 +83,10 @@ class TagController extends AbstractController /** * Removes tag from entry. * - * @IsGranted("UNTAG", subject="entry") * @return Response */ #[Route(path: '/remove-tag/{entry}/{tag}', name: 'remove_tag', methods: ['GET'], requirements: ['entry' => '\d+', 'tag' => '\d+'])] + #[IsGranted('UNTAG', subject: 'entry')] public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag) { $entry->removeTag($tag); @@ -106,10 +106,10 @@ class TagController extends AbstractController /** * Shows tags for current user. * - * @IsGranted("LIST_TAGS") * @return Response */ #[Route(path: '/tag/list', name: 'tag', methods: ['GET'])] + #[IsGranted('LIST_TAGS')] public function showTagAction(TagRepository $tagRepository, EntryRepository $entryRepository) { $allTagsWithNbEntries = $tagRepository->findAllTagsWithNbEntries($this->getUser()->getId()); @@ -130,12 +130,12 @@ class TagController extends AbstractController /** * @param int $page * - * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) - * @IsGranted("LIST_ENTRIES") - * @IsGranted("VIEW", subject="tag") * @return Response */ #[Route(path: '/tag/list/{slug}/{page}', name: 'tag_entries', methods: ['GET'], defaults: ['page' => '1'])] + #[ParamConverter('tag', options: ['mapping' => ['slug' => 'slug']])] + #[IsGranted('LIST_ENTRIES')] + #[IsGranted('VIEW', subject: 'tag')] public function showEntriesForTagAction(Tag $tag, EntryRepository $entryRepository, PreparePagerForEntries $preparePagerForEntries, $page, Request $request) { $entriesByTag = $entryRepository->findAllByTagId( @@ -170,11 +170,11 @@ class TagController extends AbstractController * Rename a given tag with a new label * Create a new tag with the new name and drop the old one. * - * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) - * @IsGranted("EDIT", subject="tag") * @return Response */ #[Route(path: '/tag/rename/{slug}', name: 'tag_rename', methods: ['POST'])] + #[ParamConverter('tag', options: ['mapping' => ['slug' => 'slug']])] + #[IsGranted('EDIT', subject: 'tag')] public function renameTagAction(Tag $tag, Request $request, TagRepository $tagRepository, EntryRepository $entryRepository) { $form = $this->createForm(RenameTagType::class, new Tag()); @@ -223,10 +223,10 @@ class TagController extends AbstractController /** * Tag search results with the current search term. * - * @IsGranted("CREATE_TAGS") * @return Response */ #[Route(path: '/tag/search/{filter}', name: 'tag_this_search', methods: ['GET'])] + #[IsGranted('CREATE_TAGS')] public function tagThisSearchAction($filter, Request $request, EntryRepository $entryRepository) { $currentRoute = $request->query->has('currentRoute') ? $request->query->get('currentRoute') : ''; @@ -258,11 +258,11 @@ class TagController extends AbstractController /** * Delete a given tag for the current user. * - * @ParamConverter("tag", options={"mapping": {"slug": "slug"}}) - * @IsGranted("DELETE", subject="tag") * @return Response */ #[Route(path: '/tag/delete/{slug}', name: 'tag_delete', methods: ['GET'])] + #[ParamConverter('tag', options: ['mapping' => ['slug' => 'slug']])] + #[IsGranted('DELETE', subject: 'tag')] public function removeTagAction(Tag $tag, Request $request, EntryRepository $entryRepository) { foreach ($tag->getEntriesByUserId($this->getUser()->getId()) as $entry) { diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 880876879..9f576b7dc 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -37,10 +37,9 @@ class UserController extends AbstractController /** * Creates a new User entity. - * - * @IsGranted("CREATE_USERS") */ #[Route(path: '/users/new', name: 'user_new', methods: ['GET', 'POST'])] + #[IsGranted('CREATE_USERS')] public function newAction(Request $request, UserManagerInterface $userManager, EventDispatcherInterface $eventDispatcher) { $user = $userManager->createUser(); @@ -74,10 +73,9 @@ class UserController extends AbstractController /** * Displays a form to edit an existing User entity. - * - * @IsGranted("EDIT", subject="user") */ #[Route(path: '/users/{id}/edit', name: 'user_edit', methods: ['GET', 'POST'])] + #[IsGranted('EDIT', subject: 'user')] public function editAction(Request $request, User $user, UserManagerInterface $userManager, GoogleAuthenticatorInterface $googleAuthenticator) { $deleteForm = $this->createDeleteForm($user); @@ -117,10 +115,9 @@ class UserController extends AbstractController /** * Deletes a User entity. - * - * @IsGranted("DELETE", subject="user") */ #[Route(path: '/users/{id}', name: 'user_delete', methods: ['DELETE'])] + #[IsGranted('DELETE', subject: 'user')] public function deleteAction(Request $request, User $user) { $form = $this->createDeleteForm($user); @@ -142,13 +139,10 @@ class UserController extends AbstractController /** * @param int $page * - * @IsGranted("LIST_USERS") - * - * Default parameter for page is hardcoded (in duplication of the defaults from the Route) - * because this controller is also called inside the layout template without any page as argument * @return Response */ #[Route(path: '/users/list/{page}', name: 'user_index', methods: ['GET'], defaults: ['page' => 1])] + #[IsGranted('LIST_USERS')] // Default parameter for page is hardcoded (in duplication of the defaults from the Route) public function searchFormAction(Request $request, UserRepository $userRepository, $page = 1) { $qb = $userRepository->createQueryBuilder('u');