Mobile Detect 的正确 Composer 包名是 mobiledetect/mobiledetectlib,安装后通过 require __DIR__.'/vendor/autoload.php' 加载,主类为 \Mobile_Detect(带下划线),需显式传入 UA 字符串以支持 CLI 或模拟请求,检测手机和平板应联合使用 isMobile() 和 isTablet()。

直接用 Composer require 安装 Mobile Detect
Mobile Detect 是一个轻量级 PHP 类库,用于识别移动设备、平板、爬虫等。它不提供官方 Composer 包名 mobiledetect/mobiledetectlib —— 这是唯一正确的包名,别拼错或加空格。
在项目根目录执行:
composer require mobiledetect/mobiledetectlib
安装成功后,vendor/autoload.php 会自动加载该类,无需额外注册 PSR-4 映射。
- 如果你用的是 Laravel,
app/Providers/AppServiceProvider.php中无需手动require_once,Composer 自动处理 - 如果报错
Class 'Mobile_Detect' not found,大概率是没引入 autoload,确认你写了require __DIR__.'/vendor/autoload.php'; - 注意:该库主类名为
Mobile_Detect(带下划线),不是MobileDetect或MobileDetector
手动实例化 Mobile_Detect 并检测设备类型
初始化很简单,但容易忽略 UA 来源和缓存行为。默认构造函数会从 $_SERVER['HTTP_USER_AGENT'] 读取 UA 字符串,如果你在 CLI 环境或模拟请求中使用,必须显式传入 UA:
$detect = new Mobile_Detect();
或者指定 UA:
$detect = new Mobile_Detect('Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15...');
-
$detect->isMobile()返回布尔值,但对 iPad 默认返回false(它被归为tablet) - 要同时捕获手机和平板,用
$detect->isMobile() || $detect->isTablet() -
$detect->is('iOS')和$detect->is('Android')可细化系统,但注意大小写敏感,'ios'不行 - 不要在循环里反复 new
Mobile_Detect实例,它内部有静态缓存,单例复用更安全
常见 UA 检测失效原因和绕过技巧
Mobile Detect 基于正则匹配 UA 字符串,遇到现代浏览器(如 Chrome 110+)裁剪 UA、或微信/QQ 内置浏览器伪装成桌面端时,isMobile() 可能返回 false。
- 检查原始 UA:打印
$_SERVER['HTTP_USER_AGENT'],确认是否含Mobile、Android、iPad等关键词 - 微信内置浏览器 UA 示例:
Mozilla/5.0 (Linux; Android 12; ... AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile Safari/537.36 MMWEBID/...→ 含Mobile,可被识别 - 若 UA 被精简(如某些 PWA 或 WebView 场景),可结合 HTTP 头
Sec-CH-UA-Mobile判断:$_SERVER['HTTP_SEC_CH_UA_MOBILE'] === '?1' - 避免依赖单一检测手段,生产环境建议叠加屏幕宽度(
$_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest'不相关,别误用)或 JS 客户端探测做 fallback
Laravel 中封装为 Facade 或辅助函数更省事
虽然 Mobile Detect 本身无 Laravel 集成,但可以快速封装成服务容器绑定或全局函数,避免每次 new 实例。
例如在 app/Helpers.php 中添加:
if (!function_exists('is_mobile')) {
function is_mobile(): bool
{
static $detect = null;
if ($detect === null) {
$detect = new \Mobile_Detect();
}
return $detect->isMobile() || $detect->isTablet();
}
}
然后在 composer.json 的 autoload.files 中加入该文件路径,运行 composer dump-autoload 即可全局调用 is_mobile()。
- 别在
config/app.php的providers里注册它——它不是 Laravel Service Provider - 如果要用依赖注入,可在控制器构造函数中 type-hint
\Mobile_Detect,但需先绑定到容器:$this->app->singleton(\Mobile_Detect::class, function () { return new \Mobile_Detect(); }); - 注意命名空间:该类没有命名空间,
use Mobile_Detect会报错,必须用\Mobile_Detect或完整反斜杠前缀










