Recherche
Essayer
Un seul champ, toutes les natures de résultat. Les pages viennent du routeur et ne se déclarent nulle part ; les enregistrements viennent des entités qui portent l'attribut plus bas. Chaque résultat porte sa destination, donc la barre n'a rien à décider de ce qu'un clic veut dire.
Fournisseurs
Un fournisseur, c'est une famille de choses trouvables. Implémenter l'interface suffit à l'enregistrer — l'autoconfiguration le tague, donc un fournisseur écrit dans une application rejoint la recherche en existant. Voici ceux qui répondent ici, sous le nom par lequel une requête peut se restreindre.
-
entity
Wexample\SymfonySearch\Class\Provider\EntitySearchProvider
-
route
Wexample\SymfonySearch\Class\Provider\RouteSearchProvider
class CommandSearchProvider extends AbstractSearchProvider
{
public function provide(SearchQuery $query): iterable
{
// yield $this->createResult($reference, $title)->setScore($score);
}
}
Entités cherchables
La classe dit qu'une entité est cherchable ; ses propriétés disent sur quoi, chacune avec sa nature — un titre se lit, un montant est un chiffre, une adresse est entière ou rien — et la nature décide du SQL comme des points. Six des sept fonctions de score du legacy étaient cette liste déguisée. La septième raisonnait, et celle-là nomme une classe de scoring ; l'entité dont la réponse dépend de qui demande ajoute provider: true et obtient son propre fournisseur.
-
contact
Wexample\SymfonyOrganization\Entity\Contact
Champs : name (text), email (email) -
demo_message
Wexample\SymfonyDesignSystemDemo\Entity\DemoMessage
Champs : body (text, 5) -
demo_room
Wexample\SymfonyDesignSystemDemo\Entity\DemoRoom
Champs : name (text) -
demo_user
Wexample\SymfonyUserDemo\Entity\DemoUser
Champs : email (email), username (text), firstName (text), lastName (text) -
organization
Wexample\SymfonyOrganization\Entity\Organization
Champs : name (text), vatNumber (text), legalIdentifier (text), email (email)
#[ORM\Entity]
#[Searchable(route: 'app_invoice_show')]
class Invoice extends AbstractEntity
{
#[SearchText]
protected string $label;
#[SearchAmount(points: 40)]
protected float $priceTotal;
}
L'API
Un résultat est une entité, donc son endpoint est la collection de cette entité et rien d'autre. Le repository TypeScript généré depuis la même classe PHP l'appelle sans qu'on lui dise où il est — c'est ce qu'utilise le champ ci-dessus.
Paramètres de requête
- search
Ce qu'on cherche. Une requête vide ne répond rien, et non pas tout.
- context
D'où la recherche est faite, ce qui décide de ce qu'elle peut répondre. Contextes livrés : default, header, form_field
- type
Restreint la réponse à une seule nature — un nom d'entité, ou la clé d'un fournisseur.
- length
Combien de résultats. Absent, la configuration du bundle décide.
curl "/api/search-result/list?search=dupont&context=header&length=5"
Traductions
La barre lit ses libellés dans les quatre faces du composant, donc aucun placeholder ne s'écrit dans le markup. Les titres de résultats, eux, viennent de l'enregistrement ou du nom de route — les traduire n'est pas encore câblé, et une page affiche aujourd'hui son nom de route humanisé.
# assets/components/search-bar.fr.yml
placeholder: Rechercher...
empty: Aucun résultat.
pending: Recherche en cours...