symfony/emoji
Symfony Emoji component: access Unicode CLDR emoji characters and sequences in PHP. Includes a helper to compress bundled emoji data when zlib is enabled. Documentation and contributions are managed through the main Symfony repository.
Installation:
composer require symfony/emoji
For PHP 8.4+ (Symfony 8.0+) or PHP 8.1+ (Symfony 7.4+).
Compress Data (Optional):
If zlib is enabled, run:
php vendor/symfony/emoji/Resources/bin/compress
Reduces memory usage by ~50%.
First Use Case: Validate Emoji Input
use Symfony\Component\Emoji\EmojiData;
$input = "Hello π!";
if (EmojiData::isEmoji($input)) {
// Handle emoji-only input
}
First Use Case: Convert Text to Emoji
$emoji = EmojiData::getEmoji('heart');
// Returns "β€οΈ"
First Use Case: Get Emoji Metadata
$metadata = EmojiData::getMetadata('π¨βπ©βπ§βπ¦');
// Returns array with categories, keywords, etc.
EmojiData class in vendor/symfony/emoji/EmojiData.php for core methods.Resources/data/ directory for raw emoji datasets (uncompressed).use Symfony\Component\Emoji\EmojiData;
$reaction = request('reaction');
if (EmojiData::isEmoji($reaction)) {
// Valid emoji
} else {
return back()->withErrors(['reaction' => 'Invalid emoji']);
}
$normalized = EmojiData::normalize('π¨π©π§π¦'); // Returns "π¨βπ©βπ§βπ¦"
:heart:) with Unicode emoji.$emoji = EmojiData::getEmoji('heart', 'text'); // Returns "β€οΈ"
$smileyEmojis = EmojiData::getEmojisByCategory('Smileys & Emotion');
// Returns array of emoji characters in the category
$emoji = EmojiData::getEmoji('thumbs_up', 'text'); // Returns "π"
Register EmojiData as a singleton in AppServiceProvider:
public function register()
{
$this->app->singleton(EmojiData::class, function () {
return new EmojiData();
});
}
Now inject EmojiData into controllers/services:
public function __construct(private EmojiData $emojiData) {}
Create a Blade directive for quick emoji resolution:
Blade::directive('emoji', function ($expression) {
return "<?php echo Symfony\Component\Emoji\EmojiData::getEmoji({$expression}, 'text'); ?>";
});
Usage:
@emoji('heart') <!-- Renders β€οΈ -->
Cache metadata to reduce lookup overhead:
$metadata = Cache::remember("emoji_{$emoji}", now()->addHour(), function () use ($emoji) {
return EmojiData::getMetadata($emoji);
});
Extend FormRequest to validate emoji fields:
public function rules()
{
return [
'reaction' => ['required', function ($attribute, $value, $fail) {
if (!EmojiData::isEmoji($value)) {
$fail('The :attribute must be a valid emoji.');
}
}],
];
}
Store normalized emoji to avoid inconsistencies:
$normalizedEmoji = EmojiData::normalize($userInput);
$user->reaction()->create(['content' => $normalizedEmoji]);
emoji-mart or use native HTML entities.// Fetch emoji metadata via API
axios.get('/api/emojis/smileys').then(response => {
this.emojiList = response.data;
});
Create a controller to expose emoji data:
public function getEmojisByCategory(string $category)
{
return EmojiData::getEmojisByCategory($category);
}
Route:
Route::get('/api/emojis/{category}', [EmojiController::class, 'getEmojisByCategory']);
Mock EmojiData in tests:
$this->app->instance(EmojiData::class, Mockery::mock(EmojiData::class));
π¨βπ©βπ§βπ¦ (family) may not normalize as expected if the input is split (e.g., π¨π©π§π¦).EmojiData::normalize() before storage or validation.$normalized = EmojiData::normalize('π¨π©π§π¦'); // Returns "π¨βπ©βπ§βπ¦"
text locale may not cover all edge cases (e.g., rare emoji or custom aliases).zlib compression via compress script (see "Getting Started").emoji-mart) or CSS customization for consistent rendering.Dump raw emoji data to debug:
dd(EmojiData::getEmojiData());
Compare input vs. normalized output:
$input = 'π¨π©π§π¦';
$normalized = EmojiData::normalize($input);
dd(bin2hex($input), bin2hex($normalized)); // Compare hex representations
How can I help you explore Laravel packages today?