laravel 6 路由闭包支持自动依赖注入,只需类型提示即可由服务容器递归解析实例(如 paymentservice、request);需手动绑定接口或带参数类,仅支持参数注入,不支持属性或方法注入。

在 Laravel 6 中,服务容器支持在路由闭包中直接使用依赖注入,无需手动 new 实例或调用 $app->make()。只要类已注册(或可自动解析),Laravel 会通过反射机制自动从服务容器中解析并注入依赖。
路由闭包中直接类型提示注入
这是最简洁的方式,适用于自定义服务类、内置类(如 Request)等可被容器自动解析的类型:
- 确保类有默认构造函数(或其所有依赖也可被容器解析)
- 在路由闭包参数中写明类名或接口类型提示
- Laravel 6 的服务容器会自动完成实例化和依赖递归解析
示例(routes/web.php):
use App\Services\PaymentService;
use Illuminate\Http\Request;
Route::get('/pay', function (PaymentService $payment, Request $request) {
return $payment->process($request->input('amount'));
});
访问 /pay?amount=100 即可触发,PaymentService 和 Request 均由容器自动提供。
需要手动绑定的场景(如带构造参数或接口实现)
若你的类构造函数需要原始值(如字符串、数字)或依赖接口未默认绑定,需先在 AppServiceProvider@register() 中绑定:
- 简单绑定(每次解析都新建实例):
$this->app->bind(EmailService::class, SendGridEmail::class); - 单例绑定(整个请求周期共用一个实例):
$this->app->singleton(CacheManager::class, RedisCache::class); - 闭包绑定(可传参、读取 config 等):
$this->app->bind(Logger::class, function ($app) { return new FileLogger($app['config']->get('logging.path')); });
绑定后,同样可在路由闭包中直接类型提示使用。
注意:不支持属性注入和方法注入在路由闭包中
路由闭包只支持「参数注入」(即函数参数中的类型提示)。以下方式在路由闭包中无效:
- 不能在闭包内写
public function handle(SomeService $service)—— 这是中间件写法 - 不能用
app(SomeService::class)手动解析(虽能运行,但违背依赖注入本意,且失去自动解析依赖链的能力) - 不支持 PHP 8+ 属性注入(如
#[Inject] public SomeService $service;)
保持参数列表清晰、类型明确,是 Laravel 6 路由依赖注入的最佳实践。











