如何在Laravel 5.7任务中通过服务容器注入同一类的不同实例
解决Laravel Job中注入不同实例的问题
嘿,这个需求刚好可以用Laravel服务容器的上下文绑定来完美解决,它专门用来处理这种「不同类需要同一类的不同配置实例」的场景。下面一步步来实现:
1. 先修复一个小bug
首先注意你的ShoppingCartApiConsumer构造函数里有个变量引用错误:你直接用了$baseUrl,但它是类的私有属性,应该用$this->baseUrl,不然实例化时会报「Undefined variable」错误。修正后的构造函数如下:
public function __construct(string $apiKey, string $shoppingCartId) { $this->apiUrl = $this->baseUrl . "/shoppingCart/$shoppingCartId"; $this->headers["Authorization"] = "Bearer $apiKey"; }
2. 注册上下文绑定
打开app/Providers/AppServiceProvider.php(或者你专门的服务提供者类),在register方法里添加上下文绑定逻辑。这个逻辑的核心是:当某个Job需要ShoppingCartApiConsumer时,返回对应配置的实例。
use App\Api\Consumers\ShoppingCartApiConsumer; use App\Jobs\PrivateShoppingListConsumer; use App\Jobs\WorkShoppingListConsumer; public function register() { // 为PrivateShoppingListConsumer提供专属的购物车实例 $this->app->when(PrivateShoppingListConsumer::class) ->needs(ShoppingCartApiConsumer::class) ->give(function () { $config = config('shoppingCart'); return new ShoppingCartApiConsumer( $config['api_key'], $config['private_shopping_cart_id'] ); }); // 为WorkShoppingListConsumer提供专属的购物车实例 $this->app->when(WorkShoppingListConsumer::class) ->needs(ShoppingCartApiConsumer::class) ->give(function () { $config = config('shoppingCart'); return new ShoppingCartApiConsumer( $config['api_key'], $config['work_shopping_cart_id'] ); }); }
3. 正常使用Job
现在你不需要手动创建ShoppingCartApiConsumer实例传入Job了,Laravel的服务容器会自动根据上下文注入对应的实例。直接触发Job即可:
// 触发私人购物车的业务Job PrivateShoppingListConsumer::dispatch('milk'); // 触发工作购物车的业务Job WorkShoppingListConsumer::dispatch('computer');
为什么用上下文绑定?
这种方式比手动给实例起别名再注入更直观,完全贴合你的业务场景:两个Job依赖同一个类,但需要不同的配置实例。Laravel的上下文绑定会自动识别当前正在解析的类(也就是Job),然后返回对应的依赖实例,完美符合依赖注入的最佳实践。
内容的提问来源于stack exchange,提问作者Dimitrios Desyllas
相关产品推荐
相关产品推荐

