Laravel解决了闭包的依赖关系

时间:2014-02-14 12:44:50

标签: php dependency-injection laravel

Laravel能够自动在控制器构造等中注入依赖项。 例如:

class Test {
    public function __construct(Request $request) {}
}

App::make('Test');

控制器的构造函数将收到相应的请求外观。

有没有办法用闭包来做到这一点?

例如:

$closure = function(Request $input) {};
App::make($closure); // resolving the closure dependencies

1 个答案:

答案 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基本上是基于类。你的用例是什么?