bankiru/seo-engine

此包已被弃用,不再维护。未建议替代包。

Banki.ru SEO 引擎库

0.2 2017-03-30 12:00 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License

Build Status Scrutinizer Code Quality Code Coverage SensioLabsInsight

Banki.ru SEO 引擎

通用 SEO 库,适用于独立使用(包含 Symfony DI)

用途

  • 处理通用 SEO 数据
  • SEO 链接生成
  • 生成站点地图

安装

composer require bankiru/seo-engine:~1.0

术语

匹配

  • 目标 — 是一个路由标识符和一组按占位符代码索引的实体
  • 完整 目标空间 — 是给定路由标识符的所有可能的目标的集合
  • 条件 — 是一个二元谓词,在成功匹配时可以返回 目标 重量
  • 目标空间定义 — 是完整 目标空间 的一个(子)集,由一组 条件 定义

生成

  • — 是任何可计数的可迭代实体源,可以使用 条件 进行过滤
  • 填充器 — (通常)是一个函数,将缺失值推断到 目标

使用方法

独立

对于通用独立使用,您必须实现(或使用现成的静态集合实现)三个服务

  • 目标 - SEO 引擎要匹配的项目
  • TargetDefinitionRepositoryInterface - 根据 目标空间 索引的路由来源
  • PageRepositoryInterface - 通过匹配的 目标空间 和初始 目标 匹配 SeoPageInterface

通用流程

// Instantiate TargetRepository
$targetRepository = new StaticTargetRepository();
// Fill it with $targetRepository->add($target);

// Instantiate PageRepository
$pageRepository = new StaticPageRepository();
// Fill page pairs with $pageRepository->add($target, $page);

// Instantiate target sorter
$sorter = new MatchScoreTargetSorter($targetRepository);
// Instantiate matcher

$matcher = new DestinationMatcher($sorter, $pageRepository);
// Create the destination to match
// The general approach is to hook into request processing and create it
// from incoming HTTP request

$destination = new Destination(
    '/blog/articles/123',
    [
        'page_id' => 123,
        'language' => 'en',
        'category' => 'programming'
    ]
);

// Obtain matching SEO page for destination. Or handle a matching exception

try {
  $page = $matcher->match($destination);
} catch (MatchingException $e) {
  // you probably also wan't to set proper headers here
  echo "Not found";
  exit();
}

// Do whatether you want to render $page as HTML response properly.

Symfony 集成

此库已内置到 symfony 请求处理流程和 DI 中,因此内核为您完成了上述大部分工作

public function someAction(Request $request) {
    $destination = RequestDestinationFactory::createFromRequest($requset)
    $matcher = $container->get('bankiru.seo.matcher');
    
    try {
      $page = $matcher->match($destination);
    } catch (MatchingException $e) {
      throw $this->createNotFoundException();
    }
    
    return ['page'=>$page];
}

如果您为您的路由定义了 options: {seo: true},则可以通过以下签名立即获取 SEO 页面

public function someAction(SeoPageInterface $_seo_page)
{
   return ['page'=>$page];
}

这将自动为您抛出异常。

配置

路由

配置路由选项,如下所示

my_route:
    resources: routes.yml
    options:
        seo: true

启用此路由的监听器

集成

本地静态匹配

要启动数据配置,有一个必要的本地接口实现,它允许立即从 init\config 代码中填充存储库并开始使用库。

Doctrine ORM 匹配

您可以在实体仓库之上实现必要的接口。确保实体实现了所需的接口(目标、条件等)

链接生成

为了使用链接生成功能,您必须定义两个

  • 使用别名按索引填充源注册表,其中包含 SourceInterface 实体
  • 创建链接编译器,该编译器可以使用链接的路线标识符和目的地项作为 Sluggable 来构造 URL

作为 Symfony 集成的一部分,其中包含 SymfonyRouterCompiler,它使用 UrlGenerator 来编译链接引用

扩展

您可以通过覆盖、装饰和替换以下扩展点来调整您的 SEO 处理体验

匹配

  • TargetRepositoryInterface - 为给定路由查找所有匹配的目标
  • TargetSorter - 从上述所有获取的目标中选择单个目标,通过与目的地匹配来实现
  • PageRepositoryInterface - 为目标和目的地查找 SEO 页面

生成

  • DestinationNormalizer - 将您的实体转换为字符串以生成 slug。 SluggableNormalizer 是对象的主要选项,ScalarNormalizer 用于所有标量
  • DestinationCompiler - 将您的目的地构造到链接中(href、标题和属性)。如果 symfony 可用,则 SymfonyRouterCompiler 是主要默认选项
  • SourceInterface - 创建目的地的数据源。没有默认选项,CollectionSource 是内置的
  • SourceFiller - 扩展从源生成的值中缺少的目的地条目。不是必需的,因此没有默认值