ProviderRegistry
in package
埋め込みを解決するプロバイダーを優先度つきで保持する。
コアは埋め込みライブラリを包んだ LibraryProvider を最後尾の優先度で登録する。
拡張アプリは ServiceProvider::init() などで Application::make('embed.providers') を取得し、
独自のプロバイダーを追加できる(ライブラリより前にも後にも割り込める)。
$registry = Application::make('embed.providers');
$registry->registerUrlPattern(
'#^https://video\.example\.com/watch/(\d+)#i',
static fn (array $matches, string $url): string =>
'<iframe src="https://video.example.com/embed/' . $matches[1] . '"></iframe>'
);
解決結果の HTML は Helper が必ずサニタイズする。プロバイダーを登録しただけでは
出力は許可されないため、埋め込み先ホストを extends_html_purifier_iframe_allowed_hosts
(script 形式なら extends_html_purifier_script_allowed_hosts)へ追加すること。
Table of Contents
Constants
- DEFAULT_PRIORITY = 10
- 既定の優先度。小さいほど先に評価する(WordPress の wp_embed_register_handler と同じ向き)。
- LIBRARY_PRIORITY = 100
- コア既定のプロバイダー(埋め込みライブラリ)の優先度。
Properties
- $entries : array<int, Provider, priority: int, order: int}>
- 登録済みプロバイダー。
- $order : int
- 登録順の連番。同じ優先度での評価順を安定させるために使う。
Methods
- providers() : array<int, Provider>
- 評価順に並べたプロバイダーの一覧
- register() : void
- プロバイダーを登録する
- registerOEmbedEndpoint() : void
- oEmbed エンドポイントを登録する(oEmbed 対応サービス向け)
- registerUrlPattern() : void
- URL の正規表現とコールバックでプロバイダーを登録する(oEmbed 非対応サービス向け)
- resolve() : EmbedData|null
- 最初に解決できたプロバイダーの結果を返す
Constants
DEFAULT_PRIORITY
既定の優先度。小さいほど先に評価する(WordPress の wp_embed_register_handler と同じ向き)。
public
mixed
DEFAULT_PRIORITY
= 10
LIBRARY_PRIORITY
コア既定のプロバイダー(埋め込みライブラリ)の優先度。
public
mixed
LIBRARY_PRIORITY
= 100
拡張が既定値のまま登録すれば必ずライブラリより先に評価され、ライブラリでも拾えなかった ときだけ効かせたい拡張はこれより大きい値を指定する、という余地を残すために離してある。
Properties
$entries
登録済みプロバイダー。
private
array<int, Provider, priority: int, order: int}>
$entries
= []
$order
登録順の連番。同じ優先度での評価順を安定させるために使う。
private
int
$order
= 0
Methods
providers()
評価順に並べたプロバイダーの一覧
public
providers() : array<int, Provider>
Return values
array<int, Provider>register()
プロバイダーを登録する
public
register(Provider $provider[, int $priority = self::DEFAULT_PRIORITY ]) : void
Parameters
- $provider : Provider
- $priority : int = self::DEFAULT_PRIORITY
-
小さいほど先に評価する
registerOEmbedEndpoint()
oEmbed エンドポイントを登録する(oEmbed 対応サービス向け)
public
registerOEmbedEndpoint(string $pattern, string $endpoint[, array<string, scalar> $params = [] ][, int $priority = self::DEFAULT_PRIORITY ]) : void
通信はコア側の SSRF ガード付きクライアントで行うため、拡張側が HTTP クライアントを 用意する必要はない。
Parameters
- $pattern : string
-
URL にマッチさせる PCRE
- $endpoint : string
-
oEmbed エンドポイントの URL
- $params : array<string, scalar> = []
-
エンドポイントへ追加で渡すクエリ
- $priority : int = self::DEFAULT_PRIORITY
registerUrlPattern()
URL の正規表現とコールバックでプロバイダーを登録する(oEmbed 非対応サービス向け)
public
registerUrlPattern(string $pattern, callable(array<int|string, string>, string): Array $handler[, int $priority = self::DEFAULT_PRIORITY ]) : void
コールバックは EmbedData/HTML 文字列/null のいずれかを返す。URL だけで埋め込み HTML を
組み立てられるサービス(地図・自社の動画配信など)は、これで外部通信なしに対応できる。
Parameters
- $pattern : string
-
URL にマッチさせる PCRE
- $handler : callable(array<int|string, string>, string): Array
- $priority : int = self::DEFAULT_PRIORITY
resolve()
最初に解決できたプロバイダーの結果を返す
public
resolve(string $url) : EmbedData|null
優先度の昇順(同値は登録順)に評価し、supports() が true でも結果が空(または null)なら
次のプロバイダーへフォールバックする。プロバイダーが例外を投げた場合も、そのプロバイダーを
飛ばして続行する(埋め込みの失敗で保存自体を止めないため)。
Parameters
- $url : string
Return values
EmbedData|null —どのプロバイダーも解決できなければ null