spatie/emoji
Work with emoji in PHP without relying on your IDE/font. Use the Spatie\Emoji\Emoji class to access emoji as constants or friendly camelCase methods like Emoji::grinningFace(), or fetch all emojis via Emoji::all().
Installation:
composer require spatie/emoji
Add the service provider to config/app.php (Laravel auto-discovers it in Laravel 5.5+):
Spatie\Emoji\EmojiServiceProvider::class,
First Use Case: Display an emoji in a Blade template:
{{ \Spatie\Emoji\Emoji::grinningFace() }}
Or use the Blade directive:
@emoji('grinningFace')
Quick Validation: Check if a string contains valid emojis:
use Spatie\Emoji\EmojiValidator;
$validator = new EmojiValidator();
$isValid = $validator->validate('Hello ๐'); // true
src/Emoji.php for all available methods (e.g., grinningFace(), countryFlag('us')).@emoji and @emojiList.@emoji('thumbsUp') <!-- Outputs: ๐ -->
@emojiList(['grinningFace', 'heartEyes']) <!-- Outputs: ๐๐ -->
$emoji = \Spatie\Emoji\Emoji::thumbsUp();
return response()->json(['emoji' => $emoji]);
:smile: โ ๐):
function convertShortcodesToEmojis(string $text): string {
$shortcodes = [
':smile:' => 'grinningFace',
':heart:' => 'heart',
];
foreach ($shortcodes as $shortcode => $method) {
$text = str_replace($shortcode, \Spatie\Emoji\Emoji::$method, $text);
}
return $text;
}
$flag = \Spatie\Emoji\Emoji::countryFlag('jp'); // ๐ฏ๐ต
use Spatie\Emoji\EmojiValidator;
public function rules() {
return [
'comment' => ['required', new EmojiValidator],
];
}
$validator = Validator::make($request->all(), [
'message' => ['required', new EmojiValidator],
]);
use Spatie\Emoji\Emoji;
class Comment extends Model {
protected $casts = [
'emoji_reaction' => 'string', // Stores ":thumbsUp"
];
public function getEmojiReactionAttribute($value) {
return Emoji::{$value}(); // Renders ๐
}
}
Creating/Updating model events:
public function creating(Model $model) {
$model->content = convertShortcodesToEmojis($model->content);
}
return response()->json([
'message' => 'Hello!',
'emoji' => Emoji::wave(), // ๐
]);
Emoji::all() if used frequently in loops (e.g., emoji picker UI):
$emojis = Cache::remember('all-emojis', now()->addHours(1), function() {
return Emoji::all();
});
Method Naming Quirks:
100Points()) may cause IDE autocompletion issues. Use the CHARACTER_* constants instead:
Emoji::CHARACTER_100_POINTS; // ๐
Emoji::all() for dynamic access or IDE-friendly constants.Unicode Normalization:
mb_convert_encoding() for consistent output:
$normalized = mb_convert_encoding(Emoji::grinningFace(), 'UTF-8', 'UTF-8');
Flag Emoji Edge Cases:
bl for Saint Barthรฉlemy) may not render correctly. Verify with Emoji::countryFlag('bl').Performance in Loops:
Emoji::all() in tight loops. Cache the result or use specific methods:
// Bad: Emoji::all() in a 1000-item loop
// Good: Pre-fetch needed emojis
$emojis = [Emoji::grinningFace(), Emoji::heart()];
Blade Directive Scope:
@emoji directives only work in Blade templates. For non-Blade contexts (e.g., API responses), use PHP methods directly.Invalid Emoji Methods:
Emoji::unknownMethod() fails, check the full list or use Emoji::all() to inspect available methods.debugbar to inspect the Emoji class constants.Font Rendering Issues:
echo Emoji::grinningFace(); in artisan tinker to verify local rendering.Custom Emoji Sets:
Emoji class to add project-specific emojis:
class CustomEmoji extends \Spatie\Emoji\Emoji {
public static function customEmoji() {
return '๐'; // Your custom emoji
}
}
all() method to merge custom emojis:
public static function all() {
return array_merge(parent::all(), [
'customEmoji' => '๐',
]);
}
Dynamic Shortcode Parsing:
{{emoji}}):
preg_replace_callback('/\{\{emoji:(\w+)\}\}/', function ($matches) {
return Emoji::{$matches[1]}();
}, $text);
Emoji Skin Tones:
grinningFaceLightSkinTone()). Document these in your appโs UI for consistency.Localization:
๐ = "good" in English, "okay" in Japanese).$translation = __("emoji.thumbs_up.{$locale}");
php -v before integration.composer dump-autoload is run after adding custom emoji classes.Emoji::all() to populate a dropdown or grid:
How can I help you explore Laravel packages today?