搜索
试试
一个字段,各种结果。页面名称来自路由器,无需声明;记录来自承载以下属性的实体。每个结果都携带去往的地方,因此搜索栏无需决定点击的含义。
提供者
提供者是一类可查找的事物。实现接口即为整个注册——自动配置标记它,因此在应用程序中编写的提供者通过存在加入搜索。这些是通过查询名称限制的回应。
-
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);
}
}
可搜索的实体
类表示一个实体是可查找的;它的属性说明了什么,每个属性都有其类型——标题是可读的,数量是数字,地址是完整或无——类型决定了SQL和分数。遗留的七个评分函数中有六个是伪装的列表。第七个是推理的,那个命名了评分类;其答案依赖于提问者的实体添加提供者: true,并获得自己的提供者。
-
contact
Wexample\SymfonyOrganization\Entity\Contact
字段 : name (text), email (email) -
demo_message
Wexample\SymfonyDesignSystemDemo\Entity\DemoMessage
字段 : body (text, 5) -
demo_room
Wexample\SymfonyDesignSystemDemo\Entity\DemoRoom
字段 : name (text) -
demo_user
Wexample\SymfonyUserDemo\Entity\DemoUser
字段 : email (email), username (text), firstName (text), lastName (text) -
organization
Wexample\SymfonyOrganization\Entity\Organization
字段 : 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;
}
API
结果是一个实体,因此其端点是该实体的集合,别无他物。根据相同PHP类生成的TypeScript库在未被告知其位置的情况下调用它——这就是上面字段所使用的。
查询参数
- search
正在查找的内容。空查询不会回答任何内容,而不是所有内容。
- context
搜索的来源,决定了它可能的回答。已提供的上下文: default, header, form_field
- type
将答案限制为一种类型——实体名称或提供者密钥。
- length
结果数量。缺失时,包配置决定。
curl "/api/search-result/list?search=dupont&context=header&length=5"
翻译
搜索栏从组件的四个面读取自己的标签,因此占位符从未在标记中书写。另一方面,结果标题来自记录本身或路由名称——翻译这些尚未连接,目前页面显示其人性化的路由名称。
# assets/components/search-bar.fr.yml
placeholder: Rechercher...
empty: Aucun résultat.
pending: Recherche en cours...