Custom linktypes
The LinkValidator uses so called "linktypes" to check for different types of links, for example internal or external links.
All "linktypes" have to implement the TYPO3CMSLinkvalidatorLinktypeLinktypeInterface.
Classes implementing the Linktype
are automatically
registered, if autoconfigure
is enabled in Services.
.
Alternatively, one can manually tag a custom link type with the
linkvalidator.
tag:
Vendor\Extension\Linktype\MyCustomLinktype:
tags:
- name: linkvalidator.linktype
Due to the autoconfiguration, the identifier has to be provided by the
class directly, using the method get
.
When extending TYPO3CMSLinkvalidatorLinktypeAbstractLinktype
it is sufficient to set the $identifier
class property.
For custom naming of a linktype, the additional interface
TYPO3CMSLinkvalidatorLinktypeLabelledLinktypeInterface.
can be implemented, which is also part of the default Abstract
implementation.
The method get
is used to return the custom localized name of
a linktype.
Example
Add new linktype
You can find the following example in the extension t3docs/examples.
Extend TYPO3CMSLinkvalidatorLinktypeAbstractLinktype to create a custom linktype:
<?php
/*
* This file is part of the TYPO3 CMS project. [...]
*/
namespace T3docs\Examples\LinkValidator\LinkType;
use TYPO3\CMS\Linkvalidator\Linktype\AbstractLinktype;
/**
* This class provides Check Example Links plugin implementation
*/
class ExampleLinkType extends AbstractLinktype
{
protected string $identifier = 'example';
public function checkLink($url, $softRefEntry, $reference): bool
{
$isValidUrl = false;
// TODO: Implement checkLink() method.
return $isValidUrl;
}
public function getErrorMessage($errorParams): string
{
$lang = $this->getLanguageService();
return match ($errorParams['errno'] ?? 0) {
404 => $lang->sL('LLL:EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf:list.report.pagenotfound404'),
// fall back to generic error message
default => sprintf(
$lang->sL('LLL:EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf:list.report.externalerror'),
$errorParams['errno'],
),
};
}
}
Activate the new linktype in the page tsconfig:
mod.linkvalidator {
# specify link types to be crawled
linktypes = db,file,external,example
}
The extension that provides the linktype must have a
Configuration/
file that contains either:
services:
_defaults:
autoconfigure: true
Or if autoconfiguration is not desired for some reason:
services:
T3docs\Examples\LinkValidator\LinkType\ExampleLinkType:
tags:
- name: linkvalidator.linktype
Override the ExternalLinktype class
A new custom class should replace
\TYPO3\
. The class inherits
existing functionality from External
, but will be registered with
the identifier "custom_external":
namespace MyVendor\NyExtension\Linktype\ExternalLinktype;
use TYPO3\CMS\Linkvalidator\Linktype\ExternalLinktype as LinkvalidatorExternalLinkType;
// This class inherits from ExternalLinktype,
// so it is only necessary to override some methods.
class ExternalLinktype extends LinkvalidatorExternalLinkType
{
// This class must use a different identifier because "external" is already used.
protected string $identifier = 'custom_external';
public function checkLink(
string $origUrl,
array $softRefEntry,
LinkAnalyzer $reference
): bool {
// do additional stuff here or after parent::checkLink
// ...
return parent::checkLink($origUrl, $softRefEntry, $reference);
}
public function fetchType(array $value, string $type, string $key): string
{
preg_match_all(
'/((?:http|https))(?::\\/\\/)(?:[^\\s<>]+)/i',
(string)$value['tokenValue'],
$urls,
PREG_PATTERN_ORDER
);
if (!empty($urls[0][0])) {
$type = $this->getIdentifier();
}
return $type;
}
}
Use the new linktype:
mod.linkvalidator.linktypes = db,file,custom_external
Since the identifier changes, the configuration should be copied to
mod.
, so that it will be
passed to the linktype, for example:
mod.linkvalidator.linktypesConfig.custom_external < mod.linkvalidator.linktypesConfig.external
Migration from TYPO3 11 LTS and below
Remove $GLOBALS
from your ext_
file.
If autoconfigure
is not enabled in your Configuration/
,
add the tag linkvalidator.
manually to your linktype
service.
Additionally, make sure to either implement
public function get
or, in case your linktype
extends
Abstract
, to set the $identifier
class property.