General purpose SEO library for standalone usage (Symfony DI included)
- Processing general SEO data
- SEO links generation
- Sitemap generation
composer require bankiru/seo-engine:~1.0
- 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
- 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
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
// 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.
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.
Configure route options like following
my_route:
resources: routes.yml
options:
seo: true
To enable listeners for this route
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.
You can implement the necessary interfaces ontop of your entity repositories. Make sure the entities implement required interfaces (target, condition, etc)
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
You can override, decorate and replace the following extension points to tune your SEO processing experience
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
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