Integration patterns
Dynamic engine selection
Pick the engine at runtime and keep a local fallback:
use Renfordt\AvatarSmithy\Avatar;
function avatarFor(array|object $user, string $preferred = 'initials'): string
{
return Avatar::for($user)
->try($preferred)
->fallbackTo('gradient')
->size(200)
->generate()
->toHtml();
}
Batch generation
$avatars = [];
foreach ($users as $user) {
$avatars[$user->id] = Avatar::for($user)
->try('initials')
->fallbackTo('gradient')
->size(150)
->generate()
->toBase64();
}
Local engines make batch generation cheap because they involve no network requests. Avoid remote engines (Gravatar, DiceBear) in tight loops.
Caching
Generation is deterministic, so results can be cached by a key derived from the engine, seed, size, and options. For raster output, cache the converted bytes rather than re-running conversion per request:
$key = "avatar:{$engine}:{$size}:" . sha1($email);
$png = $cache->remember($key, 86400, function () use ($email, $size) {
return Avatar::engine('initials')
->seed($email)
->size($size)
->generate()
->toPng()
->getContent();
});
Serving from a route (Laravel)
use Renfordt\AvatarSmithy\Avatar;
use Renfordt\AvatarSmithy\Http\AvatarResponder;
Route::get('/avatar/{user}', function (User $user) {
$avatar = Avatar::for($user)
->try('gravatar')
->fallbackTo('initials')
->fallbackTo('gradient')
->size(400)
->generate();
return (new AvatarResponder($avatar))->toResponse();
});
See HTTP responses for download and PSR-7 variants.
Logging declined engines
Attach a PSR-3 logger to see which engines decline or fail within a chain that still succeeds:
$builder = (new \Renfordt\AvatarSmithy\AvatarBuilder('gravatar'))
->setLogger($logger)
->fallbackTo('initials');
$avatar = $builder->seed($email)->name($name)->generate();