Laravel 6 中资源控制器完全支持服务容器依赖注入,只需通过路由访问即可自动解析构造函数类型提示;可同时注册中间件,接口需在 AppServiceProvider 中显式绑定,避免手动 new 破坏注入机制。

在 Laravel 6 中,资源控制器(Resource Controller)和普通控制器一样,完全支持服务容器的依赖注入,无需额外配置——只要控制器是通过路由机制访问的,Laravel 就会自动使用服务容器解析构造函数中的类型提示依赖。
资源控制器中使用构造函数注入
资源控制器本质仍是普通控制器类,继承 Controller,因此可直接在 __construct() 中类型提示所需服务,服务容器会自动注入:
- 创建服务类,如
app/Services/PostService.php - 在资源控制器构造函数中声明依赖:
<?php
namespace App\Http\Controllers;
use App\Services\PostService;
use Illuminate\Http\Request;
class PostController extends Controller
{
protected $postService;
public function __construct(PostService $postService)
{
$this->postService = $postService;
}
public function index()
{
return response()->json($this->postService->all());
}
} - 注册资源路由:
Route::resource('posts', 'PostController');
此时所有请求(如GET /posts)都会触发容器自动实例化PostController并注入PostService
结合中间件与依赖注入
资源控制器常需权限控制或日志等中间件,可在构造函数中同时注入服务并注册中间件:
- 调用
$this->middleware()不影响依赖注入,顺序无关:
public function __construct(PostService $postService)
{
$this->postService = $postService;
$this->middleware('auth')->except(['index', 'show']);
} - 中间件执行时,控制器已完整初始化,注入的服务可随时使用
接口绑定与松耦合(推荐)
若服务基于接口开发(如 PostRepositoryInterface),需在 AppServiceProvider@register() 中显式绑定,否则容器无法解析接口类型:
- 在
app/Providers/AppServiceProvider.php中添加:
$this->app->bind(
PostRepositoryInterface::class,
EloquentPostRepository::class
); - 然后在资源控制器中类型提示接口:
public function __construct(PostRepositoryInterface $posts)
容器将自动返回绑定的实现类实例
避免手动 new 破坏注入
Laravel 6 的服务容器只对路由分发创建的控制器实例生效。以下写法会绕过容器,导致依赖注入失败:
-
错误:在其他地方
new PostController()或app()->make('PostController')(未传参) -
正确:确保始终通过路由访问,或使用
app(PostController::class)(Laravel 6 支持,会触发完整解析) - 若需在命令、事件等非路由场景复用资源控制器逻辑,建议把核心逻辑抽到服务类,而非依赖控制器本身


















