搜索

搜索

试试

一个字段,各种结果。页面名称来自路由器,无需声明;记录来自承载以下属性的实体。每个结果都携带去往的地方,因此搜索栏无需决定点击的含义。

提供者

提供者是一类可查找的事物。实现接口即为整个注册——自动配置标记它,因此在应用程序中编写的提供者通过存在加入搜索。这些是通过查询名称限制的回应。

  • 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

    结果数量。缺失时,包配置决定。

/api/search-result/list
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...