Laravel 13 不主动报废弃警告,而是因底层变更导致运行时异常或逻辑失效;需按演进方向提前替换:路由改用数组语法、模型弃用手动toArray()改用$casts/访问器/$appends、异常判断改用$e->expectsJson()、服务改用构造函数注入。

Laravel 13 本身不主动“报错”废弃方法调用,它不会像 PHP 那样触发 Deprecated 警告或 Error。真正的问题是:你写的代码用了已被移除、重命名或行为变更的旧写法,运行时直接抛异常或逻辑失效——这不是 Laravel 主动报错,而是底层变化导致的兼容性断裂。
要安全替换,核心不是“等报错再改”,而是按 Laravel 13 的演进方向提前对齐。以下是高频场景的替换方案:
✅ 路由定义中废弃的字符串回调写法
旧写法(Laravel ≤ 8):
Route::get('/users', 'UserController@index');问题:控制器字符串语法在 Laravel 13 中仍能运行,但已彻底弃用,IDE 无提示、无法静态分析、不支持属性(如 #[RateLimited])。
替换为:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
// 或更现代的写法(配合 PHP 8.3 属性)
#[RateLimited(maxAttempts: 5)]
public function index() { /* ... */ }✅ 模型中手动重写 toArray() 方法
旧写法:
public function toArray()
{
return ['id' => $this->id, 'name' => strtoupper($this->name)];
}问题:覆盖 toArray() 会跳过 $casts、访问器、$appends,且 Laravel 13 明确不推荐;报错虽不立即出现,但数据一致性丢失。
替换为:
- 用
$casts处理类型转换(如'active' => 'boolean') - 用访问器处理衍生字段(如
getFullNameAttribute()) - 用
$appends = ['full_name']挂载访问器 - 直接调用
$model->toArray()即可获得完整转换结果
✅ 异常处理中依赖 $request->isJson() 判断 API 请求
旧写法(在 Handler.php 的 render() 中):
if ($request->isJson()) { ... }问题:不可靠,很多前端发 JSON 但没设 Content-Type,导致返回 HTML 错误页而非 JSON,前端解析失败。
替换为:
if ($request->expectsJson()) {
return response()->json(['message' => $e->getMessage()], 500);
}expectsJson() 同时检查 Accept: application/json、X-Requested-With: XMLHttpRequest 和路由前缀,才是 Laravel 官方认可的判断方式。
✅ 手动实例化服务类(影响 Mock 和依赖注入)
旧写法(控制器中):
public function store(Request $request)
{
$service = new PaymentService(); // ❌ 绕过容器
$service->process($request->all());
}问题:测试时无法 Mock,线上无法统一管理生命周期,Laravel 13 的属性驱动特性(如 #[Cacheable])也无法生效。
替换为:
public function __construct(private PaymentService $service) {}
public function store(Request $request)
{
$this->service->process($request->all());
}Laravel 13 默认启用构造函数自动注入,无需额外绑定;后续还可直接加 #[Cacheable] 等属性。
不复杂但容易忽略


















