The jenssegers-agent package is a desktop/mobile user agent parser with support for Laravel, based on MobileDetect. You can use this package in any PHP application, and it also provides a Laravel service provider, giving you a service Facade:
use Jenssegers\Agent\Facades\Agent;
Agent::is('Firefox');
Agent::is('iPhone');
// Magic methods
Agent::isFirefox();
Agent::isIPhone();
// Device type
Agent::isDesktop();
Agent::isMobile();
Agent::isTablet();
Agent::isPhone();
Besides user agent helpers, the Agent service provides a language helper, device name method, platform, and more. For example, you could get the accepted browser languages using the following method:
Agent::languages(); // ['en-us', 'en']
Using the languages method, you could set the locale during a request in a middleware. Here's a simple example just to illustrate just off the top of my head:
public function handle(Request $request, Closure $next): Response
{
$supported_locales = ['en', 'es'];
$user_locales = Agent::languages();
foreach ($user_locales as $locale) {
if (in_array($locale, $supported_locales)) {
app()->setLocale($locale);
}
}
return $next($request);
}
If you do not support the locale, the config('app.fallback_locale')
setting will define the locale. You might also use the languages()
method in middleware to redirect a locale-specific route prefix /{locale}/
based on the user agent's supported language.
Route::prefix('/{locale}')->group(function () {
// ...
})->whereIn('locale', ['en', 'es']);
The Agent
service can also determine if the current user agent is a bot and what type of bot:
// Is the user a bot?
Agent::isRobot(); // bool
// get the robot name
Agent::robot();
Lastly, to get the device name, platform, and browser, you can use the aptly named methods on the facade:
Agent::device(); // "Macintosh"
Agent::platform(); // "OS X"
Agent::browser(); // "Safari"