编程

桌面和移动端 User Agent 解析器

72 2023-10-17 23:23:00

Jenssegers-agent 包是一个支持 Laravel 的桌面端/移动端 User Agent 解析器,基于 MobileDetect。你可以在任何 PHP 应用中使用这些包,并且它也提供了 Laravel 服务提供者,提供了服务 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();

除了 user agent 辅助函数,Agent 服务也提供了语言辅助函数,设备名方法,平台等等。比如,你可以使用如下方法获取浏览器语言:

Agent::languages(); // ['en-us', 'en']

使用这个语言方法,你可以在中间件的请求期间设置本地语言 locale。示例如下:

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);
}

如果不支持该语言,将使用 config('app.fallback_locale') 设置的语言。你也可以在中间件中使用 languages() 方法,根据 user agent 来重定向语言指定的路由 /{locale}/。 

Route::prefix('/{locale}')->group(function () {
    // ...
})->whereIn('locale', ['en', 'es']);

Agent 服务也可以判断当前 user agent 是否为机器人(bot)以及是那种机器人:

// Is the user a bot?
Agent::isRobot(); // bool
 
// get the robot name
Agent::robot();

最后,要获取设备名、平台及浏览器,你可以在 Facades 上使用适当的命名方法:

Agent::device(); // "Macintosh"
Agent::platform(); // "OS X"
Agent::browser(); // "Safari"