symfony/emoji
Symfony Emoji component gives PHP access to Unicode CLDR emoji characters and sequences, with helpers to work with modern emoji data. Includes an optional script to compress bundled data when zlib is enabled.
Installation:
composer require symfony/emoji
For PHP 8.4+ (Symfony 8.0+), use ^8.0. For Laravel 10.x, ^7.4 is recommended.
First Use Case: Validate if a string contains only emoji:
use Symfony\Component\Emoji\EmojiData;
$input = "πβ€οΈ";
if (EmojiData::isEmoji($input)) {
// Process emoji-only input
}
Where to Look First:
EmojiData class for core functionality (validation, normalization, lookup).EmojiRegistry for accessing emoji metadata (names, groups, skin tones).use Symfony\Component\Emoji\EmojiData;
$reaction = "π";
if (EmojiData::isEmoji($reaction)) {
// Valid emoji
}
use Illuminate\Support\Facades\Validator;
$validator = Validator::make(['reaction' => $request->reaction], [
'reaction' => 'required|string|emoji', // Custom rule
]);
Create a custom validation rule:
namespace App\Rules;
use Symfony\Component\Emoji\EmojiData;
class Emoji implements Rule {
public function passes($attribute, $value) {
return EmojiData::isEmoji($value);
}
}
use Symfony\Component\Emoji\EmojiData;
$emoji = "π¨βπ©βπ§βπ¦";
$normalized = EmojiData::normalize($emoji); // Standardized sequence
use Illuminate\Database\Eloquent\Model;
class Reaction extends Model {
protected $casts = [
'emoji' => 'string', // Store normalized emoji
];
public function setEmojiAttribute($value) {
$this->attributes['emoji'] = EmojiData::normalize($value);
}
}
use Symfony\Component\Emoji\EmojiRegistry;
$registry = new EmojiRegistry();
$emoji = $registry->getEmoji('heart'); // Returns "β€οΈ"
$group = $registry->getGroup('Smileys & Emotion'); // List of emoji in group
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Symfony\Component\Emoji\EmojiRegistry;
class EmojiServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton(EmojiRegistry::class, function () {
return new EmojiRegistry();
});
}
}
Bind in config/app.php:
'aliases' => [
'Emoji' => App\Providers\EmojiServiceProvider::class,
],
:heart: syntax for non-technical users.use Symfony\Component\Emoji\EmojiData;
$alias = ":heart:";
$emoji = EmojiData::getEmojiForTextAlias($alias, 'text'); // "β€οΈ"
// app/Providers/BladeServiceProvider.php
Blade::directive('emoji', function ($alias) {
return "<?php echo Symfony\Component\Emoji\EmojiData::getEmojiForTextAlias({$alias}, 'text'); ?>";
});
Usage:
@emoji(':heart:') <!-- Renders β€οΈ -->
use Symfony\Component\Emoji\EmojiRegistry;
use Illuminate\Support\Facades\Cache;
$registry = Cache::remember('emoji.registry', 3600, function () {
return new EmojiRegistry();
});
Compress Emoji Data (Optional):
If zlib is enabled, run:
php vendor/symfony/emoji/Resources/bin/compress
This reduces memory usage by ~50%.
Laravel Cache Integration: Cache emoji metadata for performance:
Cache::forever('emoji.groups', $registry->getGroups());
Frontend Integration:
emoji-mart or Laravelβs native support:
// Example with emoji-mart (Vue/React)
import Picker from '@emoji-mart/vue';
<Picker @emoji-select={handleEmojiSelect} />
{!! $emoji !!} <!-- Escaped via Blade's auto-escaping -->
Testing: Use Laravelβs testing helpers to assert emoji validation:
use Symfony\Component\Emoji\EmojiData;
$this->assertTrue(EmojiData::isEmoji("π"));
$this->assertFalse(EmojiData::isEmoji("hello"));
Emoji Sequences vs. Characters:
π¨βπ©βπ§βπ¦). Use EmojiData::isEmoji() for validation, not ctype_alnum().EmojiData::isEmoji(EmojiData::normalize($input));
Skin Tones and ZWJ:
π¨π½βπ©π½βπ§π½βπ¦) or Zero-Width Joiners (ZWJ) may render inconsistently across platforms.$normalized = EmojiData::normalize("π¨π½βπ©π½βπ§π½βπ¦");
Locale-Specific Aliases:
text locale supports aliases like :heart:, but not all emoji have aliases.$emoji = EmojiData::getEmojiForTextAlias($alias, 'text') ?: EmojiData::getEmoji($alias);
Memory Usage:
EmojiRegistry instance.$registry = app()->singleton(EmojiRegistry::class, fn() => new EmojiRegistry());
PHP Version Requirements:
^7.4 for Laravel 9.x (PHP 8.1) or ^8.0 for PHP 8.4+.Emoji Groups and Categories:
$groupMap = [
'Smileys & Emotion' => 'Positive',
'Flags' => 'Regional',
];
Validate Emoji Data: Dump emoji metadata for debugging:
$registry = new EmojiRegistry();
dd($registry->getEmoji('heart')); // Returns array with name, group, etc.
Check for Invalid Sequences:
Use EmojiData::isEmoji() to debug malformed input:
if
How can I help you explore Laravel packages today?