laravel-admin安装必须严格按依赖引入、资源发布、数据库初始化三步执行:先composer require指定1.9.*版本,再vendor:publish注册服务,最后admin:install建表;漏任一环将导致404/500且提示不明确。

laravel-admin 安装不是“配环境→敲命令→完事”,而是三步必须严丝合缝:依赖引入、资源发布、数据库初始化。漏掉任一环,访问 /admin 会直接报 404 或 500,且错误提示不指向真实原因。
确认 Laravel 版本和扩展是否就绪
不是所有 Laravel 版本都兼容最新 laravel-admin。当前(2026 年)稳定搭配是:
- Laravel 10.x 或 11.x(
laravel-admin2.x 已停止维护,主推 1.x 分支) - PHP ≥ 8.0(
laravel-admin1.9+ 不再支持 PHP 7.x) -
fileinfo扩展必须启用(否则admin:install会卡在迁移前校验) - MySQL 表引擎推荐 InnoDB,字符集设为
utf8mb4_unicode_ci
检查方式:php -m | grep fileinfo;查 Laravel 版本:php artisan --version。如果 .env 数据库配置未生效,admin:install 会静默失败——务必先运行 php artisan tinker 执行 DB::connection()->getPdo() 确认连得上。
执行 install 命令前必须 publish
php artisan admin:install 不会自动发布配置和静态资源。它只做两件事:建表 + 插入默认账号。如果跳过 vendor:publish,config/admin.php 不存在,后续所有路由、菜单、权限逻辑都会崩。
正确顺序:
-
composer require encore/laravel-admin "1.9.*"(显式指定版本,避免拉到不稳定快照) php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"php artisan admin:install
常见坑:vendor:publish 运行后若提示 “no assets to publish”,说明 ServiceProvider 没注册——检查 config/app.php 的 providers 数组是否手动加了 Encore\Admin\AdminServiceProvider::class(Laravel 5.5+ 可自动发现,但 Laravel 10/11 某些安装方式会关闭此功能)。
安装失败后不要反复重试
admin:install 是幂等操作,但只对「首次安装」安全。一旦中途失败(比如迁移卡住、密码哈希出错),再次运行会报 Table 'admin_users' already exists 或 Integrity constraint violation。
安全清理方式:
- 删掉数据库里所有
admin_*表(admin_users、admin_roles、admin_permissions、admin_menu、admin_operation_log) - 清空
config:cache和view:cache:php artisan config:clear && php artisan view:clear - 确认
database/migrations下没有残留的create_admin_tables.php迁移文件(admin:install自带迁移,不需要手动跑migrate)
如果仍报错,打开 storage/logs/laravel.log,搜索 admin:install,看具体卡在哪一行——大概率是 bcrypt() 调用失败(PHP 版本太低)或数据库字段长度不足(需在 AppServiceProvider 的 boot() 里加 Schema::defaultStringLength(191))。
登录后中文和菜单显示异常
装完能进后台,但左侧菜单是英文、按钮文字乱码?这不是语言包问题,是数据写死在数据库里了。
admin_menu 表的 title 字段存的是原始字符串(如 Dashboard、Users),laravel-admin 不自动翻译。改法只有两种:
- 手动进数据库把
admin_menu.title改成中文(比如'Dashboard'→'仪表盘') - 在
config/app.php设'locale' => 'zh-CN',然后用Admin::menu()在服务提供者里动态注册菜单(适合后期维护)
注意:config/admin.php 里的 'name' 和 'logo' 是页面标题和 Logo 文字,改这里不影响菜单项——菜单项只读 admin_menu 表。
phpinfo() ——别猜。











