如何通过app->make()向Repository构造函数传递变量?
回答:Laravel容器中使用
app()->make()传递构造参数 当然可以!你尝试的方法本身是可行的,Laravel的服务容器支持在调用make()方法时,通过第二个参数向类的构造函数传递动态参数。下面给你详细拆解具体的实现方式和注意事项:
1. 基础用法(适配你的场景)
你的EloquentTestRepository构造函数只有一个$var参数,以下两种传递方式都能生效:
索引数组传递:按构造函数参数的顺序传入值
app()->make(TestRepository::class, ['test'])->getItem(TestModel::TEST_ITEM);这里数组的第一个元素会直接传给构造函数的
$var参数。关联数组传递:按参数名匹配传入值(更推荐,尤其是参数较多时)
app()->make(TestRepository::class, ['var' => 'test'])->getItem(TestModel::TEST_ITEM);这种方式逻辑更清晰,即使后续调整构造函数的参数顺序,也不会影响参数注入的正确性。
2. 多参数场景的扩展
如果后续你的构造函数增加了混合参数(既有依赖注入的类,又有自定义参数),比如:
class EloquentTestRepository implements TestRepository { public function __construct(SomeService $service, $var, $anotherVar) { // 处理逻辑 } }
此时容器会自动解析SomeService的实例,你只需要传递自定义的参数即可:
app()->make(TestRepository::class, [ 'var' => 'test', 'anotherVar' => 'another value' ]);
3. 绑定阶段预设参数的替代方案
如果你希望在绑定阶段就固定参数(无需每次调用make()时传递),可以在AppServiceProvider的register方法里修改绑定逻辑:
app()->bind(TestRepository::class, function ($app) { // 这里可以动态获取参数,比如从配置、请求中读取 $var = '预设固定值'; return new EloquentTestRepository($var); });
这样后续直接调用app()->make(TestRepository::class)时,会自动使用预设的$var参数。
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

