bankiru / seo-engine
Banki.ru SEO engine library
Installs: 25 413
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 3
Forks: 1
Open Issues: 0
Requires
- php: ~5.5 || ~7.0
- doctrine/collections: ~1.1
- doctrine/common: ~2.4
Requires (Dev)
- phpunit/phpunit: ~4.8 || ~5.0
- symfony/browser-kit: ~2.8 || ~3.0
- symfony/config: ~2.7 || ~3.0
- symfony/dependency-injection: ~2.7 || ~3.0
- symfony/framework-bundle: ~2.8 || ~3.0
- symfony/http-kernel: ~2.7 || ~3.0
- symfony/options-resolver: ~2.7 || ~3.0
- symfony/routing: ~2.7 || ~3.0
- symfony/twig-bundle: ~2.7 || ~3.0
- twig/twig: ~1.20
Suggests
- symfony/symfony: To use as a bundle
- twig/twig: To render links twig templates
This package is not auto-updated.
Last update: 2022-11-08 05:11:32 UTC
README
Banki.ru SEO Engine
General purpose SEO library for standalone usage (Symfony DI included)
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:
- 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
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
public function someAction(SeoPageInterface $_seo_page) { return ['page'=>$page]; }
This will throw an exception for you automatically.
Configuration
Routing
Configure route options like following
my_route: resources: routes.yml options: seo: true
To enable listeners for this route
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.
Doctrine ORM matching
You can implement the necessary interfaces ontop of your entity repositories. Make sure the entities implement required interfaces (target, condition, etc)
Link generation
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
Sluggable
s
As a part of Symfony integration where is the SymfonyRouterCompiler
which uses the UrlGenerator
to compile the link reference
Extensions
You can override, decorate and replace the following extension points to tune your SEO processing experience
Matching
TargetRepositoryInterface
- finds the all matching targets for given routeTargetSorter
- chooses single target from all fetched above by matching with destinationPageRepositoryInterface
- 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 scalarsDestinationCompiler
- forges your destination into the link (href, title and attributes).SymfonyRouterCompiler
is the primary default option if symfony availableSourceInterface
- source of the data to create destinations. No default option,CollectionSource
is the built-in oneSourceFiller
- extend missing entries in destination from source-generated values. Not required, thus no defaults