Skip to content

Commit

Permalink
Refactor the search controller into two separate actions
Browse files Browse the repository at this point in the history
  • Loading branch information
loevgaard committed Aug 10, 2024
1 parent de9e49b commit 96ba42d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Controller;
namespace Setono\SyliusMeilisearchPlugin\Controller\Action;

use Doctrine\Persistence\ManagerRegistry;
use Meilisearch\Client;
Expand All @@ -11,17 +11,15 @@
use Setono\SyliusMeilisearchPlugin\Document\Metadata\Facet;
use Setono\SyliusMeilisearchPlugin\Document\Metadata\MetadataFactoryInterface;
use Setono\SyliusMeilisearchPlugin\Form\Builder\SearchFormBuilderInterface;
use Setono\SyliusMeilisearchPlugin\Form\Type\SearchWidgetType;
use Setono\SyliusMeilisearchPlugin\Meilisearch\Builder\FilterBuilderInterface;
use Setono\SyliusMeilisearchPlugin\Model\IndexableInterface;
use Setono\SyliusMeilisearchPlugin\Resolver\IndexName\IndexNameResolverInterface;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment;
use Webmozart\Assert\Assert;

final class SearchController
final class SearchAction
{
use ORMTrait;

Expand All @@ -32,13 +30,15 @@ public function __construct(
private readonly IndexRegistryInterface $indexRegistry,
private readonly Client $client,
private readonly MetadataFactoryInterface $metadataFactory,
private readonly SearchFormBuilderInterface $searchFormBuilder,
private readonly FilterBuilderInterface $filterBuilder,
private readonly string $searchIndex,
private readonly int $hitsPerPage,
) {
$this->managerRegistry = $managerRegistry;
}

public function search(Request $request, SearchFormBuilderInterface $searchFormBuilder, FilterBuilderInterface $filterBuilder): Response
public function __invoke(Request $request): Response
{
$q = $request->query->get('q');
Assert::nullOrString($q);
Expand All @@ -52,13 +52,13 @@ public function search(Request $request, SearchFormBuilderInterface $searchFormB

$searchResult = $this->client->index($this->indexNameResolver->resolve($index))->search($q, [
'facets' => array_map(static fn (Facet $facet) => $facet->name, $metadata->getFacets()),
'filter' => $filterBuilder->build($request),
'filter' => $this->filterBuilder->build($request),
'sort' => ['price:asc'], // todo doesn't work for some reason...?
'hitsPerPage' => $this->hitsPerPage,
'page' => $page,
]);

$searchForm = $searchFormBuilder->build($searchResult);
$searchForm = $this->searchFormBuilder->build($searchResult);
$searchForm->handleRequest($request);

dump($searchResult);

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.1 | Deps: lowest | SF~6.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.2 | Deps: lowest | SF~6.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.1 | Deps: highest | SF~5.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.2 | Deps: highest | SF~5.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.1 | Deps: lowest | SF~5.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.2 | Deps: lowest | SF~5.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)

Check failure on line 64 in src/Controller/Action/SearchAction.php

View workflow job for this annotation

GitHub Actions / Static Code Analysis (PHP8.2 | Deps: highest | SF~6.4.0)

ForbiddenCode

src/Controller/Action/SearchAction.php:64:9: ForbiddenCode: You have forbidden the use of dump (see https://psalm.dev/002)
Expand All @@ -76,13 +76,4 @@ public function search(Request $request, SearchFormBuilderInterface $searchFormB
'items' => $items,
]));
}

public function widget(FormFactoryInterface $formFactory): Response
{
$form = $formFactory->createNamed('', SearchWidgetType::class);

return new Response($this->twig->render('@SetonoSyliusMeilisearchPlugin/search/widget/content.html.twig', [
'form' => $form->createView(),
]));
}
}
29 changes: 29 additions & 0 deletions src/Controller/Action/SearchWidgetAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

namespace Setono\SyliusMeilisearchPlugin\Controller\Action;

use Setono\SyliusMeilisearchPlugin\Form\Type\SearchWidgetType;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\HttpFoundation\Response;
use Twig\Environment;

/**
* Shows the global search form
*/
final class SearchWidgetAction
{
public function __construct(
private readonly Environment $twig,
private readonly FormFactoryInterface $formFactory,
) {
}

public function __invoke(): Response
{
return new Response($this->twig->render('@SetonoSyliusMeilisearchPlugin/search/widget/content.html.twig', [
'form' => $this->formFactory->createNamed('', SearchWidgetType::class)->createView(),
]));
}
}
4 changes: 2 additions & 2 deletions src/Resources/config/routes/shop.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
setono_sylius_meilisearch_shop_search:
path: '%setono_sylius_meilisearch.search.path%'
methods: [GET]
controller: Setono\SyliusMeilisearchPlugin\Controller\SearchController::search
controller: Setono\SyliusMeilisearchPlugin\Controller\Action\SearchAction

setono_sylius_meilisearch_shop_search_widget:
path: '%setono_sylius_meilisearch.search.path%/widget'
methods: [GET]
controller: Setono\SyliusMeilisearchPlugin\Controller\SearchController::widget
controller: Setono\SyliusMeilisearchPlugin\Controller\Action\SearchWidgetAction
11 changes: 8 additions & 3 deletions src/Resources/config/services/conditional/search.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,22 @@
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://symfony.com/schema/dic/services"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="Setono\SyliusMeilisearchPlugin\Controller\SearchController" public="true">
<service id="Setono\SyliusMeilisearchPlugin\Controller\Action\SearchWidgetAction" public="true">
<argument type="service" id="twig"/>
<argument type="service" id="form.factory"/>
</service>

<service id="Setono\SyliusMeilisearchPlugin\Controller\Action\SearchAction" public="true">
<argument type="service" id="doctrine"/>
<argument type="service" id="twig"/>
<argument type="service" id="setono_sylius_meilisearch.resolver.index_name"/>
<argument type="service" id="setono_sylius_meilisearch.config.index_registry"/>
<argument type="service" id="Meilisearch\Client"/>
<argument type="service" id="Setono\SyliusMeilisearchPlugin\Document\Metadata\MetadataFactoryInterface"/>
<argument type="service" id="Setono\SyliusMeilisearchPlugin\Form\Builder\SearchFormBuilderInterface"/>
<argument type="service" id="Setono\SyliusMeilisearchPlugin\Meilisearch\Builder\FilterBuilderInterface"/>
<argument>%setono_sylius_meilisearch.search.index%</argument>
<argument>%setono_sylius_meilisearch.search.hits_per_page%</argument>

<tag name="controller.service_arguments"/>
</service>
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Setono\SyliusMeilisearchPlugin\Tests\DependencyInjection;

use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase;
use Setono\SyliusMeilisearchPlugin\Controller\SearchController;
use Setono\SyliusMeilisearchPlugin\Controller\Action\SearchAction;
use Setono\SyliusMeilisearchPlugin\DependencyInjection\SetonoSyliusMeilisearchExtension;
use Setono\SyliusMeilisearchPlugin\Document\Product as ProductDocument;
use Setono\SyliusMeilisearchPlugin\Tests\Application\Entity\Product as ProductEntity;
Expand All @@ -30,7 +30,7 @@ public function it_loads_without_any_configuration(): void
$this->load();

$this->assertContainerBuilderHasParameter('setono_sylius_meilisearch.search.enabled', false);
$this->assertContainerBuilderNotHasService(SearchController::class);
$this->assertContainerBuilderNotHasService(SearchAction::class);
}

/**
Expand Down Expand Up @@ -85,6 +85,6 @@ public function it_configures_search(): void
$this->assertContainerBuilderHasParameter('setono_sylius_meilisearch.search.index', 'products');
$this->assertContainerBuilderHasParameter('setono_sylius_meilisearch.search.hits_per_page', 120);
$this->assertContainerBuilderHasParameter('setono_sylius_meilisearch.search.enabled', true);
$this->assertContainerBuilderHasService(SearchController::class);
$this->assertContainerBuilderHasService(SearchAction::class);
}
}

0 comments on commit 96ba42d

Please sign in to comment.