2017 © Pedro Peláez
 

library seo-engine

Banki.ru SEO engine library

image

bankiru/seo-engine

Banki.ru SEO engine library

  • Friday, May 12, 2017
  • by scaytrase
  • Repository
  • 2 Watchers
  • 1 Stars
  • 4,543 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 2 Forks
  • 0 Open issues
  • 6 Versions
  • 16 % Grown

The README.md

Latest Stable Version Total Downloads Latest Unstable Version License, (*1)

Build Status Scrutinizer Code Quality Code Coverage SensioLabsInsight, (*2)

Banki.ru SEO Engine

General purpose SEO library for standalone usage (Symfony DI included), (*3)

Purpose

  • Processing general SEO data
  • SEO links generation
  • Sitemap generation

Installation

composer require bankiru/seo-engine:~1.0

Terminology

Matching

  • Destination — is a route identifier and set of concrete entities indexed by placeholder codes
  • Complete TargetSpace — is a set of all possible destinations for the given route identifier
  • Condition — a binary predicate, can return Destination weight on successful match
  • TargetSpaceDefinition — is a (sub)set of complete TargetSpace, defined by a set of Conditions

Generation

  • Source — is any countable and iterable source of entities, which could be filtered with Condition
  • Filler — (in general) function that infers missing values into Destination

Usage

Standalone

For general standalone usage you have to implement (or use out-of-the-box static collection implementations) three services:, (*4)

  • Destination - An item to match by SEO engine
  • TargetDefinitionRepositoryInterface - A source of TargetSpaces indexed by routes
  • PageRepositoryInterface - Matcher of SeoPageInterface by matched TargetSpace and initial Destination

Generic flow

// 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 integration

This library has built-in integration into symfony request processing flow and DI, so the kernel takes the most of the work above for you, (*5)


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]; }

If you define options: {seo: true} for your route, then you can obtain SEO page immediately with following signature, (*6)


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

This will throw an exception for you automatically., (*7)

Configuration

Routing

Configure route options like following, (*8)

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

To enable listeners for this route, (*9)

Integrations

Local static matching

To bootstrap data configuration there is a local implementation of necessary interface, which allows to start using the library immediately pre-filling the repositories from init\config code., (*10)

Doctrine ORM matching

You can implement the necessary interfaces ontop of your entity repositories. Make sure the entities implement required interfaces (target, condition, etc), (*11)

In order to use link generation ability, you have to define two * Fill source registry with SourceInterface entities indexed by alias * Create Link compiler which can forge a url using the route identifier from link and the destination items as Sluggables, (*12)

As a part of Symfony integration where is the SymfonyRouterCompiler which uses the UrlGenerator to compile the link reference, (*13)

Extensions

You can override, decorate and replace the following extension points to tune your SEO processing experience, (*14)

Matching

  • TargetRepositoryInterface - finds the all matching targets for given route
  • TargetSorter - chooses single target from all fetched above by matching with destination
  • PageRepositoryInterface - finds the SEO page for target and destination

Generation

  • DestinationNormalizer - converts your entity into string for slug generation. SluggableNormalizer normalizer is the primary option for objects, ScalarNormalizer is used for all the scalars
  • DestinationCompiler - forges your destination into the link (href, title and attributes). SymfonyRouterCompiler is the primary default option if symfony available
  • SourceInterface - source of the data to create destinations. No default option, CollectionSource is the built-in one
  • SourceFiller - extend missing entries in destination from source-generated values. Not required, thus no defaults

The Versions