Identifiants
phil/instant-messengerHandle::of($service, $input) lit un identifiant et le garde sous forme canonique ; il lance InvalidHandle pour une
entrée que le service ne lit pas.
$handle = Handle::of(KnownMessenger::WhatsApp, '+1 (514) 555-0123');
$handle->value; // "+15145550123"
$handle->link(); // "https://wa.me/15145550123"
$handle->equals(Handle::of(KnownMessenger::WhatsApp, 'wa.me/15145550123')); // true
Un identifiant conservé
Un identifiant est conservé sous forme de son service et de sa valeur canonique, $handle->value.
Handle::fromCanonical($service, $value) le reprend tel quel, sans le relire : il a été lu au moment où il a été
conservé. Le relire avec of() refuserait un numéro de téléphone qu'une importation ultérieure des plans de
numérotation de phil/phone ne connaît plus, et l'entité qui le contient ne pourrait pas être chargée. Un texte tapé
par une personne passe par of().
Handle::fromCanonical(KnownMessenger::WhatsApp, $row['handle']);
Détecter le service
Messengers::detect('https://t.me/adalove', EnumSet::all(KnownMessenger::class)); // the Telegram handle, or null
Messengers::handle('@ada:matrix.org', $accepted); // or InvalidHandle
Le premier service qui lit l'entrée l'emporte, ensemble par ensemble et dans l'ordre de déclaration de chaque enum ;
l'entrée est lue une seule fois, et l'identifiant est la forme canonique que ce service a donnée. Les identifiants se
chevauchent : un nom d'utilisateur peut être lu aussi bien par Telegram que par Line et Discord, et un numéro de
téléphone par WhatsApp, Signal, Viber et iMessage. La détection est juste pour les liens, qui nomment leur service, et
pour les formes distinctives (un identifiant Matrix, une adresse XMPP) ; ailleurs, demandez le service à la personne,
comme le fait le champ de phil/instant-messenger-bundle.