Laravel能够自动在控制器构造等中注入依赖项。 例如:
class Test {
public function __construct(Request $request) {}
}
App::make('Test');
控制器的构造函数将收到相应的请求外观。
有没有办法用闭包来做到这一点?
例如:
$closure = function(Request $input) {};
App::make($closure); // resolving the closure dependencies
答案 0 :(得分:4)
不,这是不可能的,你可以在这里阅读IoC容器代码:
第laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php
行 466
如您所见,它试图通过反射来解析和解析父类的__constructor
方法。
我认为实现起来会很有趣,因为通过扩展Container
类来支持闭包很有可能。
我做了几个测试以确保它是可能的,所以这里是:
class t4 {
public $x = "inject me";
}
interface t5 {}
$t3 = function(t4 $test) {
return print($test);
};
$r = new ReflectionFunction($t3);
$params = $r->getParameters();
$injection = $params[0]->getClass();
if (!$injection->isInstantiable()) {
throw new Exception('Provided type hint is not instantiable');
}
$typehinted = $injection->newInstance();
print($typehinted->x); // prints "inject me"
类型提示t5将抛出异常。
这回答了问题
有没有办法用闭包来做到这一点?
至于如何实现它,在我看来,你应该完全了解反射和Laravel IoC容器的工作原理。我认为这不会在不久的将来实施,因为Laravel基本上是基于类。你的用例是什么?