diff --git a/composer.json b/composer.json index 141ffbb..98d47cf 100644 --- a/composer.json +++ b/composer.json @@ -10,20 +10,20 @@ } ], "require": { - "php": "^7.4||^8.0", + "php": "^8.1", "doctrine/orm": "^2.8 || ^3.2", - "symfony/framework-bundle": "^4.3|^5|^6.0|^7.0", - "symfony/console": "^4.3.4|^5|^6.0|^7.0", - "typesense/typesense-php": "^4.5", + "symfony/framework-bundle": "^5.4|^6.0|^7.0|^8.0", + "symfony/console": "^5.4|^6.0|^7.0|^8.0", + "typesense/typesense-php": "^4.5 || ^6.0", "php-http/curl-client": "^2.2", "monolog/monolog": "^2.3|^3.0", - "symfony/property-access": "^3.4|^4.3|^5|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.2|^7.0" + "symfony/property-access": "^5.4|^6.0|^7.0|^8.0", + "symfony/http-client": "^5.4|^6.2|^7.0|^8.0" }, "require-dev": { - "symfony/phpunit-bridge": "^5.0|^6.0", - "phpunit/phpunit": "^9.5", - "symfony/yaml": "^3.4 || ^4.4 || ^5.4 || ^6.0", + "symfony/phpunit-bridge": "^5.0|^6.0|^7.0|^8.0", + "phpunit/phpunit": "^9.5|^10.0|^11.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0 || ^8.0", "dg/bypass-finals": "^1.9", "phpspec/prophecy-phpunit": "^2.0" }, diff --git a/src/Command/CreateCommand.php b/src/Command/CreateCommand.php index 1b850ba..20fa0d3 100644 --- a/src/Command/CreateCommand.php +++ b/src/Command/CreateCommand.php @@ -5,15 +5,16 @@ namespace ACSEO\TypesenseBundle\Command; use ACSEO\TypesenseBundle\Manager\CollectionManager; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +#[AsCommand(name: 'typesense:create', description: 'Create Typesense indexes')] class CreateCommand extends Command { - protected static $defaultName = 'typesense:create'; private $collectionManager; public function __construct(CollectionManager $collectionManager) @@ -22,13 +23,10 @@ public function __construct(CollectionManager $collectionManager) $this->collectionManager = $collectionManager; } - protected function configure() + protected function configure(): void { $this - ->setName(self::$defaultName) ->addOption('indexes', null, InputOption::VALUE_OPTIONAL, 'The index(es) to repopulate. Comma separated values') - ->setDescription('Create Typsenses indexes') - ; } diff --git a/src/Command/ImportCommand.php b/src/Command/ImportCommand.php index 0aedef8..553b104 100644 --- a/src/Command/ImportCommand.php +++ b/src/Command/ImportCommand.php @@ -8,16 +8,16 @@ use ACSEO\TypesenseBundle\Manager\DocumentManager; use ACSEO\TypesenseBundle\Transformer\DoctrineToTypesenseTransformer; use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +#[AsCommand(name: 'typesense:import', description: 'Import collections from Database')] class ImportCommand extends Command { - protected static $defaultName = 'typesense:import'; - private $em; private $collectionManager; private $documentManager; @@ -42,11 +42,9 @@ public function __construct( $this->transformer = $transformer; } - protected function configure() + protected function configure(): void { $this - ->setName(self::$defaultName) - ->setDescription('Import collections from Database') ->addOption('action', null, InputOption::VALUE_OPTIONAL, 'Action modes for typesense import ("create", "upsert" or "update")', 'upsert') ->addOption('indexes', null, InputOption::VALUE_OPTIONAL, 'The index(es) to repopulate. Comma separated values') ->addOption('first-page', null, InputOption::VALUE_REQUIRED, 'The pager\'s page to start population from. Including the given page.', 1) diff --git a/src/DependencyInjection/ACSEOTypesenseExtension.php b/src/DependencyInjection/ACSEOTypesenseExtension.php index 54d79cd..17ec30c 100644 --- a/src/DependencyInjection/ACSEOTypesenseExtension.php +++ b/src/DependencyInjection/ACSEOTypesenseExtension.php @@ -8,7 +8,7 @@ use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\DependencyInjection\Reference; class ACSEOTypesenseExtension extends Extension @@ -45,11 +45,11 @@ public function load(array $configs, ContainerBuilder $container): void return; } - $loader = new XMlFileLoader( + $loader = new PhpFileLoader( $container, new FileLocator(__DIR__.'/../Resources/config') ); - $loader->load('services.xml'); + $loader->load('services.php'); $this->loadClient($config['typesense'], $container); diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php new file mode 100644 index 0000000..100ec21 --- /dev/null +++ b/src/Resources/config/services.php @@ -0,0 +1,139 @@ +services() + ->defaults() + ->public(); + + // Abstract definition for client + $services->set('typesense.client_prototype', TypesenseClient::class) + ->abstract() + ->args([ + '', // host + '', // key + service('typesense.logger')->nullOnInvalid(), // logger + ]); + + // Abstract definition for all generic finders + $services->set('typesense.finder', CollectionFinder::class) + ->abstract() + ->args([ + service('typesense.collection_client'), + service('doctrine.orm.entity_manager'), + '', // collection config + ]); + + // Abstract definition for all specific finders + $services->set('typesense.specificfinder', SpecificCollectionFinder::class) + ->abstract() + ->args([ + '', // generic finder class + '', // finder arguments + ]); + + // Autocomplete controller + $services->set('typesense.autocomplete_controller', TypesenseAutocompleteController::class) + ->args([ + '', // routes + ]); + + // Logger + $services->set('typesense.logger', TypesenseLogger::class) + ->public(false); + + $services->alias(TypesenseLogger::class, 'typesense.logger'); + + // Data Collector + $services->set('typesense.data_collector', TypesenseDataCollector::class) + ->public(false) + ->args([ + service('typesense.logger'), + ]) + ->tag('data_collector', [ + 'template' => '@ACSEOTypesense/DataCollector/typesense.html.twig', + 'id' => 'typesense', + 'priority' => 300, + ]); + + // Collection Client + $services->set('typesense.collection_client', CollectionClient::class) + ->args([ + service('typesense.client'), + service('typesense.logger')->nullOnInvalid(), + ]); + + $services->alias(CollectionClient::class, 'typesense.collection_client'); + $services->alias(TypesenseClient::class, 'typesense.client'); + + // Collection Manager + $services->set('typesense.collection_manager', CollectionManager::class) + ->args([ + service('typesense.collection_client'), + service('typesense.transformer.doctrine_to_typesense'), + '', // collections + ]); + + $services->alias(CollectionManager::class, 'typesense.collection_manager'); + + // Document Manager + $services->set('typesense.document_manager', DocumentManager::class) + ->args([ + service('typesense.client'), + ]); + + // Doctrine Event Listener + $services->set('typesense.listener.doctrine_indexer', TypesenseIndexer::class) + ->args([ + service('typesense.collection_manager'), + service('typesense.document_manager'), + service('typesense.transformer.doctrine_to_typesense'), + ]) + ->tag('doctrine.event_listener', ['event' => 'postPersist', 'priority' => 500, 'connection' => 'default']) + ->tag('doctrine.event_listener', ['event' => 'postUpdate', 'priority' => 500, 'connection' => 'default']) + ->tag('doctrine.event_listener', ['event' => 'preRemove', 'priority' => 500, 'connection' => 'default']) + ->tag('doctrine.event_listener', ['event' => 'postRemove', 'priority' => 500, 'connection' => 'default']) + ->tag('doctrine.event_listener', ['event' => 'postFlush', 'priority' => 500, 'connection' => 'default']); + + // Transformer + $services->set('typesense.transformer.doctrine_to_typesense', DoctrineToTypesenseTransformer::class) + ->args([ + '', // collections + service('property_accessor'), + service('service_container'), + ]); + + // Commands + $services->set('typesense.command.create', CreateCommand::class) + ->tag('console.command') + ->args([ + service('typesense.collection_manager'), + ]); + + $services->set('typesense.command.import', ImportCommand::class) + ->tag('console.command') + ->args([ + service('doctrine.orm.entity_manager'), + service('typesense.collection_manager'), + service('typesense.document_manager'), + service('typesense.transformer.doctrine_to_typesense'), + ]); +}; diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml deleted file mode 100644 index 5d6032b..0000000 --- a/src/Resources/config/services.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -